Score:1

ฉันจะปิดการแก้ไขในฟิลด์โหนดเฉพาะได้อย่างไร

ธง de

ขณะนี้ฉันใช้ hook_entity_extra_field_info() และ hook_ENTITY_TYPE_view() เพื่อสร้างฟิลด์ที่กำหนดเองซึ่งแสดงในโหนดที่สร้างเนื้อหาแบบไดนามิกผ่าน PHP

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

มีวิธีบอก Drupal ใน hooks ตัวใดตัวหนึ่งหรือที่อื่นในการกำหนดค่าไม่ให้ติดตามการแก้ไขสำหรับฟิลด์โหนดเฉพาะหรือไม่

sonfd avatar
in flag
มันติดตามการเปลี่ยนแปลงได้อย่างไร? มันเป็นเพียงเขตข้อมูลการแสดงผล? หรือเป็นการเก็บค่าในฐานข้อมูลจริง ๆ ?
leymannx avatar
ne flag
`สร้างเนื้อหาแบบไดนามิก' หมายความว่าอย่างไร คุณช่วยแสดงโค้ดตัวอย่างให้เราดูได้ไหม หากคุณสร้างเนื้อหาในแง่ของการแนบบางสิ่งเข้ากับโหนดเดียวกัน แน่นอนว่าการแก้ไขจะเริ่มขึ้นหากคุณไม่ได้จัดเก็บเนื้อหานั้นไว้ที่อื่นโดยปกติแล้วช่องหลอกจะใช้สำหรับแสดงมาร์กอัปจากการคำนวณเท่านั้น ไม่ใช่สำหรับสร้างเนื้อหา
Score:0
ธง de

เนื่องจากเนื้อหาในฟิลด์ของคุณถูกสร้างขึ้นแบบไดนามิก ดูเหมือนว่าคุณต้องการฟิลด์ที่คำนวณแล้ว ซึ่งจะลบปัญหาที่คุณพบ ฟิลด์ที่คำนวณคือฟิลด์ที่สร้างขึ้นแบบไดนามิก แทนที่จะผ่านการป้อนข้อมูลของผู้ใช้ เนื่องจากเป็นฟิลด์ จึงสามารถจัดการได้เหมือนกับฟิลด์อื่นๆ ใน Drupal (แม้ว่าการรวมเข้ากับ Views จะต้องใช้ความพยายามเพิ่มเติม) ฟิลด์ยังถูกแคชด้วย API แคชต่างๆ ของ Drupal

หากต้องการสร้างฟิลด์ที่คำนวณแล้ว ให้ขยายก่อน Drupal\Core\Field\FieldItemList, ใช้ เดอะ Drupal\Core\TypedData\ComputedItemListTraitและนำ คำนวณค่า () กระบวนการ:

เนมสเปซ Drupal\[ตัวอย่าง]\ปลั๊กอิน\ฟิลด์;

ใช้ Drupal\Core\Field\FieldItemList;
ใช้ Drupal\Core\TypedData\ComputedItemListTrait;

คลาส SomeDynamicField ขยาย FieldItemList {

  ใช้ ComputedItemListTrait;      

  /**
   * {@inheritdoc}
   */
  ฟังก์ชั่นการป้องกัน computeValue () {
    $values ​​= some_function_to_get_an_array_of_values();
    foreach ($values ​​เป็น $index => $value) {
      $this->list[$delta] = $this->createItem($delta, $value);
    }
  }
}

ถัดไป คุณต้องเพิ่มฟิลด์นี้ให้กับเอนทิตีแต่ละประเภทที่คุณต้องการใน hook_entity_base_field_info_alter():

ใช้ Drupal\Core\Entity\EntityTypeInterface;
ใช้ Drupal\Core\Field\BaseFieldDefinition;

/**
 * ใช้ hook_entity_base_field_info_alter()
 */
ฟังก์ชัน EXAMPLE_entity_base_field_info_alter (&$fields, EntityTypeInterface $entity_type) {
  // เพิ่ม/แก้ไขประเภทเอนทิตีตามความจำเป็น
  $applicable_entity_types = ['โหนด'];
  ถ้า (in_array($entity_type->id(), $applicable_entity_types)) {
    $fields['my_computed_field'] = BaseFieldDefinition::create('สตริง')
      ->setName('example_field')
      ->setLabel(t('ตัวอย่างเขตข้อมูลจากการคำนวณ'))
      ->setDescription(t('ตัวอย่างเขตข้อมูลจากการคำนวณ'))
      // กำหนดฟิลด์เป็นฟิลด์คำนวณ
      ->ตั้งค่าการคำนวณ (จริง)
      // ตั้งค่าคลาสที่สร้างค่าฟิลด์
      ->setClass('\Drupal\[ตัวอย่าง]\Plugin\Field\Computed\SomeDynamicField');
  }
}

โพสต์คำตอบ

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