Рейтинг:-2

Custom textfield element, different $form_state value and element '#value' value

флаг cn

I have a textfield element (named 'bus_station'), which holds a bus station name.

I am looking for a way to create a custom 'bus_station' element (possibly extending Textfield class), which would:

  • Still expect a text input in form of bus station name (and retain it during $form_state->setRebuild() and show it to user), but
  • In $form_value, after form submit, either provide a FALSE (custom code in Element definition doesn't recognize input as a station) or TRUE (it does recognize a station)? Or Entity ID (ID of a matched bus station) and/or NULL (no match)?
Рейтинг:0
флаг cn

Это можно сделать с помощью реализации обратного вызова Form API:

Внутри модуль/SRC/Элемент/ElementClass.php, в публичная функция getInfo() {} определить обратный вызов, например. процессМойЭлемент под '#процесс' ключ:

публичная функция getInfo() {
  $класс = статический::класс;
  возвращаться [
    // [...] Некоторые другие определения.
    '#процесс' => [
      [$класс, 'процессМойЭлемент'],
    ],
  ];
}

Затем выполните две взаимодополняющие операции.

(1) Обработать пользовательский ввод и вернуть значение, которое будет предоставлено в '#form_state' значения в значениеОбратный вызов() метод:

общедоступная статическая функция valueCallback(&$element, $input, FormStateInterface $form_state) {
  $output = parent::valueCallback($element, $input, $form_state);
  если ($ input == 'ЧТО-ТО') {
    $output = 'ЧТО-ТО_ЕЩЕ';
  }
  вернуть $ выход;
}

(2) И наоборот, в процессМойЭлемент() метод возвращает исходное значение:

общедоступная статическая функция processMyElement(&$element, FormStateInterface $form_state, &$complete_form) {
  если ($элемент['#значение'] == 'ЧТО-ТО_ДРУГОЕ') {
    $element['#value'] = 'ЧТО-ТО';
  }
  вернуть $элемент;
}

Пример использования

Я использовал это, чтобы расширить Drupal\Core\Render\Element\Textfield class в сочетании с JS Storage Complete. Это дает мне автозаполнение (без необходимости URL-адреса обратного вызова). Это автозаполнение возвращает идентификатор объекта, полученный при загрузке объекта, на основе уникальной метки внутри значениеОбратный вызов() метод, но пользователю по-прежнему предоставляется текстовый ввод (полученный путем возврата $сущность->метка() внутри процессМойЭлемент() метод).

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.