フォームの送信時に追加のフォームフィールドを取得できません

dsolemorera

自動生成された基本フォームクラスは次のとおりです。

abstract class BaseGestorForm extends BaseFormDoctrine {
    public function setup() {
        $this->setWidgets(array(
            'persona_fk' => new sfWidgetFormInputHidden(),
            'unitat_fk'  => new sfWidgetFormInputHidden(),
            'baixa'      => new sfWidgetFormDateTime(),
        ));
        $this->setValidators(array(
            'persona_fk' => new sfValidatorChoice(array('choices' => array($this->getObject()->get('persona_fk')), 'empty_value' => $this->getObject()->get('persona_fk'), 'required' => false)),
            'unitat_fk'  => new sfValidatorChoice(array('choices' => array($this->getObject()->get('unitat_fk')), 'empty_value' => $this->getObject()->get('unitat_fk'), 'required' => false)),
            'baixa'      => new sfValidatorDateTime(array('required' => false)),
            ));  
        $this->widgetSchema->setNameFormat('gestor[%s]');
        $this->errorSchema = new sfValidatorErrorSchema($this->validatorSchema);   
        $this->setupInheritance();
        parent::setup();
    }

    public function getModelName() {
        return 'Gestor';
    }
}    

フォームに2つのフィールド(totes_unitatsunitats_a_gestionarを追加しました最初のフィールドは、ユーザーが1つ以上の選択肢を選択するドロップダウンリストであり、ユーザーがボタンを押すとjqueryを使用して、選択したオプションがunitats_a_gestionarドロップダウンリストに追加されます。同時に、これらのオプションはtotes_unitatsリストから削除されます。

class GestorForm extends BaseGestorForm {   
    public function configure() {
        unset($this['baixa']);

        $this->widgetSchema['persona_fk'] = new sfWidgetFormChoice(array(
            'choices' => UsuariLdap::getAllUsuaris()
        ));

        $this->widgetSchema['totes_unitats'] = new sfWidgetFormChoice(array(
            'choices' => UnitatTable::findAllUnitatsPerOrdreArray(),
            'multiple' => true
        ));

        $this->widgetSchema['unitats_a_gestionar'] = new sfWidgetFormChoice(array(
            'choices' => array(),
            'multiple' => true
        ));

        $this->widgetSchema->setLabels(array(
            'persona_fk' => 'Gestor',
            'unitat_fk' => 'Unitat',
            'totes_unitats' => 'Totes les unitats',
            'unitats_a_gestionar' => 'Unitats a gestionar'
        ));

        $this->validatorSchema->setOption('allow_extra_fields', true);

        $this->validatorSchema['persona_fk'] = new sfValidatorString(array('required' => true), array('required' => 'Requerit'));
    }   
}    

問題が見つかったのはアクションファイルです。まずexecuteNouGestor、フォームをレンダリングするメソッドを呼び出します次に、ユーザーがを押して続行し、Gestorオブジェクトを作成executeValidaGestorすると、フォームを検証する呼び出しが行われます。この最後のメソッドはprocessFormGestorunitats_a_gestionar余分なフィールドを取得する方法がない場合に呼び出します。

public function executeNouGestor(sfWebRequest $request) {
    $this->gestorForm = new GestorForm();
}

public function executeValidaGestor(sfWebRequest $request) {
    $this->forward404Unless($request->isMethod(sfRequest::POST));
    $this->gestorForm = new GestorForm();   
    $this->processFormGestor($request, $this->gestorForm);
    $this->setTemplate('nouGestor');
}

protected function processFormGestor(sfWebRequest $request, sfForm $gestorForm) {
    $gestorForm->bind($request->getParameter($gestorForm->getName()), $request->getFiles($gestorForm->getName()));
    if ($gestorForm->isValid()) { 
        var_dump($_POST);
        var_dump($request->getParameterHolder()->getAll());
        ...
    }
}

これらの2つのvar_dumpは、次の情報を表示します。

var_dump($ _ POST):

array(2) {
  ["gestor"]=>
  array(2) {
    ["persona_fk"]=>
    string(3) "330"
    ["_csrf_token"]=>
    string(32) "91e18aa0570bfc7558d21ebb4b98f512"
  }
  ["Desar"]=>
  string(5) "Desar"
}

var_dump($ request-> getParameterHolder()-> getAll()):

array(4) {
  ["gestor"]=>
  array(2) {
    ["persona_fk"]=>
    string(3) "330"
    ["_csrf_token"]=>
    string(32) "91e18aa0570bfc7558d21ebb4b98f512"
  }
  ["Desar"]=>
  string(5) "Desar"
  ["module"]=>
  string(13) "administracio"
  ["action"]=>
  string(12) "validaGestor"
}

したがって、ご覧のとおり、["gestor"]トラックtotes_unitatsunitats_a_gestionar追加のフォームフィールドもありません理由がわかりません。テンプレートにフォームフィールドを表示する方法は、通常どおりです。

<?php echo $gestorForm['persona_fk']->renderLabel(); ?>
<div class="input"><?php echo $gestorForm['persona_fk']->render(); ?></div>
<div class="error-input"><?php echo $gestorForm['persona_fk']->renderError(); ?></div>

<?php echo $gestorForm['totes_unitats']->renderLabel(); ?>
<div class="input multiple"><?php echo $gestorForm['totes_unitats']->render(); ?></div>
<div class="error-input"><?php echo $gestorForm['totes_unitats']->renderError(); ?></div>

<?php echo $gestorForm['unitats_a_gestionar']->renderLabel(); ?>
<div class="input multiple"><?php echo $gestorForm['unitats_a_gestionar']->render(); ?></div>
<div class="error-input"><?php echo $gestorForm['unitats_a_gestionar']->renderError(); ?></div>

また、複数選択した2つのドロップダウンリスト間で追加または削除されたオプションを管理するjqueryコードを追加します。

function afegirTreureUnitats() {
  var boto_afegir = $("#btn-multiple-afegir");
  var boto_treure = $("#btn-multiple-treure");
  boto_afegir.click(function() {
    var selectedItems = $("#gestor_totes_unitats option:selected");
    var output = [];
    $.each(selectedItems, function(key, e)
    {
      output.push('<option value="' + e.value + '">' + e.text + '</option>');

    });
    $("#gestor_unitats_a_gestionar").append(output.join(""));
    ordenaOptionsSelect("gestor_unitats_a_gestionar");
    selectedItems.remove();
  });  
  boto_treure.click(function() {
    var selectedItems = $("#gestor_unitats_a_gestionar option:selected");
    var output = [];
    $.each(selectedItems, function(key, e)
    {
      output.push('<option value="' + e.value + '">' + e.text + '</option>');
    });
    $("#gestor_totes_unitats").append(output.join(""));
    ordenaOptionsSelect("gestor_totes_unitats");
    selectedItems.remove();
  });
}

function ordenaOptionsSelect(idSelect)
{
  var options = $('#' + idSelect + ' option');
  options.sort(function(a, b)
  {
    if (a.text > b.text)
      return 1;
    else if (a.text < b.text)
      return -1;
    else
      return 0;
  });
  $('#' + idSelect).empty().append(options);
}

$(document).ready(function() {
  afegirTreureUnitats();
});

レンダリングされたフォームの外観は次のとおりです。

https://drive.google.com/file/d/0B0Mz720p9Q_DN1RnYWIyR0pXOTQ/edit?usp=sharing

私も奇妙な事実を見つけました。ドロップダウンリストでオプションの1つを選択した場合、totes_unitatsまたはunitats_a_gestionarそれらはPOSTメソッドを介して送信されますが、1つだけです(複数選択した場合、選択したオプションの1つしか取得できません)。

Michal Trojanowski

あなたが使用する場合<select>、またはフォーム上の要素を<input>タイプするradioか、checkboxフィールドが選択されたいずれかのオプションを持っている場合にのみ、フォーム送信にその値を送信するブラウザ。

<select>タグ内のオプションのリストはサーバーに返送されません。実際に選択されているオプションの値のみ。

あなたは2つの方法であなたの問題を解決することができます:

  1. フォームを送信する直前にフォームを変更し、両方のリストのすべてのアイテムを選択するJSを作成します。このようにして、フォームは値を送信し、サーバー側でそれらを操作できるようになります。

  2. 他のオプションは、オプションのリストを保持し、これらのリストを<select>フィールドと一緒に変更する2つの非表示フィールドを追加することです。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

送信時にHTMLフォームからjQueryの値を取得できません

分類Dev

symfony:フォームに1ページに2つのフォームを持つ追加のフィールドを含めることはできません

分類Dev

Angular 2:リアクティブフォームのフォーム配列にフォームグループを追加できません

分類Dev

エラーの取得フォームの送信時に/ public / register-controllerをPOSTできません

分類Dev

Javascriptは、空のフィールド検証でフォームを送信できません

分類Dev

フォーム送信時にinputType = 'file'データを取得できません

分類Dev

フォームの隠しフィールドを設定できません

分類Dev

React-フォーム内のテキストフィールドの最新の値を取得できません

分類Dev

メールの検証時にフォームの送信を停止できません

分類Dev

フォーム送信時のデフォルトを防ぐことはできません| Vue 3

分類Dev

フォームフィールドの値は更新時に送信されません

分類Dev

ロード時にms-accessユーザーフォームのすべてのフィールドを無効にできません

分類Dev

Codeigniter でのフォームの送信に失敗した後、フォームの値を保持できません

分類Dev

AngularJSのフォームをサーバーに送信できません

分類Dev

単一のフォーム送信で20を超えるファイルタイプフィールドを送信できませんか?

分類Dev

単一のフォーム送信で20を超えるファイルタイプフィールドを送信できませんか?

分類Dev

reactjsフォームの入力フィールドにテキストを提供できません

分類Dev

ブートストラップカスタム検証は、フォームの送信時に特定のフィールドを表示しません

分類Dev

入力フィールドの値の変更時にフォームを送信

分類Dev

角度 js を使用して動的に追加されたフォーム フィールドを削除できません

分類Dev

春のフォームを送信できません

分類Dev

WordPressページのフォームに送信ボタンの機能を動的に追加できません

分類Dev

enctype = multipart / form-dataを使用しているときにフォームフィールドの値を取得できません:javaサーブレット

分類Dev

jQueryは追加のフォームフィールドを送信します

分類Dev

送信時に特定のフォームフィールドを削除する

分類Dev

Xamarinフォームファイルの場所を取得できません

分類Dev

AMPでのフォーム送信時に確認エラーを表示できません

分類Dev

フォーム送信時に非表示フィールドにフォームフィールド値を一緒に追加する(jsまたはjquery)

分類Dev

PHPでフォームの値を取得できません

Related 関連記事

  1. 1

    送信時にHTMLフォームからjQueryの値を取得できません

  2. 2

    symfony:フォームに1ページに2つのフォームを持つ追加のフィールドを含めることはできません

  3. 3

    Angular 2:リアクティブフォームのフォーム配列にフォームグループを追加できません

  4. 4

    エラーの取得フォームの送信時に/ public / register-controllerをPOSTできません

  5. 5

    Javascriptは、空のフィールド検証でフォームを送信できません

  6. 6

    フォーム送信時にinputType = 'file'データを取得できません

  7. 7

    フォームの隠しフィールドを設定できません

  8. 8

    React-フォーム内のテキストフィールドの最新の値を取得できません

  9. 9

    メールの検証時にフォームの送信を停止できません

  10. 10

    フォーム送信時のデフォルトを防ぐことはできません| Vue 3

  11. 11

    フォームフィールドの値は更新時に送信されません

  12. 12

    ロード時にms-accessユーザーフォームのすべてのフィールドを無効にできません

  13. 13

    Codeigniter でのフォームの送信に失敗した後、フォームの値を保持できません

  14. 14

    AngularJSのフォームをサーバーに送信できません

  15. 15

    単一のフォーム送信で20を超えるファイルタイプフィールドを送信できませんか?

  16. 16

    単一のフォーム送信で20を超えるファイルタイプフィールドを送信できませんか?

  17. 17

    reactjsフォームの入力フィールドにテキストを提供できません

  18. 18

    ブートストラップカスタム検証は、フォームの送信時に特定のフィールドを表示しません

  19. 19

    入力フィールドの値の変更時にフォームを送信

  20. 20

    角度 js を使用して動的に追加されたフォーム フィールドを削除できません

  21. 21

    春のフォームを送信できません

  22. 22

    WordPressページのフォームに送信ボタンの機能を動的に追加できません

  23. 23

    enctype = multipart / form-dataを使用しているときにフォームフィールドの値を取得できません:javaサーブレット

  24. 24

    jQueryは追加のフォームフィールドを送信します

  25. 25

    送信時に特定のフォームフィールドを削除する

  26. 26

    Xamarinフォームファイルの場所を取得できません

  27. 27

    AMPでのフォーム送信時に確認エラーを表示できません

  28. 28

    フォーム送信時に非表示フィールドにフォームフィールド値を一緒に追加する(jsまたはjquery)

  29. 29

    PHPでフォームの値を取得できません

ホットタグ

アーカイブ