Получение определений полей в пакетах, включая базовые поля


В Drupal 8 есть два типа полей: "базовые поля", такие как node.uid, и определяемые пользователем поля, такие как "node.body".

Все имена полей для одного типа сущности можно найти с помощью EntityFieldManagerInterface->getFieldMap(). Однако это содержит только тип поля (в виде строки) и список пакетов.

Для базовых полей, таких как 'uid', существует EntityFieldManagerInterface->getbaseFieldDefinitions($entity_type_id). Но при этом опущены пользовательские поля.

Для определяемых пользователем полей существует EntityTypeManagerInterface->getStorage('field_storage_config')->load($entity_type_id . $field_name);. Но это не включает базовые поля, такие как 'узел.uid'.

Существует также EntityFieldManagerInterface->getFieldDefinitions($entity_type_id, $bundle_name). Но это должно быть вызвано для каждого пакета.

Есть еще в FieldTypePluginmanager, entityadapter и entitydatadefinition. Чем больше я смотрю, тем более запутанной и сложной кажется мне вся эта архитектура..

Предыстория

Я хотел бы показать элемент select, в котором пользователь может выбрать поле. Тип сущности указан, но bundle - нет. Параметры фильтруются по различным критериям. Например, возможно, я хочу показать все поля, в которых тип элемента расширяет EntityReferenceItem, а целевой тип ссылки - "узел". Для этого мне нужно проверить определение каждого поля.

Все это для версии D8 https://drupal.org/project/renderkit.

 4
Author: donquixote, 2017-08-13

1 answers

Чем больше я смотрю, тем более запутанной и сложной кажется мне вся эта архитектура.

Архитектура на самом деле очень похожа на 7.x, только что переименованную. 7.x имел поля и экземпляры полей, 8.x имеет хранилища полей (= 7.x полей) и поля. Базовые поля по умолчанию отображаются как оба, в то время как настраиваемые поля имеют отдельный тип сущности для каждого.

Хранилища полей существуют для каждого типа сущности и полей для каждого типа сущности/пакета. (в 7.x поля были глобальными, в противном случае это то же самое).

Чтобы получить все хранилища полей типа сущности, вы можете использовать \Drupal\Core\Entity\entityfieldmanager::getfieldstoragedefinitions(). Обратите внимание, что хранилище полей не имеет метки, только поле (и метка может отличаться для каждого пакета), поэтому вам все равно нужно будет рассмотреть все пакеты, если вы не хотите просто показывать имя машины. маркер и представления имеют вспомогательные функции для этого, например _token_field_label().

Еще одна полезная ссылка заключается в том, как выбор сущности плагин создает список полей для сортировки по:\Drupal\Ядро\Сущность\Плагин\Entityreferenceselection\Выбор по умолчанию::buildconfigurationform()

 4
Author: Berdir, 2017-08-14 06:15:14