У меня есть форма на странице, которая обновляет одно поле узла. Форма использует 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));
вернуть $ответ;
}
}