ฉันกำลังพยายามทำให้หลายรูปแบบทำงานในการแสดงมุมมอง แบบฟอร์มทั้งหมดใช้ AJAX แต่ดูเหมือนจะรบกวนซึ่งกันและกัน
ฟอร์มหนึ่งคือฟอร์ม Views Bulk Operations ที่เปลี่ยนตาราง view เป็น 'viewsForm' แบบฟอร์มที่สองคือแบบฟอร์ม 'แก้ไขด่วน' ที่มีอยู่ในแต่ละแถวในมุมมอง ปัญหาคือเมื่อฉันส่งแบบฟอร์มใด ๆ จากการแก้ไขอย่างรวดเร็ว มันพยายามส่งแบบฟอร์ม 'viewsForm' ด้วย (ซึ่งไม่ควรทำ) ส่งผลให้เกิดข้อผิดพลาดในการตรวจสอบความถูกต้องของแบบฟอร์มนั้น นอกจากนี้ยังไม่รับ ajax callback ของฉันสำหรับแบบฟอร์มที่กำหนดเอง ดังที่เห็นได้จาก 'ajax callback is blank or not callable' ใน dblog
ถ้าฉันปิดใช้งานการดูจำนวนมาก สิ่งนี้จะทำงานตามที่ตั้งใจไว้ แต่ด้วยแบบฟอร์มหลายรายการในหน้านี้ ฉันไม่สามารถหาวิธีบอกปุ่ม 'ส่ง' ที่ฉันใช้เพื่อส่งเฉพาะแบบฟอร์มที่เป็นของปุ่มส่งเท่านั้น
ฉันได้ให้คลาส formbuilder ของฉันสำหรับการอ้างอิง
<?php
เนมสเปซ Drupal\request_system\Form;
ใช้ Drupal\Core\Form\FormBase;
ใช้ Drupal\Core\Form\FormStateInterface;
ใช้ Drupal\Core\Ajax\AjaxResponse;
ใช้ Drupal\Core\Ajax\ReplaceCommand;
ใช้ Drupal\Core\Ajax\HightlightCommand;
/**
* ให้แบบฟอร์มขอระบบ
*/
คลาส QuickEditForm ขยาย FormBase {
สาธารณะ $sub_id = 0;
$entity_id สาธารณะ = 0;
/**
* {@inheritdoc}
*/
ฟังก์ชั่นสาธารณะ getFormId () {
ส่งคืน 'request_system_quick_edit-' $this->sub_id;
}
/**
* {@inheritdoc}
*/
ฟังก์ชันสาธารณะ buildForm (อาร์เรย์ $form, FormStateInterface $form_state) {
$entity = \Drupal::entityTypeManager()->getStorage('lms_request')->load($this->entity_id);
$ตัวเลือก = [];
$options['_none'] = '- เลือกหนึ่งรายการ -';
ถ้า ($entity->bundle() == 'book_request') {
$statuses = \Drupal::entityTypeManager()->getStorage('taxonomy_term')->loadByProperties([
'vid' => 'book_request_status',
]);
}
// แสดงเฉพาะ 'ว่างจากผู้ขาย' และ 'รอดำเนินการ'
foreach (สถานะ $ เป็น $ สถานะ) {
ถ้า ($status->getName() == 'รอดำเนินการ' || $status->getName() == 'มีจำหน่ายจากผู้ขาย') {
$options[$status->id()] = $status->getName();
}
ถ้า ($status->id() == $entity->field_request_status->getString()) {
$options[$status->id()] = $status->getName();
}
}
$แบบฟอร์ม['quick_edit'] = [
'#type' => 'คอนเทนเนอร์',
'#id' => 'แก้ไขด่วน-wrapper-' $this->sub_id,
];
$แบบฟอร์ม['quick_edit']['สถานะ'] = [
'#type' => 'ชุดฟิลด์',
'#title' => 'อัปเดตสถานะ',
'#name' => 'update-wrapper',
];
ถ้า (!$entity->field_aph_shipment_number->isEmpty() || !$entity->field_library_shipment_number->isEmpty()) {
$form['quick_edit']['status']['value'] = [
'#type' => 'รายการ',
'#title' => 'สถานะคำขอ:',
'#markup' => \Drupal::entityTypeManager()->getStorage('taxonomy_term')->load($entity->field_request_status->getString())->getName(),
];
// แสดงข้อความระบุว่าสินค้าเป็นส่วนหนึ่งของการจัดส่ง
$form['quick_edit']['status']['shipment_number'] = [
'#markup' => 'คำขอนี้เป็นส่วนหนึ่งของการจัดส่ง',
];
}
อื่น {
// ปิดใช้งานฟิลด์นี้หากสถานะคำขอไม่ใช่ 'รอดำเนินการ' หรือ 'มีจำหน่ายจากผู้ขาย' หรือหากรายการนั้นเป็นของการจัดส่ง
$form['quick_edit']['status']['value'] = [
'#type' => 'เลือก',
'#title' => 'สถานะ',
'#options' => $ตัวเลือก,
'#default_value' => $entity->field_request_status->getString(),
];
if ($entity->field_request_status->getString() != \Drupal\request_system\Controller\RequestSystemController::getStatus('Pending') && $entity->field_request_status->getString() != \Drupal\request_system\Controller\ RequestSystemController::getStatus('มีจำหน่ายจากผู้ขาย')) {
$form['quick_edit']['status']['value']['#disabled'] = TRUE;
}
}
$แบบฟอร์ม['quick_edit']['สถานะ']['ข้อความ'] = [
'#type' => 'textarea',
'#title' => $this->t('ข้อความ'),
];
$form['quick_edit']['status']['notify_user'] = [
'#type' => 'ช่องทำเครื่องหมาย',
'#title' => 'แจ้งผู้กู้',
];
// อนุญาตให้แก้ไขแค็ตตาล็อก APH #
$form['quick_edit']['อื่นๆ'] = [
'#type' => 'ชุดฟิลด์',
'#title' => 'อื่นๆ',
'#name' => 'other-wrapper',
];
$form['quick_edit']['อื่นๆ']['aph_catalog_number'] = [
'#type' => 'ช่องข้อความ',
'#title' => 'แค็ตตาล็อก APH #',
'#default_value' => $entity->field_attached_copy_aph_number->getString(),
'#description' => $entity->field_attached_copy_main_record->isEmpty() ? '' : 'ไม่สามารถเปลี่ยนหมายเลขแค็ตตาล็อก APH เมื่อกำหนดระเบียนหลัก',
'#disabled' => $entity->field_attached_copy_main_record->isEmpty() ? ผิดถูก,
];
$form['quick_edit']['id'] = [
'#type' => 'ซ่อน',
'#value' => $this->entity_id,
];
$form['quick_edit']['actions'] = [
'#type' => 'การกระทำ',
];
$form['quick_edit']['actions']['submit'] = [
'#type' => 'ส่ง',
'#value' => $this->t('บันทึก'),
'#อาแจ็กซ์' => [
'callback' => '::quickEditAjax',
'wrapper' => 'quick-edit-wrapper-' $this->sub_id,
]
'#validate' => '::ตรวจสอบ',
'#limit_validation_errors' => [['id'],['status']],
'#submit' => ['::quickEditAjaxSubmit'],
];
// $form['quick_edit']['actions']['cancel'] = [
// '#type' => 'ส่ง',
// '#value' => 'ยกเลิก',
// ];
คืนฟอร์ม $;
}
/**
* {@inheritdoc}
*/
ฟังก์ชันสาธารณะ validateForm (อาร์เรย์ &$form, FormStateInterface $form_state) {
$values = $form_state->getValues();
$entity = \Drupal::entityTypeManager()->getStorage('lms_request')->load($values['id']);
ถ้า ($values['status'] == \Drupal\request_system\Controller\RequestSystemController::getStatus("ส่งจากคลังยืม")) {
ถ้า (นับ ($entity->field_imcid->referencedEntities()) == 0) {
$form_state->setErrorByName('status','ไม่สามารถทำเครื่องหมายรายการนี้ที่จัดส่งได้เนื่องจากไม่ได้แนบรายการไลบรารี');
}
}
}
/**
* {@inheritdoc}
*/
ฟังก์ชันสาธารณะ submitForm (อาร์เรย์ &$form, FormStateInterface $form_state) {
}
ฟังก์ชันสาธารณะ quickEditAjax (&$form, FormStateInterface $form_state) {
$values = $form_state->getValues();
ถ้า ($form_state->hasAnyErrors()) {
$แบบฟอร์ม['status_messages'] = [
'#type' => 'status_messages',
'#น้ำหนัก' => -1000,
];
$form['#sorted'] = FALSE;
}
$response = ใหม่ AjaxResponse();
$status = \Drupal::entityTypeManager()->getStorage('taxonomy_term')->load($values['status']);
$response->addCommand(new ReplaceCommand('.request-status-'. $values['id'],$status->getName()));
$response->addCommand(new ReplaceCommand('#quick-edit-wrapper-'. $this->sub_id,$form));
$response->addCommand(new HightlightCommand('#row-'. $values['id']));
ส่งคืน $response;
}
ฟังก์ชันสาธารณะ quickEditAjaxSubmit (&$form, FormStateInterface $form_state) {
$values = $form_state->getValues();
// ก่อนอื่นให้โหลดเอนทิตี
$entity = \Drupal::entityTypeManager()->getStorage('lms_request')->load($values['id']);
$entity->set('field_request_status',$values['สถานะ']);
$entity->save();
$form_state->setRebuild();
}
}
และวิธีที่ฉันแสดงแบบฟอร์มคือผ่าน
$form = \Drupal::classResolver()->getInstanceFromDefinition('Drupal\request_system\Form\QuickEditForm');
$form->sub_id = $entity->id();
$form->entity_id = $entity->id();
$build['form'] = \Drupal::formBuilder()->getForm($form);
ดูเหมือนว่าเมื่อแสดงผลมุมมอง จะรวมแบบฟอร์มทั้งหมดเป็นหนึ่งเดียว ดังนั้นเมื่อคุณคลิก 'บันทึก' บนฟอร์มย่อย จะเป็นการส่งแบบฟอร์มการดำเนินการจำนวนมากของมุมมอง ฉันไม่แน่ใจว่าจะแก้ปัญหานี้อย่างไรหรือหยุดทำสิ่งนี้ได้อย่างไร
ฉันปวดหัวกับเรื่องนี้มาสองสัปดาห์แล้วเพื่อพยายามแก้ไขปัญหานี้ และคิดไม่ออกว่าปัญหาคืออะไร
ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชมอย่างมาก.
แก้ไข: ฉันได้แนบภาพหน้าจอของสิ่งที่เราพยายามทำให้สำเร็จ ช่องทำเครื่องหมายทางซ้ายคือดูการดำเนินการเป็นกลุ่ม แบบฟอร์ม 'แก้ไขด่วน' อยู่ทางขวาสุดผ่าน 'คอลัมน์ตารางที่ขยายได้'