#limit_validation_errors => []を指定した場合に、form_state->getValues()で値が取れない場合の対処メモ

  •  
 
ナカちゃん2016年4月18日 - 13:04 に投稿

タグ

いわゆるvalueとinputの違いに関する問題です。 忘れていたり、そもそも知らないと手間取りそうなのでメモしておきます。

前提

  • カスタムフィールドの作成で、「適用」ボタン押下時にyearとmonthの値を利用してajax処理を行うようにformを構成した。
  • ボタン押下時にエラーチェックが走らないよう、#limit_validation_errors => []を設定した。 (下記の様なソース)
public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) {
//*中略*

    $elements['worktime_yearmonth']['year'] = [//ここで選択した値を利用
      '#type' => 'select',
      '#title' => '勤務年',
      '#options' => $this->getYearOptions($oldest_worktime->year, $newest_worktime->year),
    ];

    $elements['worktime_yearmonth']['month'] = [//ここで選択した値を利用
      '#type' => 'select',
      '#title' => '勤務月',
      '#options' => ['' => ''] + Util::getMonthOptions(),
    ];

    $elements['worktime_yearmonth']['apply'] =[//ajax処理を行うためのボタン
      '#type' => 'button',
      '#value' => t('Apply'),
      '#limit_validation_errors' => [],//バリデーション無効化
      '#ajax' => [
        'callback' => [$this, 'loadValue'],
        'wrapper' => $field_name . '-value-wrapper',
      ],
    ];

  $form_field_values = $form_state->getValues();//入力内容を取得

//*中略*

  return $elements;
}

事象

  • 取得できるはずのyearとmonthの値が取れない(要素が存在しない)

原因

  • limit_validation_errorsを指定してバリデーションチェックを無効化していたため。
  • getValues()はサニタイジング(バリデーションチェック)済みの値が乗っかってくるらしい。

対処

  • getUserInput()を使用する。

コメントを追加

プレーンテキスト

  • HTMLタグは利用できません。
  • 行と段落は自動的に折り返されます。
  • ウェブページのアドレスとメールアドレスは自動的にリンクに変換されます。
CAPTCHA
この質問はあなたが人間の訪問者であるかどうかをテストし、自動化されたスパム送信を防ぐためのものです。