Рейтинг:0

Функциональность ReplaceCommand формы Ajax прерывается после первого запуска

флаг cn

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

}

4uk4 avatar
флаг cn
Это не очень хорошая идея называть обратный вызов ajax FormInterface::submitForm. Это два разных метода. Когда вы указываете оболочку, обратный вызов ajax должен возвращать только новое содержимое оболочки. Поместите остальную часть кода в соответствующие методы Form API.
Jaypan avatar
флаг de
Как упоминалось в 4x4, вы настроили свой ответ на отправку и ответ ajax как одну и ту же функцию - это ваша проблема.
Kimimaruu avatar
флаг es
Спасибо за вклад (я ОП. создал сообщение без входа в систему ...). Я изменил имя функции на другое и удалил оболочку, так как это не нужно для моего ответа. Однако это не исправляет мою ошибку. Надеюсь, у вас есть другие идеи
Jaypan avatar
флаг de
Вам нужно установить перестройку в обработчике отправки, а не в обратном вызове ajax.

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

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