Поскольку содержимое вашего поля генерируется динамически, похоже, вам нужно вычисляемое поле. Что устранит проблему, с которой вы столкнулись. Вычисляемое поле создается динамически, а не посредством пользовательского ввода. Поскольку это поле, им можно управлять так же, как и любым другим полем в Drupal (хотя интеграция с представлениями требует некоторых дополнительных усилий). Поля также кэшируются с помощью различных API кэширования Drupal.
Чтобы создать вычисляемое поле, сначала расширьте Drupal\Core\Field\FieldItemList
, использовать
в Drupal\Core\TypedData\ComputedItemListTrait
, и реализовать вычислить значение ()
метод:
пространство имен Drupal\[ПРИМЕР]\Plugin\Field;
используйте Drupal\Core\Field\FieldItemList;
используйте Drupal\Core\TypedData\ComputedItemListTrait;
класс SomeDynamicField расширяет FieldItemList {
использовать ComputedItemListTrait;
/**
* {@inheritdoc}
*/
защищенная функция calculateValue() {
$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().
*/
function 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('string')
->setName('example_field')
->setLabel(t('Пример вычисляемого поля'))
->setDescription(t('Пример вычисляемого поля'))
// Установить поле как вычисляемое поле.
->setComputed(ИСТИНА)
// Установить класс, который генерирует значение(я) поля.
->setClass('\Drupal\[EXAMPLE]\Plugin\Field\Computed\SomeDynamicField');
}
}