ในประเภทเนื้อหาของฉัน ฉันเพิ่มฟิลด์ อ้างอิง: ผู้ใช้ ด้วยค่าไม่จำกัด วิธีการอ้างอิงจากมุมมองของผู้จัดการผู้ใช้ และช่องทำเครื่องหมายวิดเจ็ต
โดยทั่วไปเมื่อผู้จัดการผู้ใช้แก้ไขโหนด เขาสามารถทำเครื่องหมายในช่องที่มีชื่อของเขาเองเท่านั้น ช่องทำเครื่องหมายอื่นๆ ถูกตั้งค่าเป็นปิดใช้งาน โหนดจะถูกเผยแพร่หากผู้จัดการทั้งหมดทำเครื่องหมายในช่อง
ฉันได้ลองสร้าง form_alter ฟังก์ชั่นด้านล่าง
ฟังก์ชัน mymodule_form_alter(&$form, FormStateInterface $form_state, $form_id) {
ถ้า ($form_id === 'node_request_order_edit_form') {
$field_approved_by = $form['field_approved_by']['widget']['#ตัวเลือก'];
foreach($field_approved_by as $key=>$val) {
if($key != \Drupal::currentUser()->id()) {
$form['field_approved_by']['widget']['#options'][$key]['#disabled'] = จริง;
}
}
}
}
แต่ฉันได้รับข้อผิดพลาด
ข้อผิดพลาด: ไม่สามารถใช้วัตถุประเภท Drupal\Core\Field\FieldFilteredMarkup เป็นอาร์เรย์...
ถ้าฉันลบช่องทำเครื่องหมายโดยใช้ unset
...
if($key != \Drupal::currentUser()->id()) {
unset($form['field_approved_by']['widget']['#options'][$key]);
}
...
ค่าจะถูกเขียนทับเมื่อผู้จัดการรายอื่นทำเครื่องหมายในช่องและบันทึกโหนด
ขอบคุณสำหรับความช่วยเหลือใด ๆ
อัปเดต 1:
ดังนั้นฉันจึงแก้ปัญหาโดยใช้ JavaScript เพื่อปิดการใช้งานช่องทำเครื่องหมายเหล่านี้ นี่คือบทช่วยสอนอ้างอิง:
แต่ฉันไม่รู้ว่าประสิทธิภาพ / ความเสถียรนั้นดีกว่าหรือแย่กว่าโซลูชันที่ให้มาจากคำตอบ
โดยทั่วไปฉันสร้างไฟล์ไลบรารี JS: spo_core.libraries.yml
request_order_edit:
จส:
js/request_order_edit.js: {}
การพึ่งพา:
- แกน / jquery
- แกน/jquery.once
- หลัก / drupal
- การตั้งค่าหลัก / drupal
จากนั้นในโฟลเดอร์ JS ให้สร้างไฟล์: request_order_edit.js
(ฟังก์ชัน ($) {
'ใช้อย่างเข้มงวด';
Drupal.behaviors.addLayer = {
แนบ: ฟังก์ชัน (บริบท การตั้งค่า) {
console.log(drupalSettings.spo_core.current_uid);
$('#edit-field-approved-by input:checkbox').each(function(){
ถ้า (this.value != drupalSettings.spo_core.current_uid){
this.disabled = จริง;
}
});
/*เปิดใช้งานช่องทำเครื่องหมายก่อนส่ง เพื่อให้ช่องทำเครื่องหมายที่ปิดใช้งานสามารถโพสต์ค่าได้*/
$("form#node-request-order-edit-form").submit(function() {
$('#edit-field-approved-by.form-checkboxes input:checkbox').removeAttr("ปิดการใช้งาน");
});
}
}
})(jQuery);
จากนั้นแนบในรูปแบบแก้ไขเช่นนี้
...
$form['#attached']['library'][] = 'spo_core/request_order_edit';
$form['#attached']['drupalSettings']['spo_core']['current_uid'] = \Drupal::currentUser()->id();
...