Как переопределить конфигурацию из файла?


В последнее время я много играл с конфигурацией импорта в Drupal 8. И я замечаю, что во всей документации показано, как редактировать значение по значению вместо переопределения всего конфигурационного файла. Вы можете найти более подробную информацию об этом на странице Система переопределения конфигурации .

Я заметил, что DrupalConsole и Drush имеют возможность переопределять конфигурацию по файлу.

  • Используя Drush, вы можете запустить drush config-import
  • Использование DrupalConsole, вы можете запустить drupal config-import

Это переопределит всю базу конфигурации в файле конфигурации. Как я могу добиться этого в коде? Надеюсь, я захочу отредактировать свою конфигурацию, когда буду устанавливать свой модуль на hook_install.

Author: itsdarrylnorris, 2016-01-20

4 answers

Переопределить конфигурацию в коде очень просто. Выше приведен пример того, как вы получаете, устанавливаете и сохраняете любую конфигурацию (которую вы только что установили через .yml и из ядра).

В файле .install или .module

  //Getting editable configs
  $module_cfg = \Drupal::configFactory()->getEditable('your.module.file');
  $settings = \Drupal::configFactory()->getEditable('any_core.settings');
  //Getting values
  $a_value = $settings->get('key_from_core');
  //Setting and save configs
  $module_cfg->set('any.key', $a_value)->save();
  $settings->set('key', 'new_value')->save();

Из hook_установить документы:

Реализации этого крючка по соглашению объявлены в файле .install модуля.

Для получения дополнительной информации см. Документы ConfigFactory .

Существует модуль, называемый Функции, которые помогают, если вы хотите отслеживать свои конфигурации. В настоящее время я использую этот модуль для разработки на основе кода, возможно, это то, что вы ищете.

Изменить 1 - Заменить всю конфигурацию

Прежде всего, вам нужно указать, какую конфигурацию вы хотите переопределить.

В моем файле.custom.config.yml

# Make sure this config exists in your database
target: 'config.to.override'
... # all your data (CAUTION with 'dependencies')

Вкл.установочный файл

function module_install() {
  //Get your custom config
  $cfg = \Drupal::configFactory()->getEditable('my.custom.config');
  //Get config name to override
  $target = $cfg->get('target');
  //Get Config object
  $settings = \Drupal::configFactory()->getEditable($target);
  //Override all data that can be overridden
  $settings->setData($cfg->get())->save();
  //If you won't store any previous state, get rid of your custom config
  $cfg->delete();
}

Это было протестировано в моей среде разработки.

 8
Author: Vagner, 2016-01-21 13:53:37

Я оставляю здесь еще один пример, в дополнение к ответу @Вагнера, на случай, если это будет полезно.

Сценарий выглядит следующим образом: Я хотел бы переопределить настройки addtoany.

Настройки модуля расположены по адресу modules/contrib/addtoany/config/install/addtoany.settings.yml.

Чтобы переопределить их, создайте пользовательский модуль foobar и файл modules/custom/foobar/config/install/foobar.addtoany.settings.yml:

buttons_size: 32
additional_html: |
  <a class="a2a_button_facebook"></a>
  <a class="a2a_button_twitter"></a>
additional_css: ''
additional_js: ''
universal_button: none
custom_universal_button: ''
universal_button_placement: before
no_3p: false

В modules/custom/foobar/foobar.install примените новые настройки:

<?php

function foobar_install()
{
  // Get your custom config
  $cfg = \Drupal::configFactory()->getEditable('foobar.addtoany.settings');
  // Get Config object
  $settings = \Drupal::configFactory()->getEditable('addtoany.settings');
  // Override all data that can be overridden
  $settings->setData($cfg->get())->save();
  // Get rid of your custom config
  $cfg->delete();
}
 4
Author: turdus-merula, 2017-01-23 20:08:53
По-видимому, нам нужно определить все записи, даже те, которые мы не хотим изменять

Возможно, так оно и было, но в настоящее время я только что использовал приведенный выше пример в 4 (спасибо turdus-merula), чтобы переопределить только две настройки модулей разработки. Остальные остаются нетронутыми.

[редактировать: не могу добавить свой комментарий непосредственно к ответу dxvargas, к которому он относится]

 0
Author: Jonathan1055, 2020-02-14 08:24:06

Вдохновленный ответом @Vagner, я выбираю для чтения каталог конфигурационных файлов, которые будут импортированы во время установки. Вызовите это из HOOK_install(). Это позволит избежать необходимости устанавливать конфигурацию, а затем удалять ее. Вы также можете просто скопировать файлы конфигурации из директора синхронизации в каталог установки/переопределения (и, конечно, удалить запись uuid). Если у вас есть несколько конфигурационных файлов, это может быть проще.

use Drupal\Core\Config\FileStorage;
// (snip)
/**
 * Read all configuration from config/override and install.
 */
function _MODULE_override_config() {
  $path = drupal_get_path('module', 'MODULE') . '/config/override';
  $file = new FileStorage($path);
  foreach ($file->listAll() as $id) {
    $config_data = $file->read($id);
    $config = \Drupal::configFactory()->getEditable($id);
    $config->setData($config_data)->save();
  }
}
 0
Author: Dan Chadwick, 2020-12-02 21:22:03