Puncte:0

Funcționalitatea ReplaceCommand din formularul Ajax se întrerupe după primul declanșare

drapel cn

Am un formular pe o pagină care actualizează un singur câmp al unui Nod. Formularul folosește ajax pentru a actualiza câmpul și returnează entitatea nou salvată și înlocuiește HTML-ul curent, astfel încât noul câmp să fie afișat corect.

Acest lucru funcționează bine prima dată când formularul este declanșat, dar se întrerupe după aceea cu următoarea eroare în consola mea:

A apărut o eroare HTTP AJAX

Nu există niciun alt raport de eroare care să-mi spună mai multe despre această eroare.

Iată codul meu formular:

<?php

spațiu de nume Drupal\ats_tweaks\Form;

utilizați Drupal\Core\Form\FormBase;
utilizați Drupal\Core\Form\FormStateInterface;
utilizați Drupal\node\Entity\Node;
utilizați Drupal\Core\Ajax\AjaxResponse;
utilizați Drupal\Core\Ajax\ReplaceCommand;

utilizați Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * Formular de înscriere.
 */
clasa UpdateApplicationStatusForm extinde FormBase {

  /**
   * ID formular.
   *
   * @var șir
   */
  $formId static protejat;

  /**
   * {@inheritdoc}
   */
  funcția publică getFormId() {
    $formId = 'update_application_status_form';
    if (self::$formId) {
      $formId = $formId . '_' . self::$formId;
    }
    returnează $formId;
  }

  /**
   * {@inheritdoc}
   */
  funcția publică statică create(ContainerInterface $container) {
    // Instanțiază această clasă de formulare.
    $instanta = parent::create($container);
    returnare $instanță;
  }

  /**
   * {@inheritdoc}
   */
  funcția publică buildForm(array $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('node', 'application');
    if (isset($field_definitions['field_application_status'])) {
      $status_options = options_allowed_values($field_definitions['field_application_status']->getFieldStorageDefinition());
    }

    $form['#attributes']['id'] = $this->getFormId();

    // Lista de selectare a aplicației.
    $form['status'] = [
      '#type' => 'selectați',
      '#title' => $this->t('Sollicitatiestatus'),
      '#options' => $status_options,
      '#default_value' => $application->get('field_application_status')->getValue()[0]['value'],
      '#ajax' => [
        'callback' => [$this, 'submitForm'],
        'wrapper' => 'mapping',
        'efect' => 'fade',
      ],
    ];

    $form['nid'] = [
      '#type' => 'ascuns',
      '#default_value' => $node_id,
      '#value' => $node_id,
    ];

    returnează $form;
  }

  /**
   * {@inheritdoc}
   */
  funcția publică submitForm(matrice &$form, FormStateInterface $form_state) {
    $node_id = $form_state->getValues()['nid'];

    $application = Node::load($node_id);

    $application->set('field_application_status', $form_state->getValues()['starea']);
    $aplicație->salvare();

    $view_builder = \Drupal::entityTypeManager()->getViewBuilder('node');
    $storage = \Drupal::entityTypeManager()->getStorage('node');
    $nod = $storage->load($node_id);

    $build = $view_builder->view($node, 'teaser');
    $form_state->setRebuild(TRUE);

    $răspuns = AjaxResponse nou();
    $response->addCommand(new ReplaceCommand('#application-' . $node_id, $build));
    returnează $răspuns;
  }

}

4uk4 avatar
drapel cn
Aceasta nu este o idee bună să numiți apelul invers ajax FormInterface::submitForm. Acestea sunt două metode diferite. Când specificați un wrapper, apelul ajax trebuie doar să returneze noul conținut al wrapper-ului. Puneți restul codului în metodele API Form corespunzătoare.
Jaypan avatar
drapel de
După cum a menționat 4x4, ați configurat răspunsul de trimitere și răspunsul ajax ca aceeași funcție - aceasta este problema dvs.
Kimimaruu avatar
drapel es
Mulțumesc pentru intrare, (eu sunt OP. Am creat postarea fără a te conecta...). Am schimbat numele funcției cu ceva diferit și am eliminat wrapper-ul, deoarece acesta nu este necesar pentru răspunsul meu. Totuși, acest lucru nu remediază eroarea mea. Sper că aveți alte idei
Jaypan avatar
drapel de
Trebuie să setați reconstrucția în handler-ul de trimitere, nu în apelarea ajax.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.