Vì nội dung của trường của bạn được tạo động nên có vẻ như bạn cần một trường được tính toán. Điều này sẽ loại bỏ vấn đề bạn đang gặp phải. Trường được tính toán là trường được tạo động, thay vì thông qua đầu vào của người dùng. Vì nó là một trường nên nó có thể được quản lý giống như bất kỳ trường nào khác trong Drupal (mặc dù việc tích hợp với Chế độ xem yêu cầu một số nỗ lực bổ sung). Các trường cũng được lưu vào bộ đệm bằng các API bộ đệm khác nhau của Drupal.
Để tạo một trường được tính toán, trước tiên hãy mở rộng Drupal\Core\Field\FieldItemList
, sử dụng
các Drupal\Core\TypedData\ComputedItemListTrait
, và thực hiện các giá trị tính toán ()
phương pháp:
không gian tên Drupal\[EXAMPLE]\Plugin\Field;
sử dụng Drupal\Core\Field\FieldItemList;
sử dụng Drupal\Core\TypedData\ComputedItemListTrait;
lớp SomeDynamicField mở rộng FieldItemList {
sử dụng ComputingItemListTrait;
/**
* {@inheritdoc}
*/
chức năng được bảo vệ computeValue() {
$values = some_function_to_get_an_array_of_values();
foreach ($values as $index => $value) {
$this->list[$delta] = $this->createItem($delta, $value);
}
}
}
Tiếp theo, trường này cần được thêm vào từng loại thực thể mà bạn cần, trong hook_entity_base_field_info_alter():
sử dụng Drupal\Core\Entity\EntityTypeInterface;
sử dụng Drupal\Core\Field\BaseFieldDefinition;
/**
* Triển khai hook_entity_base_field_info_alter().
*/
function EXAMPLE_entity_base_field_info_alter(&$fields, EntityTypeInterface $entity_type) {
// Thêm/thay đổi các loại thực thể nếu cần.
$applicable_entity_types = ['nút'];
if (in_array($entity_type->id(), $applicable_entity_types)) {
$fields['my_computed_field'] = BaseFieldDefinition::create('string')
-> setName('example_field')
->setLabel(t('Trường được tính toán ví dụ'))
->setDescription(t('Ví dụ về trường được tính toán'))
// Đặt trường là trường được tính toán.
-> setComputing (TRUE)
// Đặt lớp tạo (các) giá trị trường.
->setClass('\Drupal\[VÍ DỤ]\Plugin\Field\Computed\SomeDynamicField');
}
}