xandeadx.ru Блог музицирующего веб-девелопера

Drupal → Изменить расположение public, private и temporary директорий из инсталляционного профиля

Опубликовано в

Задача — изменить расположение 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
Похожие записи

Комментарии RSS

Так задумано изначально или это недоработка ?

Что задумано?

Предоставление пользователя самому себе.

Что?

Троллите ?)

Речь о готовом куске кода со стороны разработчиков, чтобы можно было просто подставить значения, а не выкручиваться.

Значения можно подставить в предварительно руками созданный settings.php, об этом написано в INSTALL.txt. Здесь речь об изменении настроек из своего установочного профиля.

Да и я о том же, про профили и уменьшение ручной работы, хотя многим этого не надо.

Может намекнуть им, чтоб добавили или не стоит на такое отвлекать ?)

xandeadx, а еще одну настройку не добавляете ?

В settings.php не настроена переменная trusted_host_patterns. Это потенциальная угроза безопасности вашего сайта. Крайне рекомендуется настроить этот параметр. Более подробная информация доступна на странице Защита против HTTP HOST Header атак.

Пока не добрался до таких мелочей

Оставить комментарий

Содержимое этого поля является приватным и не будет отображаться публично. Если у вас есть аккаунт в Gravatar, привязанный к этому e-mail адресу, то он будет использован для отображения аватара.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступные HTML теги: <a> <i> <b> <strong> <code> <ul> <ol> <li> <blockquote> <em> <s>
  • Строки и параграфы переносятся автоматически.
  • Подсветка кода осуществляется с помощью тегов: <code>, <css>, <html>, <ini>, <javascript>, <sql>, <php>. Поддерживаемые стили выделения кода: <foo>, [foo].

Подробнее о форматировании