Как переопределить конфигурацию из файла?
В последнее время я много играл с конфигурацией импорта в Drupal 8. И я замечаю, что во всей документации показано, как редактировать значение по значению вместо переопределения всего конфигурационного файла. Вы можете найти более подробную информацию об этом на странице Система переопределения конфигурации .
Я заметил, что DrupalConsole и Drush имеют возможность переопределять конфигурацию по файлу.
- Используя Drush, вы можете запустить
drush config-import
- Использование DrupalConsole, вы можете запустить
drupal config-import
Это переопределит всю базу конфигурации в файле конфигурации. Как я могу добиться этого в коде? Надеюсь, я захочу отредактировать свою конфигурацию, когда буду устанавливать свой модуль на hook_install.
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();
}
Это было протестировано в моей среде разработки.
Я оставляю здесь еще один пример, в дополнение к ответу @Вагнера, на случай, если это будет полезно.
Сценарий выглядит следующим образом: Я хотел бы переопределить настройки 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 (спасибо turdus-merula), чтобы переопределить только две настройки модулей разработки. Остальные остаются нетронутыми.
[редактировать: не могу добавить свой комментарий непосредственно к ответу dxvargas, к которому он относится]
Вдохновленный ответом @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();
}
}