ฉันมีแบบฟอร์มในหน้าที่อัปเดตฟิลด์เดียวของโหนด แบบฟอร์มนี้ใช้ 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;
}
}