У меня есть форма на странице, которая обновляет одно поле узла. Форма использует ajax для обновления поля и возвращает вновь сохраненный объект и заменяет текущий HTML, чтобы новое поле отображалось правильно.
Это отлично работает при первом запуске формы, но после этого ломается со следующей ошибкой в моей консоли:
Произошла ошибка HTTP AJAX
Нет никакого дальнейшего отчета об ошибке, который рассказал бы мне больше об этой ошибке.
Вот мой код формы:
<?php
пространство имен Drupal\ats_tweaks\Form;
используйте Drupal\Core\Form\FormBase;
используйте Drupal\Core\Form\FormStateInterface;
используйте Drupal\node\Entity\Node;
используйте Drupal\Core\Ajax\AjaxResponse;
используйте Drupal\Core\Ajax\ReplaceCommand;
используйте Symfony\Component\DependencyInjection\ContainerInterface;
/**
 * Вступительная форма.
 */
класс UpdateApplicationStatusForm расширяет FormBase {
  /**
   * Идентификатор формы.
   *
   * @var строка
   */
  защищенный статический $formId;
  /**
   * {@inheritdoc}
   */
  публичная функция getFormId() {
    $formId = 'update_application_status_form';
    если (я::$formId) {
      $formid = $formid . '_' . я::$formId;
    }
    вернуть $formId;
  }
  /**
   * {@inheritdoc}
   */
  общедоступная статическая функция create(ContainerInterface $container) {
    // Создает экземпляр этого класса формы.
    $экземпляр = родитель::создать($контейнер);
    вернуть $экземпляр;
  }
  /**
   * {@inheritdoc}
   */
  общедоступная функция buildForm (массив $ form, FormStateInterface $ form_state) {
    $node_id = $form_state->getBuildInfo()['args'][0];
    self::$formId = $node_id;
    $application = Node::load($node_id);
    $field_definitions = \Drupal::service('entity_field.manager')->getFieldDefinitions('узел', 'приложение');
    если (isset($field_definitions['field_application_status'])) {
      $status_options = options_allowed_values($field_definitions['field_application_status']->getFieldStorageDefinition());
    }
    $form['#attributes']['id'] = $this->getFormId();
    // Список выбора приложения.
    $ форма ['статус'] = [
      '#тип' => 'выбрать',
      '#title' => $this->t('Статус запроса'),
      '#options' => $status_options,
      '#default_value' => $application->get('field_application_status')->getValue()[0]['value'],
      '#ajax' => [
        'обратный вызов' => [$this, 'submitForm'],
        'обертка' => 'сопоставление',
        'эффект' => 'исчезновение',
      ],
    ];
    $ форма ['нид'] = [
      '#type' => 'скрытый',
      '#default_value' => $node_id,
      '#значение' => $node_id,
    ];
    вернуть $ форму;
  }
  /**
   * {@inheritdoc}
   */
  публичная функция submitForm (массив и $ форма, FormStateInterface $ form_state) {
    $node_id = $form_state->getValues()['nid'];
    $application = Node::load($node_id);
    $application->set('field_application_status', $form_state->getValues()['status']);
    $приложение->сохранить();
    $view_builder = \Drupal::entityTypeManager()->getViewBuilder('node');
    $storage = \Drupal::entityTypeManager()->getStorage('узел');
    $node = $storage->load($node_id);
    $build = $view_builder->view($node, 'тизер');
    $form_state->setRebuild(ИСТИНА);
    $response = новый AjaxResponse();
    $response->addCommand(new ReplaceCommand('#application-' . $node_id, $build));
    вернуть $ответ;
  }
}