Tôi đang cố gắng để nhiều biểu mẫu hoạt động trong màn hình dạng xem. Tất cả các biểu mẫu đều sử dụng AJAX, nhưng chúng dường như can thiệp lẫn nhau.
Một biểu mẫu là biểu mẫu Thao tác hàng loạt lượt xem biến bảng dạng xem thành 'viewsForm'. Biểu mẫu thứ hai là biểu mẫu 'chỉnh sửa nhanh' có sẵn trên mỗi hàng trong dạng xem. Vấn đề là khi tôi gửi bất kỳ biểu mẫu nào từ chỉnh sửa nhanh, nó cũng cố gửi biểu mẫu 'viewsForm' (điều không nên làm), dẫn đến lỗi xác thực trên biểu mẫu đó. Nó cũng không nhận cuộc gọi lại ajax cho biểu mẫu tùy chỉnh của tôi, như được chứng kiến bởi 'cuộc gọi lại ajax trống hoặc không thể gọi được' trong dblog.
Nếu tôi vô hiệu hóa thao tác hàng loạt lượt xem, thao tác này sẽ hoạt động như dự định, nhưng với nhiều biểu mẫu trên trang, tôi không thể tìm ra cách cho biết nút 'gửi' mà tôi đang sử dụng để chỉ gửi biểu mẫu thuộc nút gửi.
Tôi đã cung cấp lớp formbuilder của mình để tham khảo
<?php
không gian tên Drupal\request_system\Form;
sử dụng Drupal\Core\Form\FormBase;
sử dụng Drupal\Core\Form\FormStateInterface;
sử dụng Drupal\Core\Ajax\AjaxResponse;
sử dụng Drupal\Core\Ajax\ReplaceCommand;
sử dụng Drupal\Core\Ajax\HightlightCommand;
/**
* Cung cấp biểu mẫu Hệ thống yêu cầu.
*/
lớp QuickEditForm mở rộng FormBase {
công khai $sub_id = 0;
$entity_id công khai = 0;
/**
* {@inheritdoc}
*/
hàm công khai getFormId() {
trả lại 'request_system_quick_edit-' . $this->sub_id;
}
/**
* {@inheritdoc}
*/
chức năng công khai buildForm(mảng $form, FormStateInterface $form_state) {
$entity = \Drupal::entityTypeManager()->getStorage('lms_request')->load($this->entity_id);
tùy chọn $ = [];
$options['_none'] = '- Chọn một -';
if ($entity->bundle() == 'book_request') {
$statuses = \Drupal::entityTypeManager()->getStorage('taxonomy_term')->loadByProperties([
'vid' => 'book_request_status',
]);
}
// Chỉ hiển thị 'có sẵn từ nhà cung cấp' và 'Đang chờ xử lý'
foreach ($trạng thái là $status) {
if ($status->getName() == 'Đang chờ xử lý' || $status->getName() == 'Có sẵn từ nhà cung cấp') {
$options[$status->id()] = $status->getName();
}
if ($status->id() == $entity->field_request_status->getString()) {
$options[$status->id()] = $status->getName();
}
}
$form['quick_edit'] = [
'#type' => 'thùng chứa',
'#id' => 'chỉnh sửa nhanh-'. $this->sub_id,
];
$form['quick_edit']['status'] = [
'#type' => 'bộ trường',
'#title' => 'Cập nhật trạng thái',
'#name' => 'trình bao bọc cập nhật',
];
if (!$entity->field_aph_shipment_number->isEmpty() || !$entity->field_library_shipment_number->isEmpty()) {
$form['quick_edit']['status']['value'] = [
'#type' => 'mặt hàng',
'#title' => 'Trạng thái yêu cầu: ',
'#markup' => \Drupal::entityTypeManager()->getStorage('taxonomy_term')->load($entity->field_request_status->getString())->getName(),
];
// Hiển thị thông báo cho biết mặt hàng là một phần của lô hàng
$form['quick_edit']['status']['shipment_number'] = [
'#markup' => 'Yêu cầu này là một phần của lô hàng.',
];
}
khác {
// Tắt trường này nếu trạng thái yêu cầu không phải là 'Đang chờ xử lý' hoặc 'Có sẵn từ nhà cung cấp' hoặc nếu mặt hàng thuộc về một lô hàng
$form['quick_edit']['status']['value'] = [
'#type' => 'chọn',
'#title' => 'Trạng thái',
'#options' => $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('Có sẵn từ nhà cung cấp')) {
$form['quick_edit']['status']['value']['#disabled'] = TRUE;
}
}
$form['quick_edit']['status']['message'] = [
'#type' => 'vùng văn bản',
'#title' => $this->t('Tin nhắn'),
];
$form['quick_edit']['status']['notify_user'] = [
'#type' => 'hộp kiểm',
'#title' => 'Thông báo cho Bên vay',
];
// Cho phép chỉnh sửa danh mục APH #
$form['quick_edit']['other'] = [
'#type' => 'bộ trường',
'#title' => 'Khác',
'#name' => 'trình bao bọc khác',
];
$form['quick_edit']['other']['aph_catalog_number'] = [
'#type' => 'trường văn bản',
'#title' => 'Danh mục APH #',
'#default_value' => $entity->field_attached_copy_aph_number->getString(),
'#description' => $entity->field_attached_copy_main_record->isEmpty() ? '' : 'Không thể thay đổi số danh mục APH khi bản ghi chính được chỉ định.',
'#disabled' => $entity->field_attached_copy_main_record->isEmpty() ? SAI ĐÚNG,
];
$form['quick_edit']['id'] = [
'#type' => 'ẩn',
'#value' => $this->entity_id,
];
$form['quick_edit']['actions'] = [
'#type' => 'hành động',
];
$form['quick_edit']['actions']['submit'] = [
'#type' => 'gửi',
'#value' => $this->t('Save'),
'#ajax' => [
'gọi lại' => '::quickEditAjax',
'trình bao bọc' => 'chỉnh sửa nhanh trình bao bọc-'. $this->sub_id,
],
'#validate' => '::validate',
'#limit_validation_errors' => [['id'],['status']],
'#submit' => ['::quickEditAjaxSubmit'],
];
// $form['quick_edit']['actions']['cancel'] = [
// '#type' => 'gửi',
// '#value' => 'Hủy',
// ];
trả về biểu mẫu $;
}
/**
* {@inheritdoc}
*/
hàm công khai validateForm(mảng &$form, FormStateInterface $form_state) {
$values = $form_state->getValues();
$entity = \Drupal::entityTypeManager()->getStorage('lms_request')->load($values['id']);
if ($values['status'] == \Drupal\request_system\Controller\RequestSystemController::getStatus("Shipped From Loan Library")) {
if (count($entity->field_imcid->referencedEntities()) == 0) {
$form_state->setErrorByName('status','Không thể đánh dấu mặt hàng này đã được vận chuyển vì không có mặt hàng thư viện nào được đính kèm.');
}
}
}
/**
* {@inheritdoc}
*/
hàm công khai submitForm(mảng &$form, FormStateInterface $form_state) {
}
chức năng công cộng quickEditAjax(&$form, FormStateInterface $form_state) {
$values = $form_state->getValues();
nếu ($form_state->hasAnyErrors()) {
$form['status_messages'] = [
'#type' => 'tin nhắn_trạng thái',
'#trọng lượng' => -1000,
];
$form['#sorted'] = FALSE;
}
$response = new 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']));
trả lại phản hồi $;
}
chức năng công khai quickEditAjaxSubmit(&$form, FormStateInterface $form_state) {
$values = $form_state->getValues();
// Đầu tiên tải thực thể
$entity = \Drupal::entityTypeManager()->getStorage('lms_request')->load($values['id']);
$entity->set('field_request_status',$values['status']);
$entity->save();
$form_state->setRebuild();
}
}
Và cách tôi hiển thị biểu mẫu là thông qua
$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);
Có vẻ như khi chế độ xem được hiển thị, chế độ xem sẽ kết hợp tất cả các biểu mẫu thành một , vì vậy khi bạn nhấp vào 'Lưu' trên biểu mẫu phụ, chế độ xem thực sự đang gửi biểu mẫu hoạt động hàng loạt của chế độ xem. Tôi không chắc làm thế nào để giải quyết vấn đề này hoặc làm cho nó ngừng làm việc này.
Tôi đã đập đầu vào vấn đề này trong hai tuần để cố gắng giải quyết vấn đề này và không thể tìm ra vấn đề là gì.
Mọi sự trợ giúp sẽ rất được trân trọng.
CHỈNH SỬA: Tôi đã đính kèm ảnh chụp màn hình về những gì chúng tôi đang cố gắng đạt được. Hộp kiểm ở bên trái là thao tác hàng loạt lượt xem, biểu mẫu 'chỉnh sửa nhanh' nằm ở ngoài cùng bên phải thông qua 'cột bảng có thể mở rộng'