เนื่องจากเนื้อหาในฟิลด์ของคุณถูกสร้างขึ้นแบบไดนามิก ดูเหมือนว่าคุณต้องการฟิลด์ที่คำนวณแล้ว ซึ่งจะลบปัญหาที่คุณพบ ฟิลด์ที่คำนวณคือฟิลด์ที่สร้างขึ้นแบบไดนามิก แทนที่จะผ่านการป้อนข้อมูลของผู้ใช้ เนื่องจากเป็นฟิลด์ จึงสามารถจัดการได้เหมือนกับฟิลด์อื่นๆ ใน 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');
}
}