Задача — изменить расположение public://
, private://
и temporary://
директорий при инсталляции друпала с помощью своего профиля.
Сложность — эти директории теперь прописываются только в settings.php
и менять их нужно на самой ранней стадии установки друпала.
Решение — в hook_install_tasks_alter()
добавляем свой таск, в котором копируем файл настроек (при необходимости), изменяем его, сбрасываем кэш:
// profilename.install
use Drupal\Component\Utility\OpCodeCache;
use Drupal\Core\Site\Settings;
/**
* Implements hook_install_tasks_alter().
*/
function profilename_install_tasks_alter(&$tasks, $install_state) {
$tasks = ['profilename_change_settingsphp' => []] + $tasks;
}
/**
* Configure settings.php task.
*/
function profilename_change_settingsphp($install_state) {
$site_path = './' . \Drupal::service('site.path');
$settings_path = $site_path . '/settings.php';
$default_settings_path = './sites/default/default.settings.php';
// Copy default.settings.php to settings.php.
if (!drupal_verify_install_file($settings_path, FILE_EXIST) && drupal_verify_install_file($site_path, FILE_EXIST | FILE_WRITABLE, 'dir')) {
@copy($default_settings_path, $settings_path);
}
// Change settings.php.
if (drupal_verify_install_file($settings_path, FILE_EXIST | FILE_READABLE | FILE_WRITABLE)) {
$settings = file_get_contents($settings_path);
$settings = strtr($settings, [
"# \$settings['file_public_path'] = 'sites/default/files';" => "\$settings['file_public_path'] = 'sites/default/files/public';",
"# \$settings['file_private_path'] = '';" => "\$settings['file_private_path'] = 'sites/default/files/private';",
"# \$config['system.file']['path']['temporary'] = '/tmp';" => "\$config['system.file']['path']['temporary'] = 'sites/default/files/temp';",
]);
file_put_contents($settings_path, $settings);
// Clear settings cache.
Settings::initialize(DRUPAL_ROOT, $site_path, \Drupal::service('class_loader'));
OpCodeCache::invalidate($settings_path);
}
}
Вместо редактирования settings.php
с помощью file_put_contents()
можно пользоваться drupal_rewrite_settings()
. Тогда не придётся сбрасывать кэш.
Написанное актуально для
Drupal 8
Похожие записи
- Как удалить определённое системное сообщение
- Восстанавливаем позицию текстового курсора при ajax обновлении формы
- Как внести свои изменения в файлы ядра
- Дружим Sape и Internal Page Cache (вставка динамического содержимого в закэшированную страницу)
- Добавляем возможность использовать токены в адресе получателя контактной формы
Комментарии
Так задумано изначально или это недоработка ?
Что задумано?
Предоставление пользователя самому себе.
Что?
Троллите ?)
Речь о готовом куске кода со стороны разработчиков, чтобы можно было просто подставить значения, а не выкручиваться.
Значения можно подставить в предварительно руками созданный settings.php, об этом написано в INSTALL.txt. Здесь речь об изменении настроек из своего установочного профиля.
Да и я о том же, про профили и уменьшение ручной работы, хотя многим этого не надо.
Может намекнуть им, чтоб добавили или не стоит на такое отвлекать ?)
xandeadx, а еще одну настройку не добавляете ?
Пока не добрался до таких мелочей
Добавить комментарий