Điểm:0

Biểu mẫu Ajax Chức năng ReplaceCommand bị hỏng sau lần kích hoạt đầu tiên

lá cờ cn

Tôi có một biểu mẫu trên trang cập nhật một trường duy nhất của ứng dụng Node. Biểu mẫu sử dụng ajax để cập nhật trường và trả về thực thể mới được lưu, đồng thời thay thế HTML hiện tại để trường mới hiển thị chính xác.

Điều này hoạt động tốt trong lần đầu tiên biểu mẫu được kích hoạt, nhưng sau đó bị hỏng với lỗi sau trong bảng điều khiển của tôi:

Đã xảy ra lỗi AJAX HTTP

Không có thêm báo cáo lỗi nào có thể cho tôi biết thêm về lỗi này.

Đây là mã mẫu của tôi:

<?php

không gian tên Drupal\ats_tweaks\Form;

sử dụng Drupal\Core\Form\FormBase;
sử dụng Drupal\Core\Form\FormStateInterface;
sử dụng Drupal\node\Entity\Node;
sử dụng Drupal\Core\Ajax\AjaxResponse;
sử dụng Drupal\Core\Ajax\ReplaceCommand;

sử dụng Symfony\Thành phần\DependencyInjection\ContainerInterface;

/**
 * Hình thức giới thiệu.
 */
lớp UpdateApplicationStatusForm mở rộng FormBase {

  /**
   * Biểu mẫu ID.
   *
   * chuỗi @var
   */
  $formId tĩnh được bảo vệ;

  /**
   * {@inheritdoc}
   */
  hàm công khai getFormId() {
    $formId = 'update_application_status_form';
    nếu (bản thân::$formId) {
      $formId = $formId . '_' . bản thân::$formId;
    }
    trả về $formId;
  }

  /**
   * {@inheritdoc}
   */
  tạo hàm tĩnh công khai (ContainerInterface $container) {
    // Khởi tạo lớp biểu mẫu này.
    $instance = parent::create($container);
    trả lại cá thể $;
  }

  /**
   * {@inheritdoc}
   */
  chức năng công khai buildForm(mảng $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();

    // Danh sách chọn ứng dụng.
    $form['status'] = [
      '#type' => 'chọn',
      '#title' => $this->t('Sollicitatatiestatus'),
      '#options' => $status_options,
      '#default_value' => $application->get('field_application_status')->getValue()[0]['value'],
      '#ajax' => [
        'callback' => [$this, 'submitForm'],
        'trình bao bọc' => 'ánh xạ',
        'hiệu ứng' => 'mờ dần',
      ],
    ];

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

    trả về biểu mẫu $;
  }

  /**
   * {@inheritdoc}
   */
  hàm công khai submitForm(mảng &$form, FormStateInterface $form_state) {
    $node_id = $form_state->getValues()['nid'];

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

    $application->set('field_application_status', $form_state->getValues()['status']);
    $application->save();

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

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

    $response = new AjaxResponse();
    $response->addCommand(new ReplaceCommand('#application-' . $node_id, $build));
    trả lại phản hồi $;
  }

}

4uk4 avatar
lá cờ cn
Đây không phải là một ý tưởng hay khi đặt tên cho cuộc gọi lại ajax FormInterface::submitForm. Đây là hai phương pháp khác nhau. Khi bạn chỉ định một trình bao bọc, lệnh gọi lại ajax chỉ cần trả về nội dung mới của trình bao bọc. Đặt phần còn lại của mã vào các phương thức API Biểu mẫu thích hợp.
Jaypan avatar
lá cờ de
Như 4x4 đã đề cập, bạn đã thiết lập phản hồi gửi và phản hồi ajax của mình dưới dạng cùng chức năng - đây là vấn đề của bạn.
Kimimaruu avatar
lá cờ es
Cảm ơn về thông tin đầu vào, (Tôi là OP. đã tạo bài đăng mà không cần đăng nhập...). Tôi đã thay đổi tên hàm thành tên khác và xóa trình bao bọc vì điều này không cần thiết cho phản hồi của tôi. Tuy nhiên, điều này không khắc phục được lỗi của tôi. Hy vọng bạn có một số ý tưởng khác
Jaypan avatar
lá cờ de
Bạn cần đặt bản dựng lại trong trình xử lý gửi chứ không phải lệnh gọi lại ajax.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.