Score:5

วิธีทำให้ช่องทำเครื่องหมายเป็นแบบอ่านอย่างเดียว/ปิดใช้งานจากรายการการอ้างอิงเอนทิตีของผู้ใช้

ธง cn

ในประเภทเนื้อหาของฉัน ฉันเพิ่มฟิลด์ อ้างอิง: ผู้ใช้ ด้วยค่าไม่จำกัด วิธีการอ้างอิงจากมุมมองของผู้จัดการผู้ใช้ และช่องทำเครื่องหมายวิดเจ็ต

โดยทั่วไปเมื่อผู้จัดการผู้ใช้แก้ไขโหนด เขาสามารถทำเครื่องหมายในช่องที่มีชื่อของเขาเองเท่านั้น ช่องทำเครื่องหมายอื่นๆ ถูกตั้งค่าเป็นปิดใช้งาน โหนดจะถูกเผยแพร่หากผู้จัดการทั้งหมดทำเครื่องหมายในช่อง

ฉันได้ลองสร้าง 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();
...
sonfd avatar
in flag
นี่อาจเป็นโอกาสที่ดีในการสร้างวิดเจ็ตฟิลด์แบบกำหนดเองที่ขยายวิดเจ็ตช่องทำเครื่องหมายของคอร์แทนที่จะใช้ hook ดัดแปลงแบบฟอร์ม
cn flag
@sonfd ขอบคุณสำหรับคำตอบ ฉันได้อัปเดตคำถามของฉันโดยเพิ่มวิธีแก้ปัญหาโดยใช้ JavaScript แต่ฉัน แต่ฉันไม่รู้ว่าประสิทธิภาพ/ความเสถียร/มาตรฐานเทียบกับโซลูชัน/คำตอบของคุณหรือไม่ คุณคิดอย่างไร?
sonfd avatar
in flag
เมื่อฉันมีสถานการณ์ที่คล้ายกัน (ปิดใช้งานช่องทำเครื่องหมายบางช่องในองค์ประกอบของฟิลด์) ฉันสร้างวิดเจ็ตฟิลด์ที่ขยายคอร์และใช้โมดูล Form Options Attributes เพื่อปิดใช้งานช่องทำเครื่องหมาย ในความคิดของฉัน นั่นเป็นทางออกที่ดีที่สุด ด้วยแนวทางจาวาสคริปต์ของคุณ เป็นไปได้ว่าไม่น่าจะมีใครทำเครื่องหมายในช่องก่อนที่จะถูกปิดใช้งาน
Score:4
ธง in

เท่าที่ฉันทราบ Drupal core ไม่มีฟังก์ชันนี้ให้ใช้งานนอกกรอบ - ไม่มีวิธีเพิ่มแอตทริบิวต์ให้กับตัวเลือกแต่ละรายการขององค์ประกอบ

อย่างไรก็ตาม วิธีหนึ่งที่ฉันทำคือใช้ความช่วยเหลือจาก แอตทริบิวต์ตัวเลือกแบบฟอร์ม โมดูล.

โมดูล [The Form Options Attributes] เพิ่มความสามารถในการระบุแอตทริบิวต์สำหรับแต่ละตัวเลือกในองค์ประกอบ Drupal Form API ประเภท: Select, Checkboxes และ Radios

มันค่อนข้างใช้งานง่าย จากหน้าโครงการ:

หากต้องการเพิ่มแอตทริบิวต์ให้กับตัวเลือกขององค์ประกอบฟอร์ม ให้เพิ่มคีย์ #options_attributes ให้กับคำนิยามองค์ประกอบฟอร์ม ค่า #options_attributes ควรเป็นอาร์เรย์ที่มีคีย์ตรงกับคีย์ในอาร์เรย์ค่า #options ค่าในอาร์เรย์ #options_attributes ควรจัดรูปแบบเหมือนกับอาร์เรย์ #attributes หลัก

ตัวอย่างเช่น:

$แบบฟอร์ม['my_field'] = [
  '#ตัวเลือก' => [
    '1' => 'ผู้ใช้ 1',
    '123' => 'ผู้ใช้ 123',
    '456' => 'ผู้ใช้ 456',
  ]
  '#options_attributes' => [
    // ปิดการใช้งานตัวเลือกนี้
    '1' => [
      'ปิดการใช้งาน' => 'ปิดใช้งาน',
    ]
    // อนุญาตตัวเลือกนี้
    '123' => [],
    // ปิดการใช้งานตัวเลือกนี้
    '456' => [
      'ปิดการใช้งาน' => 'ปิดใช้งาน',
    ]
  ]
];

หรือดูโมดูลของ อ่าน สำหรับตัวอย่างที่สมบูรณ์ยิ่งขึ้น

Score:2
ธง cn

ทำเช่นนี้:

ฟังก์ชัน 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'][$key]['#disabled'] = จริง;
            }
        }
    }
}

กุญแจสำคัญคือเมื่อคุณระบุแอตทริบิวต์ของตัวเลือก คุณจะทำงานกับองค์ประกอบย่อยของ 'วิดเจ็ต' ไม่ใช่ของ '#options'

us flag
ขอบคุณ. นี่เป็นเคล็ดลับในการปิดใช้งานหรือซ่อนบทบาทของกลุ่มสำหรับสมาชิกของกลุ่ม $form['group_roles']['widget']['role-name']['#disabled'] = จริง; หรือ $form['group_roles']['widget']['role-name']['#access'] = เท็จ;

โพสต์คำตอบ

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