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

05.11.2017

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

Комментарии

Гость
09.11.2017, 04:20

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

Гость
09.11.2017, 16:16

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

Гость
09.11.2017, 16:48

Троллите ?)

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

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

Гость
09.11.2017, 17:00

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

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

Гость
09.11.2017, 20:52

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

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

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

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