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 trường tự động hoàn thành trong biểu mẫu là:
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:
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
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ì?