Điểm:1

Nhiều hình thức trên trang

lá cờ cn

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'

Trưng bày chức năng

lá cờ cn
Có một `` là HTML không hợp lệ, điều gì xảy ra trong trường hợp đó tùy thuộc vào trình duyệt. Tôi nghĩ rằng tôi đúng khi nói rằng tất cả các trình duyệt hiện đại sẽ chỉ bỏ qua ` bên trong`)
Ex0r avatar
lá cờ cn
VBO không gói bảng trong một biểu mẫu, các chế độ xem sử dụng phương thức viewsForm mà nó hiển thị, do đó, rất có thể sẽ yêu cầu thay đổi cách Chế độ xem hoạt động để thực hiện điều gì đó tương tự.Tôi đã sử dụng form_alter trên biểu mẫu để thay đổi một số nội dung mà VBO thực hiện, nhưng nó thực hiện ở cấp độ chế độ xem chứ không phải cấp độ hàng riêng lẻ, đó là điều tôi cần nó thực hiện.
lá cờ cn
Được rồi, kế hoạch B có lẽ không còn nữa, đó sẽ là một khó khăn để thực hiện lại. Tuy nhiên, cấp độ hàng phải có sẵn vì VBO sử dụng nó - Tôi đoán có một trình xử lý trường sử dụng API của mô-đun để lấy ngữ cảnh biểu mẫu để nó có thể hiển thị hộp kiểm trên mỗi hàng. Có lẽ cách tiếp cận của bạn có thể giống nhau. Bạn cần làm cho chức năng của mình hoạt động trong biểu mẫu VBO và có thể thay đổi xác thực/v.v. của nó, nhưng do bản chất của việc triển khai và những gì HTML cho phép, tôi không chắc giải pháp thay thế sẽ là gì
lá cờ cn
Theo "biểu mẫu VBO", ý tôi là "biểu mẫu mà VBO thuyết phục Chế độ xem tạo thông qua `ViewsBulkOperationsBulkForm::viewsForm`". Tôi chỉ đang xem mã và tôi có thể hiểu tại sao bạn bị mắc kẹt
Ex0r avatar
lá cờ cn
Vâng, có vẻ như những gì chúng tôi đang cố gắng đạt được là không thể. VBO sử dụng viewForm để tạo một thành phần biểu mẫu thuộc loại #checkbox ở vị trí cột mà nó được đặt trong dạng xem, nhưng điều đó không lý tưởng vì đó không phải là điều chúng tôi muốn làm, vì cột dành cho chỉnh sửa nhanh nằm trong một cột hoàn toàn khác, và lý tưởng là sẽ hoạt động độc lập với chức năng hoạt động hàng loạt của chế độ xem.
Ex0r avatar
lá cờ cn
Tôi đã cập nhật câu hỏi của mình để bao gồm ảnh chụp màn hình về những gì chúng tôi đang cố gắng đạt được.
lá cờ cn
Tôi muốn từ bỏ hoàn toàn lộ trình biểu mẫu truyền thống và sử dụng JS để gửi dữ liệu đến một lộ trình trong mô-đun tùy chỉnh của bạn để thực hiện lưu. Trừ khi có điều gì đó rõ ràng mà tôi đang thiếu, nó có vẻ khả thi về mặt kỹ thuật, nhưng có lẽ không đáng để nỗ lực thực hiện theo cách thông thường
Ex0r avatar
lá cờ cn
Tôi không chắc ý của bạn là gì. Tôi chưa từng làm việc với việc gửi biểu mẫu qua Drupal bằng Javascript trước đây. Vì tôi chủ yếu là một nhà phát triển phụ trợ, nên tôi không có nhiều kinh nghiệm với các diễn biến giao diện người dùng của Drupal.
Điểm:0
lá cờ cn

Nếu tôi tắt thao tác hàng loạt lượt xem, thao tác này sẽ hoạt động như dự kiến, nhưng với nhiều biểu mẫu trên trang, tôi không thể tìm ra cách nói nút 'gửi' tôi đang sử dụng để chỉ gửi biểu mẫu thuộc về nút gửi.

Nếu không xem xét toàn bộ mã, nếu bạn có nhiều biểu mẫu Ajax trên một trang, bạn nên sử dụng các khóa biểu mẫu gửi duy nhất giống như cách bạn làm điều này cho trình bao bọc:

$form['quick_edit']['actions']['submit' . $this->sub_id] = [
  ...
  '#ajax' => [
    'gọi lại' => '::quickEditAjax',
    'trình bao bọc' => 'chỉnh sửa nhanh trình bao bọc-'. $this->sub_id,
  ],

Trong trường hợp khác, bạn không thể lồng các biểu mẫu như đã thảo luận trong nhận xét.

Nói chung, bạn cần đặt các thành phần biểu mẫu của mình bên trong biểu mẫu hiện có, sau đó biểu mẫu này có thể thực hiện công việc của riêng chúng bằng cách sử dụng các lệnh gọi lại gửi và ajax và bỏ qua phần còn lại của biểu mẫu. Điều này có thể được thực hiện trong một móc thay đổi dạng đơn giản hoặc một hệ thống phức tạp hơn. Đối với các biểu mẫu thực thể, Drupal có các biểu mẫu con được triển khai trong các plugin tiện ích trường, đối với các plugin trường biểu mẫu hàng loạt Chế độ xem triển khai lượt xemForm($form, $form_state). Nếu bạn sử dụng một trong số đó thì hãy làm theo cách họ làm.

Ex0r avatar
lá cờ cn
Tôi đang sử dụng hook_form_alter ngay bây giờ để thay đổi quy trình làm việc và hoạt động của VBO. Tôi đã cố gắng sử dụng điều đó để thêm các trường trên mỗi hàng riêng lẻ vào biểu mẫu, nhưng nó không đặt chúng vào đúng vị trí cột/trường cần có và cũng không hiển thị tất cả các trường của biểu mẫu. Tôi hiện đang sử dụng plugin trường dạng xem tùy chỉnh để hiển thị các biểu mẫu trong cột bảng chính xác của chúng, nhưng các nút và trình xử lý gửi ajax khi được nhấp thực sự kích hoạt trình xử lý và xác thực gửi vbo. Bạn có liên kết đến tài liệu Drupals cho biểu mẫu con không? Tôi không thể tìm thấy bất cứ điều gì để chứng minh chúng tôi
4uk4 avatar
lá cờ cn
Biểu mẫu con? Chúng được tạo tự động cho các tiện ích trường.Đó sẽ là một cách tiếp cận hoàn toàn khác, không sử dụng biểu mẫu hàng loạt Chế độ xem mà hiển thị các thực thể trong một lưới nơi bạn có thể đính kèm biểu mẫu thực thể cho từng thực thể.
Ex0r avatar
lá cờ cn
Tôi đang sử dụng VBO cho các chức năng khác nhau. Về cơ bản, tôi đang cố gắng tạo hai biểu mẫu khác nhau trên trang. Một để bạn có thể thực hiện các tác vụ nhanh trên từng mục hàng riêng lẻ và một để bạn có thể chọn nhiều hàng và thực hiện các 'hành động hàng loạt' khác nhau trên chúng. Có vẻ như tôi không thể làm những gì mình muốn miễn là các hoạt động hàng loạt lượt xem được thực hiện, điều này thật tệ. Tôi sẽ phải đưa ra một giải pháp khác.
Ex0r avatar
lá cờ cn
Biểu mẫu tôi đang hiển thị ngay bây giờ trên mỗi hàng là trường dạng xem tùy chỉnh sử dụng mã hiển thị ở trên để hiển thị biểu mẫu mới trên mỗi hàng. Plugin trường là trường 'giả mạo' chỉ hiển thị đầu ra và biểu mẫu cho hàng trong cột trường thích hợp trong bảng. Dường như không có cách nào để tạo tiện ích trường dạng xem hoặc nếu có thì tôi đang thiếu nó trong tài liệu.

Đă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.