Score:0

ฟิลด์อ้างอิงเอนทิตี วิดเจ็ตที่ซ่อนอยู่หรือแก้ไขถูกปิดใช้งานในแบบฟอร์มที่กำหนดเอง

ธง in

ฉันมีรูปแบบการสร้างโหนดที่กำหนดเอง ฉันกำลังแสดงผลภายใน hook การประมวลผลล่วงหน้าของมุมมอง ในแบบฟอร์มนั้น ฉันมีช่องอ้างอิงเอนทิตีสองช่อง ฉันกำลังตั้งค่า [#value] และ [#default_value] ของฟิลด์อ้างอิงเหล่านั้นโดยทางโปรแกรม

ในแบบฟอร์ม การส่งค่าที่ฉันตั้งไว้จะถูกสร้างขึ้น แต่ถ้าฟิลด์นั้น "แก้ไขได้" โดยผู้ใช้ ฉันต้องการทำให้ฟิลด์ "ปิดใช้งาน" และ/หรือ "ซ่อน" จากผู้ใช้ ไม่เพียงแค่ซ่อนด้วย CSS แต่ด้วยวิดเจ็ตเติมข้อความอัตโนมัติทั้งหมดที่ไม่สามารถเข้าถึงได้ ช่องนี้ต้องเป็นประเภท "ซ่อน"

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

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

นี่คือบางสิ่งที่ฉันได้ลองแล้วไม่ได้ผล:

  1. $form['field_entity_reference']['#access'] = เท็จ; // การตั้งค่า #access เป็นเท็จดูเหมือนว่าควรใช้งานได้เนื่องจากช่องแบบฟอร์มยังคงอยู่เมื่อดีบัก $form แต่ใช้งานไม่ได้เนื่องจากป้องกันไม่ให้ส่งค่า
  2. การเพิ่ม ['#attributes']['readonly'], เปลี่ยน ['#type'] เป็นซ่อนหรือวิดเจ็ตประเภทอื่น, เพิ่ม ['#attributed']['disabled'] ไม่มีการทำงาน
  3. เติมข้อมูลเอนทิตีล่วงหน้า - สิ่งนี้ใช้ไม่ได้กับสถานการณ์เฉพาะนี้เนื่องจากโทเค็นไม่สามารถระบุค่าบางค่าได้

รหัสสำหรับการอ้างอิง

ฟังก์ชัน <ธีม>_preprocess_views_view_field(&$ตัวแปร) {
  $view = $ตัวแปร['ดู'];
  
  ถ้า ($view->id() == '<view>') {
    $field = $ตัวแปร['field'];

    สวิตช์ ($field->ตัวเลือก['id']) {
      กรณี '<view_field>':
        $node = \Drupal::entityTypeManager()
          ->getStorage('โหนด')
          ->สร้าง (['type' => '<node_type>']);
        $form = \Drupal::service('entity.form_builder')->getForm($node, 'secondary');

        // ตั้งค่า default_value และค่า
        $form['field_entity_reference']['widget']['#default_value'] = (int)$cid; // โปรดทราบว่านี่ใช้วิดเจ็ต "เลือกรายการ" สำหรับฟิลด์อ้างอิงเอนทิตี
        $form['field_entity_reference']['widget']['#value'] = (int)$cid; //เหมือนข้างบน

        //สิ่งที่ใช้ไม่ได้ ค่าจะไม่ส่งเว้นแต่ผู้ใช้จะแก้ไขฟิลด์ได้ หรือฟิลด์นั้นไม่ถูกซ่อน/ปิดใช้งาน
        $form['field_entity_reference']['#access'] = เท็จ; // ค่าไม่ส่ง
        $form['field_entity_reference']['widget'][0]['#attributes']['readonly'] = 'อ่านอย่างเดียว'; // ไม่ทำให้ฟิลด์อ่านอย่างเดียว
        $form['field_entity_reference']['widget'][0]['value']['#type'] = 'ซ่อน'; // ดูเหมือนว่าวิดเจ็ตเติมข้อความอัตโนมัติและวิดเจ็ตที่เลือกไม่มีประเภท "ซ่อน"
        $form['field_entity_reference']['widget'][0]['target_id']['#type'] = 'ช่องข้อความ'; // ดูเหมือนว่าจะไม่สามารถเปลี่ยนประเภทเป็น textfield ได้

        // เปลี่ยนมุมมองฟิลด์เอาท์พุตเป็นฟอร์ม
        $variables['output'] = $รูปแบบ;
      หยุดพัก;
    }
  }
}
Jaypan avatar
de flag
"แบบฟอร์มการสร้างโหนดที่กำหนดเอง" หมายถึงอะไร
cn flag
คุณสามารถตั้งค่าเอนทิตีแบบเป็นโปรแกรมใน `hook_entity_presave()` แทนการตั้งค่า `#value` ในแบบฟอร์ม คุณสามารถใช้ `hook_entity_presave()` แม้ว่าฟิลด์จะถูกซ่อนหรือผู้ใช้ไม่มีสิทธิ์ในการแก้ไขฟิลด์
Jaypan avatar
de flag
ตั้งค่า `#access` เป็น `FALSE` บนองค์ประกอบฟอร์ม และจะไม่ถูกส่งไปยังเบราว์เซอร์เพื่อแสดงผล อย่างไรก็ตาม ค่าจะถูกประมวลผลเมื่อมีการส่งแบบฟอร์ม ตราบเท่าที่ค่าถูกตั้งค่าไว้ล่วงหน้าในองค์ประกอบ ทั้งในคำนิยามฟอร์ม หรือ form_alter hook ค่านั้นสามารถผ่านได้
Score:0
ธง in

ขอชื่นชม @Patrick Kenny ที่ทำให้ฉันอยู่บนเส้นทางที่ใช้การได้ hook_entity_presave(). ฉันโพสต์สิ่งนี้เป็น "คำตอบ" เนื่องจากเป็นวิธีการทำสิ่งที่ฉันต้องการให้สำเร็จ แต่ฉันก็ยังคิดว่าฟิลด์อ้างอิงเอนทิตี D8 ไม่มีประเภทวิดเจ็ต "ซ่อน" อาจจะเป็นพอร์ตของ การอ้างอิงเอนทิตี_ซ่อน. ถ้าใครรู้วิธีการทำโปรแกรมให้สำเร็จโปรดแบ่งปัน

นี่คือวิธีที่ฉันทำสิ่งที่ต้องการได้สำเร็จ

  1. สร้างฟิลด์จำนวนเต็มซ้ำซ้อนในประเภทเนื้อหาเพื่อเก็บค่าซึ่งจะนำไปใช้กับฟิลด์อ้างอิงเอนทิตีครั้งเดียว hook_entity_presave() วิ่ง
  2. ตั้งค่าฟิลด์จำนวนเต็มซ้ำซ้อนให้พร้อมใช้งานในแบบฟอร์ม เปลี่ยนประเภทฟิลด์เป็นซ่อน คุณสามารถใช้ field_hidden โมดูลสำหรับสิ่งนี้
  3. ภายในธีม hook_preprocess_views_view_field() hook ตั้งค่าของฟิลด์ที่ซ้ำซ้อนเป็นรหัสโหนดเป้าหมาย (ดูรหัสในคำถามเดิมเพื่อทำความเข้าใจว่าฉันหมายถึงอะไรที่นี่) โปรดทราบว่านี่เป็นเพียงตัวอย่างของฉันในขณะที่ฉันกำลังเพิ่มแบบฟอร์มลงในฟิลด์เฉพาะของแถวมุมมอง แต่สามารถนำไปใช้กับ hooks อื่นได้
  4. ในโมดูลแบบกำหนดเอง ภายใน hook_entity_presave() คว้าค่าฟิลด์ที่ซ้ำซ้อนและนำไปใช้กับฟิลด์อ้างอิงเอนทิตีก่อนบันทึก (ดูรหัสด้านล่าง)
ฟังก์ชัน <โมดูล>_entity_presave($entity) {
  ถ้า ($entity->getEntityType()->id() == 'โหนด') {
    ถ้า ($entity->bundle() == â<content_type>â) {
      // ----- รับรหัสเอนทิตี
      $eid = $entity->redundant_field_name->ค่า;
      
      // ----- ตั้งค่าฟิลด์เอนทิตี target_value
      $entity->normal_entity_reference_field>target_id = $eid;
    }
  }
}

หมายเหตุด้านข้างเกี่ยวกับตะขอภายใน <ธีม>.ธีม ไฟล์

เดอะ hook_form_alter() ขอเกี่ยวเมื่ออยู่ภายใน <ธีม>.ธีม ไฟล์ไม่ได้ใช้ในทาง / ลำดับที่คาดหวังเสมอไป

ตัวอย่างเช่น การสมัคร [#อาแจ็กซ์] การดำเนินการกับแบบฟอร์มไม่ได้ทำให้ ajax ของแบบฟอร์มนั้นมีความสามารถเว้นแต่ hook จะอยู่ภายในโมดูล ( hooks ของไฟล์ธีมจะไม่ทำงาน) ดูเหมือนว่าเป็นเพราะแอปพลิเคชันของการกำหนดค่าแบบฟอร์มที่จำเป็นเกิดขึ้นก่อนที่จะเรียกใช้ธีมฮุค

โพสต์คำตอบ

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