Это можно сделать с помощью реализации обратного вызова 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-адреса обратного вызова). Это автозаполнение возвращает идентификатор объекта, полученный при загрузке объекта, на основе уникальной метки внутри значениеОбратный вызов()
метод, но пользователю по-прежнему предоставляется текстовый ввод (полученный путем возврата $сущность->метка()
внутри процессМойЭлемент()
метод).