Score:0

รูปแบบ Ajax ฟังก์ชัน ReplaceCommand หยุดทำงานหลังจากเกิดไฟไหม้ครั้งแรก

ธง cn

ฉันมีแบบฟอร์มในหน้าที่อัปเดตฟิลด์เดียวของโหนด แบบฟอร์มนี้ใช้ ajax เพื่ออัปเดตฟิลด์และส่งคืนเอนทิตีที่บันทึกใหม่และแทนที่ HTML ปัจจุบันเพื่อให้ฟิลด์ใหม่แสดงอย่างถูกต้อง

วิธีนี้ใช้ได้ดีในครั้งแรกที่ฟอร์มเริ่มทำงาน แต่จะหยุดทำงานหลังจากนั้นโดยมีข้อผิดพลาดต่อไปนี้ในคอนโซลของฉัน:

เกิดข้อผิดพลาด AJAX HTTP

ไม่มีรายงานข้อผิดพลาดเพิ่มเติมที่จะบอกฉันเพิ่มเติมเกี่ยวกับข้อผิดพลาดนี้

นี่คือรหัสแบบฟอร์มของฉัน:

<?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}
   */
  สร้างฟังก์ชันคงที่สาธารณะ (ContainerInterface $container) {
    // สร้างอินสแตนซ์คลาสฟอร์มนี้
    $instance = parent::create($คอนเทนเนอร์);
    ส่งคืนอินสแตนซ์ $;
  }

  /**
   * {@inheritdoc}
   */
  ฟังก์ชันสาธารณะ buildForm (อาร์เรย์ $form, FormStateInterface $form_state) {
    $node_id = $form_state->getBuildInfo()['args'][0];

    ตัวเอง::$formId = $node_id;
    $application = โหนด :: โหลด ($ node_id);

    $field_definitions = \Drupal::service('entity_field.manager')->getFieldDefinitions('node', 'application');
    ถ้า (isset($field_definitions['field_application_status'])) {
      $status_options = options_allowed_values($field_definitions['field_application_status']->getFieldStorageDefinition());
    }

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

    // รายการเลือกแอปพลิเคชัน
    $แบบฟอร์ม['สถานะ'] = [
      '#type' => 'เลือก',
      '#title' => $this->t('คำร้อง'),
      '#options' => $status_options,
      '#default_value' => $application->get('field_application_status')->getValue()[0]['value'],
      '#อาแจ็กซ์' => [
        'callback' => [$this, 'submitForm'],
        'wrapper' => 'การทำแผนที่',
        'เอฟเฟกต์' => 'จาง',
      ]
    ];

    $form['นิด'] = [
      '#type' => 'ซ่อน',
      '#default_value' => $node_id,
      '#value' => $node_id,
    ];

    คืนฟอร์ม $;
  }

  /**
   * {@inheritdoc}
   */
  ฟังก์ชันสาธารณะ submitForm (อาร์เรย์ &$form, FormStateInterface $form_state) {
    $node_id = $form_state->getValues()['nid'];

    $application = โหนด :: โหลด ($ node_id);

    $application->set('field_application_status', $form_state->getValues()['สถานะ']);
    $application->save();

    $view_builder = \Drupal::entityTypeManager()->getViewBuilder('โหนด');
    $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));
    ส่งคืน $response;
  }

}

4uk4 avatar
cn flag
นี่ไม่ใช่ความคิดที่ดีในการตั้งชื่อ FormInterface::submitForm ของ ajax callback นี่เป็นสองวิธีที่แตกต่างกัน เมื่อคุณระบุ wrapper การเรียกกลับของ ajax จะต้องส่งคืนเนื้อหาใหม่ของ wrapper เท่านั้น วางโค้ดที่เหลือในเมธอด Form API ที่เหมาะสม
Jaypan avatar
de flag
ตามที่ 4x4 กล่าวถึง คุณได้ตั้งค่าการตอบกลับการส่งและการตอบกลับแบบ ajax เป็นฟังก์ชันเดียวกัน - นี่คือปัญหาของคุณ
Kimimaruu avatar
es flag
ขอบคุณสำหรับข้อมูล (ฉันเป็น OP สร้างโพสต์โดยไม่ได้ลงชื่อเข้าใช้...) ฉันได้เปลี่ยนชื่อฟังก์ชันเป็นชื่ออื่นและลบ wrapper ออกเนื่องจากไม่จำเป็นสำหรับการตอบสนองของฉัน สิ่งนี้ไม่ได้แก้ไขข้อผิดพลาดของฉัน หวังว่าคุณจะมีความคิดอื่น ๆ
Jaypan avatar
de flag
คุณต้องตั้งค่าการสร้างใหม่ในตัวจัดการส่งไม่ใช่การโทรกลับ ajax

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา