Drupal → Third Party Settings — интерфейс хранения дополнительных настроек конфигурационных сущностей и плагинов

01.04.2018

В Drupal 8 появился унифицированный способ хранения дополнительных настроек в чужих config entities и plugins. Способ называется Third Party Settings.

О чём вообще речь? Например нужно добавить нодам новый функционал — возможность скрывать заголовок у определённого типа нод. В Drupal 7 мы бы альтернули форму редактирования типа материала, добавили чекбокс "Скрывать заголовок", навесили на форму свой #submit и в нём бы сохранили значение этой опции с помощью variable_set(). Некоторые модули для этого создавали отдельные таблицы в базе, другие хранили настройки в data атрибуте сущности, но единого способа хранения пользовательских опций не было.

В восьмёрке же все config entities и плагины расширяют ThirdPartySettingsInterface, что делает доступным два основных метода — setThirdPartySetting() и getThirdPartySetting(), которые позволяют сохранять и получать значения дополнительных свойств.

Пример:

/**
 * Implements hook_form_FORM_ID_alter(): node_type_edit_form.
 */
function modulename_form_node_type_edit_form_alter(array &$form, FormStateInterface $form_state) {
  /** @var NodeTypeInterface $node_type */
  $node_type = $form_state->getFormObject()->getEntity();

  $form['hide_title'] = [
    '#type' => 'checkbox',
    '#title' => t('Hide title'),
    '#default_value' => $node_type->getThirdPartySetting('modulename', 'hide_title'),
  ];

  $form['#entity_builders'][] = 'modulename_node_type_edit_form_entity_builder';
}

/**
 * Node type form entity builder callback.
 */
function modulename_node_type_edit_form_entity_builder($entity_type, NodeTypeInterface $node_type, &$form, FormStateInterface $form_state) {
  $node_type->setThirdPartySetting('modulename', 'hide_title', $form_state->getValue('hide_title'));
}

Сохранённые таким способом данные будут корректно экспортироваться и импортироваться штатным менеджером конфигураций.

Написанное актуально для
Drupal 8
Похожие записи

Комментарии

А ещё они корректно удаляются при удалении модуля, который их обслуживает

Добавить комментарий