Как программно изменить конфигурацию отображения представления сущности?
В реализации hook_install мне нужно изменить конфигурацию отображения представления сущности для определенных комбинаций пакетов/режимов просмотра. Например, я хотел бы изменить режим просмотра "тизер" пакета "статья" и скрыть "field_image".
При экспорте конфигурации вы увидите эти настройки, сохраненные в core.entity_view_display.node.article.teaser.yml
. Я знаю, что можно загрузить конфигурацию следующим образом:
$view_mode_config = \Drupal::configFactory()->getEditable('core.entity_view_display.node.article.default');
Это позволит вам изменить и сохранить объект конфигурации, но я полагаю, что это неправильный способ сделать это. Я предполагаю, что должен быть какой-то класс диспетчера режимов просмотра, который я должен использовать для этого, но я не смог его найти.
Итак, как мне программно изменить конфигурацию отображения представления сущности?
Бонусный вопрос: Когда вы оказываетесь в подобной ситуации, каковы ваши стратегии изучения кода и поиска нужных вам классов?
1 answers
Существует два типа конфигурации. Простая конфигурация и объекты конфигурации. В данном случае это объект конфигурации. Имя класса находится в camelCase:
EntityViewDisplay.php
class EntityViewDisplay extends EntityDisplayBase implements EntityViewDisplayInterface
Если у вас есть объект конфигурации для конфигурации, вы можете загрузить объект конфигурации,
$storage = \Drupal::entityTypeManager()->getStorage('entity_view_display');
$view_display = $storage->load('node.article.default');
Измените его и сохраните:
$view_display->save();
Почему вы хотите использовать объекты конфигурации?
Вы можете получить массив конфигурации:
$config = $view_display->toArray();
Это не отличается от того, что вы получаете в файле yml или api конфигурации.
Преимущество заключается в том, что объекты конфигурации обычно имеют метод для специальных задач настройки. С дисплеями это, например, для добавления или удаления компонентов:
$view_display->setComponent('body', [
'type' => 'text_summary_or_trimmed',
'settings' => ['trim_length' => '200'],
'weight' => 1,
])
->removeComponent('field_image')
->save();
Это намного проще, чем сделать это в массиве конфигурации.