いわゆる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()を使用する。
- 閲覧数 71
コメントを追加