Điểm:1

Làm cách nào để lọc tự động hoàn thành trên trường phụ thuộc?

lá cờ km

Mục tiêu - Làm cách nào để lọc tự động hoàn thành dựa trên trường liên quan? Trong miền này, một tổ chức được chọn và khi đó tính năng tự động hoàn thành chỉ cho phép các mục do tổ chức đó tạo được chọn.

Việc thiết lập bao gồm một

  • biểu mẫu thực thể nội tuyến để chọn tổ chức. Đây là trường kích hoạt.
  • trường tự động hoàn thành để chọn một trái phiếu có liên quan của tổ chức đó

Yếu tố kích hoạt được gọi là 'nhà phát hành'. Đây là cấu trúc biểu mẫu:

Cấu trúc biểu mẫu IEF của tổ chức phát hành

Cấu trúc trường tự động hoàn thành trong biểu mẫu là:

Giao dịch Cơ cấu hình thức trái phiếu

Quên về cách ajax được kích hoạt khi biểu mẫu thực thể nội tuyến hoàn thành là một vấn đề khác. Tôi có một hệ thống trong đó danh sách lựa chọn giả mạo/kích hoạt được thay đổi dựa trên trình quan sát đột biến kích hoạt ajax. Tôi đã điều tra việc cố gắng xâu chuỗi sự kiện, cố gắng áp dụng ajax cho phần tử biểu mẫu thực thể nội tuyến và cố gắng gọi ajax bằng cách sử dụng drupal.ajax.

Làm cách nào để đặt id giá trị bộ lọc. Tôi có thể thấy 2 cách, cách rõ ràng nhất là chuyển tham số #filter tới #selection_settings

$form['field_para_deal_information']['widget'][0]['subform']['field_deal_reference_bond']['#selection_settings'] = [
  'đích_gói' => ['đậu'],
  'filter' => ['field_bond_issuer' => $issuer_id],
];

Tôi có thể thấy giá trị được đặt trong phần tử #prefix trên biểu mẫu sau khi chạy ajax

$form['field_para_deal_information']['widget'][0]['subform']['field_deal_reference_bond']['#prefix'] = 'thử nghiệm thêm nội dung: id nhà phát hành' . $issuer_id;
trả về $form['field_para_deal_information']['widget'][0]['subform']['field_deal_reference_bond'];

Giao diện trường:

nhập mô tả hình ảnh ở đây

Html

<input data-drupal-selector="edit-field-para-deal-information-0-subform-field-deal-reference-bond-0-target-id" aria-describedby="edit-field-para-deal-information-0-subform-field-deal-reference-bond-0-target-id--_drZ4Yf-StI--description" class="form-autocomplete form-text ui-autocomplete-input" data-autocomplete-path="/entity_reference_autocomplete/node/default%3Anode_by_issuer/tT7cuAtHgjMlRrK6OypcvFEJNTvFEDSmFImi6iBhNNw" type="text" id="edit-field-para-deal-information-0-subform-field-deal-reference-bond-0-target-id--_drZ4Yf-StI" name="field_para_deal_information[0][subform][field_deal_reference_bond][0][target_id]" value="" size="60" maxlength="1024" placeholder="" autocomplete="off">

Cho thấy rằng default:node_by_issuer được đặt trong hàm ajax (đầy đủ):

function cbi_deal_id_handle_ajax(mảng &$form, FormStateInterface $form_state) {
  $issuer_para_field = $form_state->getValue('field_para_issuer_information');
  $issuer_field = $issuer_para_field[0]['subform']['field_bond_issuer'];
  $issuer_field_value = $issuer_field['target_id'];
  $issuer_id = phát nổ (':', $issuer_field_value)[1];


  $form['field_para_deal_information']['widget'][0]['subform']['field_deal_reference_bond']['#selection_handler'] = 'default:node_by_issuer';
  $form['field_para_deal_information']['widget'][0]['subform']['field_deal_reference_bond']['#selection_settings'] = [
'đích_gói' => ['đậu'],
'filter' => ['field_bond_issuer' => $issuer_id],
  ];

 $form['field_para_deal_information']['widget'][0]['subform']['field_deal_reference_bond']['#prefix'] = 'thử nghiệm thêm nội dung: id nhà phát hành' . $issuer_id;
 trả về $form['field_para_deal_information']['widget'][0]['subform']['field_deal_reference_bond'];
 }

Tôi phá vỡ tại Đánh giá tại /web/core/lib/Drupal/Core/Render/Element/FormElement.php dòng 187 và xác nhận biến bộ lọc không được đặt.

Có vẻ như trường tự động hoàn thành không được cập nhật với các cài đặt liên quan đến chức năng tự động hoàn thành. Nếu tôi đặt ajax để cập nhật biểu mẫu với

['#selection_handler'] = 'mặc định:node_by_tester';

không có thay đổi nào đối với trình xử lý trong trình kết xuất lõi. Giá trị được đặt bởi biểu mẫu ban đầu thay đổi vẫn còn (node_by_issuer).

Thay đổi biểu mẫu ajax, với gói div để kiểm tra xem id trình bao bọc biểu mẫu có mã băm ở cuối có tạo ra bất kỳ sự khác biệt nào không

function cbi_deal_id_field_widget_entity_reference_paragraphs_form_alter(&$element, &$form_state, $context) {
  if ($element['#paragraph_type'] == 'thông tin_giao dịch') {
    $items = $context['items'];
    $bond = $items->getParent()->getEntity();
    $element['subform']['field_deal_reference_bond']['widget'][0]['target_id']['#selection_handler'] = 'default:node_by_issuer';
    $element['subform']['field_deal_reference_bond']['#prefix'] = '<div id="test-wrapper">';
    $element['subform']['field_deal_reference_bond']['#suffix'] = '</div>';

    $element['subform']['ajax_trigger_button'] = [
      '#type' => 'chọn',
      '#ajax' => [
        'gọi lại' => 'cbi_deal_id_handle_ajax',
        'sự kiện' => 'làm mờ',
        'trình bao bọc' => 'trình bao bọc thử nghiệm',
        'tiến độ' => [
          'gõ' => 'đập',
          'message' => t('Đang tải chi tiết nhà phát hành ...'),
         ],
      ],
     '#options' => [
      '1' => t('Một'),
      '2' => t('Hai'),
      '3' => t('Ba'),
     ],
   ];

  if ($bond->isNew()) {
    trở lại;
  }
...

Để lọc dữ liệu, tôi đã tạo một plugin theo https:// fivejars.com/blog/when-drupal-best-choice-your-website. tôi đang mong đợi rằng lựa chọn_handler tài sản giải quyết nó. Điều này đang được gọi mà không có quyền truy cập vào dữ liệu bộ lọc:

<?php

không gian tên Drupal\cbi_deal_id\Plugin\EntityReferenceSelection;

sử dụng Drupal\node\Plugin\EntityReferenceSelection\NodeSelection;

/**
 * Cung cấp kiểm soát truy cập cụ thể cho loại thực thể nút.
 *
 * @EntityReferenceSelection(
 * id = "mặc định:node_by_issuer",
 * nhãn = @Translation("Lựa chọn nút theo trường"),
 * entity_types = {"nút"},
 * nhóm = "mặc định",
 * trọng lượng = 3
 * )
 */
lớp BondByIssuerSelection mở rộng NodeSelection {

 /**
  * {@inheritdoc}
  */
 hàm được bảo vệ buildEntityQuery($match = NULL, $match_operator = 'CONTAINS') {
   \Drupal::logger('cbi_deal_id')->notice('đang tải truy vấn thực thể bản dựng với');
   $query = parent::buildEntityQuery($match, $match_operator);
   $handler_settings = $this->configuration['handler_settings'];
   if (!isset($handler_settings['filter'])) {
     trả lại truy vấn $;
   }
   $filter_settings = $handler_settings['filter'];
   foreach ($filter_settings as $field_name => $value) {
     $query->condition($field_name, $value, '=');
   }
   trả lại truy vấn $;
 }

}

Ajax trả lại toàn bộ đoạn văn

Điều chỉnh ajax để thay thế toàn bộ đoạn văn theo đề xuất

$form['field_para_deal_information']['widget'][0]['subform']['field_deal_reference_bond']['target_id']['#selection_settings'] = 
  [
     'các_gói_mục_tiêu' => ['liên kết'],
     'bộ lọc' => ['field_issuer_filter' => 4993],
   ];
$form['field_para_deal_information']['widget'][0]['subform']['field_deal_reference_bond']['#prefix'] = 'thử nghiệm thêm nội dung: id nhà phát hành' . $issuer_id;
  trả về $form['field_para_deal_information'];
}

Trong tệp đối sánh /src/Entity/CbiDealIdEntityAutocompleteMatcher.php

Cài đặt bộ lọc nằm trong bộ điều khiển đối sánh tự động hoàn thành, chứ không phải các giá trị được cập nhật

nhập mô tả hình ảnh ở đây

Phần kết luận

Tôi đã thử tạo bộ điều khiển https://www.chapterthree.com/blog/how-alter-entity-autocomplete-results-drupal-8. Nó được gọi, nhưng tôi không có dữ liệu bộ lọc và không thể xem cách giải quyết $form_state để lấy id từ biểu mẫu thực thể nội tuyến.

Phương pháp giải quyết truy vấn thứ hai là thông qua một tuyến tùy chỉnh. Có thể thay đổi tuyến đường từ ajax. Yêu cầu điều tra.

Phương pháp lọc đơn giản nhất theo giá trị trong trường thực thể nội tuyến là gì?

No Sssweat avatar
lá cờ ua
Trong lệnh gọi lại ajax của bạn, bạn chỉ cần `return $form['field_para_deal_information'];`

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