Как программно изменить конфигурацию отображения представления сущности?


В реализации 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');

Это позволит вам изменить и сохранить объект конфигурации, но я полагаю, что это неправильный способ сделать это. Я предполагаю, что должен быть какой-то класс диспетчера режимов просмотра, который я должен использовать для этого, но я не смог его найти.

Итак, как мне программно изменить конфигурацию отображения представления сущности?

Бонусный вопрос: Когда вы оказываетесь в подобной ситуации, каковы ваши стратегии изучения кода и поиска нужных вам классов?

Author: marcvangend, 2016-08-26

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();

Это намного проще, чем сделать это в массиве конфигурации.

 4
Author: 4k4, 2016-08-26 11:26:48