Рейтинг:0

Как я могу изменить поле элемента заказа в зависимости от проверки встроенной формы объекта (IEF)?

флаг fr

Я расширил свой тип элемента заказа дополнительным логическим полем. Прежде чем элемент заказа будет отправлен через «форму редактирования заказа» (/admin/commerce/orders/{order_id}/edit), он должен быть проверен, а логическое поле должно стать «истинным» или остаться «ложным».

«Форма редактирования заказа» содержит несколько встроенных форм сущностей (IEF). Один из IEF обрабатывает позиции заказа. Сначала я добавляю пользовательскую функцию проверки с моим пользовательским модулем:

функция MYMODULE_inline_entity_form_entity_form_alter (массив и $entity_form, FormStateInterface и $form_state)
{
...
array_unshift($entity_form['#element_validate'],'MYMODULE_inline_entity_form_validate_hide_gross_price');
...
}

Пользовательская функция проверки успешно вызывается, и общая бизнес-логика/логика процесса пользовательской функции проверки также работает нормально.

Проблема в том, что я еще не нашел способа установить значение моего логического поля внутри моего типа элемента заказа, в зависимости от проверки IEF. Я попробовал это с $form_state->setValueForElement() Функция API (https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Form%21FormStateInterface.php/function/FormStateInterface%3A%3AsetValueForElement/9.3.x):

function MYMODULE_inline_entity_form_validate_hide_gross_price (массив & $entity_form, FormStateInterface $ form_state) {
...
$form_state->setValueForElement($entity_form["field_MYFIELD_hide_gross_price"]["виджет"]["значение"],["#значение"=> true]);
...
}

я получаю сообщение об ошибке

Это значение должно иметь правильный примитивный тип. Drupal\Core\TypedData\Plugin\DataType\BooleanData: значение

Если я изменю код следующим образом:

$form_state->setValueForElement($entity_form["field_MYFIELD_hide_gross_price"]["виджет"]["значение"]["#значение"], true);

Я получаю ошибку PHP в журналах сторожевого таймера:

TypeError: Аргумент 1 передан Drupal\Core\Form\FormState::setValueForElement() должен иметь тип массив, заданный

Итак, каков правильный синтаксис для установки логического значения поля внутри типа элемента заказа с формой IEF?

Рейтинг:0
флаг fr

Мне подсказали, что я использовал неправильные элементы массива. Итак, это сработало для меня:

function MYMODULE_inline_entity_form_validate_hide_gross_price (массив & $entity_form, FormStateInterface $ form_state) {
...
$form_state->setValueForElement($entity_form["field_MYFIELD_hide_gross_price"]["виджет"]["значение"], true);
...
}

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

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