использование состояния формы->set() внутри обратного вызова ajax, но не может вернуть значение за пределами обратного вызова
Я хочу добавить некоторую произвольную переменную, чтобы сохранить ее в form_state и использовать ее снова, поэтому в одной из моих функций обратного вызова ajax я установил свойство с именем var:
public function MyFunctionCallback(array &$form, FormStateInterface &$form_state) {
....
$terms = array('1'=>'one','2'=>'two');
$form_state->set('var', $terms);
....
}
Это работает, и массив хранения form_state содержит элемент var
К сожалению, при попытке вернуть var обратно в другую функцию обратного вызова он возвращает значение null. на самом деле при отладке массив хранения form_state пуст
public function MyOtherFunctionCallback(array &$form, FormStateInterface &$form_state) {
....
$terms = $form_state->get('var');
....
}
3 answers
Вы не можете изменить $form
или $form_state
в обратном вызове ajax. После обратного вызова больше нет кода, который мог бы это обработать. Единственная цель обратного вызова ajax - подготовить и вернуть ответ ajax.
Как 4k4 упоминалось, вы не можете изменить состояние формы внутри функции обратного вызова ajax.
Однако вы можете изменить его в функции отправки кнопки ajax.
$form['ajax_button']['#submit'][] = [static::class, 'ajaxButtonSubmit'];
public static function ajaxButtonSubmit($form, $form_state) {
//...
}
Я бы хотел избежать использования здесь переменных сеанса PHP, так как их легко смешать с другими формами. Особенно, если пользователь хочет оставить эту форму открытой и попытался открыть другую форму.
Вместо переменных сеанса PHP вы можете попытаться изменить логику и переместить свой код в обратный вызов проверки для всей формы. И оттуда вы можете установить значения состояния формы.
$form['#validate'][] = '::handleInputs';
Поскольку, вероятно, то, что вам нужно, - это часть проверки пользовательских вводов и отображения конкретных параметры зависят от вводимых пользователем данных.