web-dev-qa-db-ja.com

$ form_stateのフォーム要素の設定値が機能しない

フォーム上のいくつかのフォーム要素の以前の値を追跡して、ページの他のいくつかのオプションを無効にするように変更された場合を検出する必要があります。基本的に、これらのフィールドの値が変更された場合は、改ページ調整を制御するフィールドをリセットする必要があります。

私はこれでこれを達成しようとしています:

_$values = $form_state->getValues();
$form['element1'] = [
      '#type' => 'radios',
      '#title' => $this->t('Element 1'),
      '#options' => [
        // Omitted for brevity
      ],
      '#weight' => '0',
      '#ajax' => [
        'callback' => [$this, 'my_callback'],
        'disable-refocus' => true
      ]
    ];

// dump($values['element1']);
$form['element1_previous'] = [
      '#type' => 'value',
      '#value' => (isset($values['element1'])) ? $values['element1'] : 'none',
    ];
_

私が何をしても、_$values['element1_previous_]の値はnoneです。直前にdump()ステートメントのコメントを外すと、_$values['element1']_の値がAJAXが送信されるたびに変化するので、値がそこにあることがわかります。

私が次のようなことをした場合:

_$form['element1_previous'] = [
          '#type' => 'value',
          '#value' => Rand()
        ];
_

_$values['element1_previous']_がそれぞれ異なる整数に設定されているのを見ることができますAJAX送信。_$form['element1']_の値をそのフィールドに割り当てることができません。

何が悪いのですか?これを処理できるより良い方法はありますか?

2
Vecta

この:

(isset($values['element1']))

フォーム要素が存在するため、常にTRUEを返します。したがって、値は常に送信ハンドラに渡されます値が空の場合でも

あなたはおそらくこれを望みます:

!empty($values['element1'])
1
Jaypan