Рейтинг:0

Почему форма не сохраняет ценность, созданную во время строительства

флаг sa

Вот форма, использующая DI для $this->entity_type_manager

Также есть переключатель с Ajax (я добавил код, так как это может быть причиной моей проблемы)

класс myForm расширяет FormBase {

  частный ?EntityTypeManagerInterface $entity_type_manager=NULL;

  общедоступная функция __construct (Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager) {

    $this->entity_type_manager=$entity_type_manager;
  }

  общедоступная статическая функция create(ContainerInterface $container) {
    вернуть новую статику(
      $container->получить('entity_type.manager'),
    );
  }

  общедоступная функция buildForm (массив $ form, FormStateInterface $ form_state) {
    // сохраняем значение в $form_state для использования при отправке
    $form_state->set('entity_type_manager', $this->entity_type_manager);
    ...
    // Возможно, проблема в компоненте Ajax
    $ форма ['контейнер'] = [
      '#type' => 'контейнер',
      '#prefix' => '<div id="ajax-wrapper">',
      '#суффикс' => '</div>',
      'мое_радио' => [
        '#type' => 'радио',
        '#options' => ["опция1","опция2"],
        '#required' => ИСТИНА,
        '#default_value' => $type_of_bo,
        '#ajax' => [
          'обратный вызов' => [$this, 'ajaxGetInvestmentHandler'],
          'обертка' => 'ajax-обертка',
          'событие' => 'нажмите ввод',
        ],
      ],
      ...
    ];
  }

  статическая публичная функция ajaxGetInvestmentHandler (массив $ form, FormStateInterface $ form_state) {
    возврат $form['контейнер'];
  }
  
  публичная функция submitForm (массив и $ форма, FormStateInterface $ form_state) {
    // $this->entity_type_manager равен NULL
    // $form_state->get('entity_type_manager') также имеет значение NULL
    ...
  }

  ...
  
}

Как вы можете видеть в представить, $this->entity_type_manager равно NULL и $form_state->получить('entity_type_manager') также NULL.

Что не так?

Jaypan avatar
флаг de
"Как видите" - как мы можем это увидеть? Нет никаких причин, по которым он должен быть нулевым, как вы это определяете?
Baud avatar
флаг sa
Извините, что не достаточно ясно. Я имел в виду, что я сделал несколько тестов для этих значений, и они равны NULL (как показано в комментариях в сообщении). Я согласен, что это не должно быть NULL, но это так... может быть, это исходит от AJAX?
Jaypan avatar
флаг de
Судя по показанному коду, `$this->entity_type_manager` не может быть NULL. Функция submitForm не может быть вызвана без создания экземпляра формы, и форма требует, чтобы переменная была передана ей для создания формы. Вот почему я спрашиваю, как вы определили, что это NULL.
Baud avatar
флаг sa
$this->entity_type_manager также имеет значение NULL в функции проверки...
No Sssweat avatar
флаг ua
Поскольку вы устанавливаете значение null... `$entity_type_manager=NULL;`
Baud avatar
флаг sa
Если я не установлю его в NULL в качестве значения по умолчанию, я получаю `$entity_type_manager не должен быть доступен до инициализации`
Jaypan avatar
флаг de
Тогда это другая проблема.
Рейтинг:2
флаг cn

Как вы можете видеть в сообщении, $this->entity_type_manager имеет значение NULL.

Вам нужно объявить свойство службы защищенный. Частные свойства не могут быть восстановлены. Видеть https://www.drupal.org/docs/drupal-apis/services-and-dependency-injection/dependency-injection-for-a-form#s-considerations-for-dependency-injection

.. и $form_state->get('entity_type_manager') также NULL

Form_state не кэшируется между первой сборкой формы и запросом на отправку. Видеть buildForm: как отличить перезагрузку страницы от обратного вызова ajax?. И когда вы запускаете сборку формы в более поздних запросах Ajax, вы перезаписываете значение состояния формы с помощью NULL.

Baud avatar
флаг sa
Это магия. Вы спасли мой день!!!

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

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