Score:1

จะกรองการเติมข้อความอัตโนมัติในฟิลด์ที่ต้องพึ่งพาได้อย่างไร

ธง km

เป้าหมาย - จะกรองการเติมข้อความอัตโนมัติตามฟิลด์ที่เกี่ยวข้องได้อย่างไร ในโดเมนนี้ องค์กรจะถูกเลือก จากนั้นการเติมข้อความอัตโนมัติควรอนุญาตให้เลือกเฉพาะรายการที่สร้างโดยองค์กรนั้นเท่านั้น

การตั้งค่าเกี่ยวข้องกับ

  • แบบฟอร์มเอนทิตีแบบอินไลน์เพื่อเลือกองค์กร นี่คือฟิลด์ทริกเกอร์
  • กรอกฟิลด์อัตโนมัติเพื่อเลือกพันธบัตรที่เกี่ยวข้องโดยองค์กรนั้น

องค์ประกอบทริกเกอร์เรียกว่า 'ผู้ออก' นี่คือโครงสร้างแบบฟอร์ม:

โครงสร้างแบบฟอร์ม IEF ของผู้ออก

โครงสร้างฟิลด์เติมข้อความอัตโนมัติในแบบฟอร์มคือ:

โครงสร้างแบบฟอร์ม Deal Bond

ลืมว่า ajax ถูกทริกเกอร์อย่างไรเมื่อแบบฟอร์มเอนทิตีแบบอินไลน์เสร็จสมบูรณ์เป็นปัญหาอื่น ฉันมีระบบที่รายการเลือกปลอม/ทริกเกอร์เปลี่ยนไปตามผู้สังเกตการณ์การกลายพันธุ์ที่เรียกใช้อาแจ็กซ์ ฉันได้ตรวจสอบการพยายามเชื่อมโยงเหตุการณ์ พยายามใช้ ajax กับองค์ประกอบฟอร์มเอนทิตีแบบอินไลน์ และพยายามเรียก ajax โดยใช้ drupal.ajax

ฉันจะตั้งค่าตัวกรอง id ได้อย่างไร ฉันเห็นได้ 2 วิธี วิธีที่สะอาดที่สุดคือส่งพารามิเตอร์ #filter ไปยัง #selection_settings

$form['field_para_deal_information']['widget'][0]['subform']['field_deal_reference_bond']['#selection_settings'] = [
  'target_bundles' => ['ถั่ว'],
  'ตัวกรอง' => ['field_bond_issuer' => $issuer_id],
];

ฉันสามารถเห็นค่าที่ตั้งไว้ในองค์ประกอบ #prefix ในแบบฟอร์มหลังจากเรียกใช้ ajax

$form['field_para_deal_information']['widget'][0]['subform']['field_deal_reference_bond']['#prefix'] = 'การทดสอบเพิ่มเนื้อหา: รหัสผู้ออก' $issuer_id;
ส่งคืน $form['field_para_deal_information']['widget'][0]['subform']['field_deal_reference_bond'];

ลักษณะสนาม:

ป้อนคำอธิบายรูปภาพที่นี่

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">

แสดงว่ามีการตั้งค่า default:node_by_issuer ในฟังก์ชัน ajax (เต็ม):

ฟังก์ชัน cbi_deal_id_handle_ajax (อาร์เรย์ &$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 = ระเบิด(':', $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'] = [
'target_bundles' => ['ถั่ว'],
'ตัวกรอง' => ['field_bond_issuer' => $issuer_id],
  ];

 $form['field_para_deal_information']['widget'][0]['subform']['field_deal_reference_bond']['#prefix'] = 'การทดสอบเพิ่มเนื้อหา: รหัสผู้ออก' $issuer_id;
 ส่งคืน $form['field_para_deal_information']['widget'][0]['subform']['field_deal_reference_bond'];
 }

ฉันทำลายที่รีวิวที่ /web/core/lib/Drupal/Core/Render/Element/FormElement.php บรรทัดที่ 187 และยืนยันว่าไม่ได้ตั้งค่าตัวแปรตัวกรอง

ดูเหมือนว่าฟิลด์เติมข้อความอัตโนมัติไม่ได้รับการอัปเดตด้วยการตั้งค่าที่เกี่ยวข้องกับฟังก์ชันเติมข้อความอัตโนมัติ ถ้าฉันตั้งค่า ajax เพื่ออัปเดตแบบฟอร์มด้วย

['#selection_handler'] = 'ค่าเริ่มต้น:node_by_tester';

ไม่มีการเปลี่ยนแปลงตัวจัดการในตัวเรนเดอร์หลัก ค่าที่กำหนดโดยการแก้ไขรูปแบบเริ่มต้นยังคงอยู่ (node_by_issuer)

การเปลี่ยนแปลงรูปแบบ ajax ด้วยการตัด div เพื่อทดสอบว่ารหัสตัวตัดรูปแบบที่มีรหัสแฮชในตอนท้ายสร้างความแตกต่างหรือไม่

ฟังก์ชัน cbi_deal_id_field_widget_entity_reference_paragraphs_form_alter(&$element, &$form_state, $context) {
  ถ้า ($ element['#paragraph_type'] == 'deal_information') {
    $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>';

    $องค์ประกอบ['ฟอร์มย่อย']['ajax_trigger_button'] = [
      '#type' => 'เลือก',
      '#อาแจ็กซ์' => [
        'callback' => 'cbi_deal_id_handle_ajax',
        'เหตุการณ์' => 'เบลอ',
        'wrapper' => 'test-wrapper',
        'ความคืบหน้า' => [
          'type' => 'throbber',
          'message' => t('กำลังโหลดรายละเอียดผู้ออก ...'),
         ]
      ]
     '#ตัวเลือก' => [
      '1' => t('หนึ่ง'),
      '2' => t('สอง'),
      '3' => t('สาม'),
     ]
   ];

  ถ้า ($bond->isNew()) {
    กลับ;
  }
...

เพื่อกรองข้อมูลฉันได้สร้างปลั๊กอินตาม https://fivejars.com/blog/when-drupal-best-choice-your-website. ฉันคาดหวังว่า Selection_handler คุณสมบัติที่อยู่มัน สิ่งนี้กำลังถูกเรียกโดยไม่มีการเข้าถึงข้อมูลตัวกรอง:

<?php

เนมสเปซ Drupal\cbi_deal_id\Plugin\EntityReferenceSelection;

ใช้ Drupal\node\Plugin\EntityReferenceSelection\NodeSelection

/**
 * ให้การควบคุมการเข้าถึงเฉพาะสำหรับประเภทเอนทิตีของโหนด
 *
 * @EntityReferenceSelection(
 * id = "ค่าเริ่มต้น: node_by_issuer",
 * label = @Translation("โหนดตามการเลือกฟิลด์"),
 * entity_types = {"โหนด"}
 * กลุ่ม = "ค่าเริ่มต้น"
 * น้ำหนัก = 3
 * )
 */
คลาส BondByIssuerSelection ขยาย NodeSelection {

 /**
  * {@inheritdoc}
  */
 ฟังก์ชันที่มีการป้องกัน buildEntityQuery ($match = NULL, $match_operator = 'CONTAINS') {
   \Drupal::logger('cbi_deal_id')->notice('กำลังโหลดการสืบค้นเอนทิตีบิวด์ด้วย');
   $query = parent::buildEntityQuery($match, $match_operator);
   $handler_settings = $this->configuration['handler_settings'];
   ถ้า (!isset($handler_settings['filter'])) {
     ส่งคืน $query;
   }
   $filter_settings = $handler_settings['ตัวกรอง'];
   foreach ($filter_settings เป็น $field_name => $value) {
     $query->condition($field_name, $value, '=');
   }
   ส่งคืน $query;
 }

}

Ajax ส่งคืนทั้งย่อหน้า

ปรับ ajax เพื่อแทนที่ทั้งย่อหน้าตามที่แนะนำ

$form['field_para_deal_information']['widget'][0]['subform']['field_deal_reference_bond']['target_id']['#selection_settings'] = 
  [
     'target_bundles' => ['พันธบัตร'],
     'ตัวกรอง' => ['field_issuer_filter' => 4993],
   ];
$form['field_para_deal_information']['widget'][0]['subform']['field_deal_reference_bond']['#prefix'] = 'การทดสอบเพิ่มเนื้อหา: รหัสผู้ออก' $issuer_id;
  ส่งคืน $form['field_para_deal_information'];
}

ในไฟล์ตัวจับคู่ /src/Entity/CbiDealIdEntityAutocompleteMatcher.php

การตั้งค่าตัวกรองอยู่ในตัวควบคุมตัวจับคู่การเติมข้อความอัตโนมัติ แต่ไม่ใช่ค่าที่อัปเดต

ป้อนคำอธิบายรูปภาพที่นี่

บทสรุป

ฉันได้ลองสร้างคอนโทรลเลอร์แล้ว https://www.chapterthree.com/blog/how-alter-entity-autocomplete-results-drupal-8. มันถูกเรียก แต่ฉันไม่มีข้อมูลตัวกรองและไม่สามารถดูวิธีระบุที่อยู่ $form_state เพื่อรับรหัสจากแบบฟอร์มเอนทิตีแบบอินไลน์

วิธีที่สองในการค้นหาคือผ่านเส้นทางที่กำหนดเอง อาจเปลี่ยนเส้นทางจาก ajax จำเป็นต้องมีการสอบสวน

วิธีที่ง่ายที่สุดในการกรองตามค่าในฟิลด์เอนทิตีแบบอินไลน์คืออะไร

No Sssweat avatar
ua flag
ในการเรียกกลับ ajax คุณต้องเพียงแค่ `return $form['field_para_deal_information'];`

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา