Лайфхак по config.inc

В modx есть файл с конфигом core/config/config.inc.php, в нем кроме установки имени базы, есть еще возможность переопределять настройки:
[[++site_name]]
{'site_name'| config}
<?php
$modx->getOption('site_name');

Но как?


1. Удаляем запись в системных настройках с ключом site_name




2. Добавляем ключ удаленной настройки

<?php
#core/config/config.inc.php
...
$config_options = array (
   'site_name' => 'Новое имя сайта', // удалить запись с этим ключем из системных настроек
);
..

И воулия))) У нас на сайте появляется название из конфига)

P.S.: только помните о том что при обновлении компонентов или системы у вас ключи заново будут созданы в БД (не забудьте удалить).

Применение


Например есть сайты dev и product, для каждого вы можете завести свой конфиг.

прописав название в файлах:
config.core.php
manager/config.core.php
connectors/config.core.php

Для dev:
<?php
...
define('MODX_CONFIG_KEY', 'dev');
...
Для product:
<?php
...
define('MODX_CONFIG_KEY', 'product');
...

Добавление своих настроек


Помимо того что вы можете переопределять старые настройки. Также вы можете создать новые:
<?php
#core/config/config.inc.php
...
$config_options = array (
   'site_name' => 'Новое имя сайта', // удалить запись с этим ключем из системных настроек
   'site_new_phone' => '88009000622',
   'site_new_work_days' => 'Каждый день с 10 до 21',
   'site_new_work_days_array' => ['Пн','Вт'] // причем можно использовать даже массив
);
..
на сайте:
[[++site_new_phone]]]
[[++site_new_work_days]]]
<?php
$modx->getOption('site_new_phone');
$modx->getOption('site_new_work_days');
Андрей Степаненко
13 мая 2020, 22:08
modx.pro
3
4 062
+15
Поблагодарить автора Отправить деньги

Комментарии: 29

Павел Бигель
14 мая 2020, 14:34
0
Есть суть в версионировании, что мешает написать резолверы?
    Андрей Степаненко
    14 мая 2020, 14:37
    0
    Для чего?
      Павел Бигель
      14 мая 2020, 14:39
      0
      Может я ошибся, но вчера видел тут (вроде тут) что основная причина такого хака — версионирование. Мол ClientConfig сложнее версионировать. Так можно же написать резолвер, который будет гонять данные в ClientConfig
        Андрей Степаненко
        14 мая 2020, 14:51
        0
        про ClientConfig смысла наверное нету все таки упоминать.
        Тут идея в том чтобы иметь разные настройки у сайтов и добавлять новые через файл.
        С файлом куда проще работать чем с БД, это еще даже если не брать во внимание работу с git.
    Сергей Шлоков
    15 мая 2020, 09:51
    +3
    При всём уважении, делать так не нужно. Просто создайте php файлик со своими системными настройками и загружайте его на событие OnMODXInit /OnHandleRequest. И тогда не нужны все эти манипуляции и проблемы с обновлением MODX. Как это сделать я говорил ещё в 2016 году.
      Андрей Степаненко
      15 мая 2020, 10:46
      0
      То же хороший вариант.
      А cache_path кажется не получиться сменить?
        Сергей Шлоков
        15 мая 2020, 11:33
        0
        Почему?
          Андрей Степаненко
          15 мая 2020, 11:36
          0
          а как?))
          Пытался найти как изменить cache_path у класса xPDOCacheManager не нашел)
            Сергей Шлоков
            15 мая 2020, 12:24
            0
            Посмотрел в код. Конкретно эту настройку через системные настройки не изменить. Нужно или прописывать в $config_options
            $config_options = array (
               'cache_path' => 'path/to/cache/folder/',
            );
            или в своих коннекторах, где создается объект $modx указать параметры инициализации
            <?php
            // Boot up MODX
            require_once dirname(dirname(__FILE__)) . '/config.core.php';
            require_once MODX_CORE_PATH . 'model/modx/modx.class.php';
            $modx = new modX('', ['cache_path' => 'path/to/cache/folder/',]);
        Олег Щавелев
        15 мая 2020, 12:00
        0
        +@Сергей Шлоков А можно уточнить почему. Я уже много лет читаю твой ресурс. И статью твою читал. Но почему данный способ не рекомендованный. Как дойти до данного утверждения?
          Николай Савин
          15 мая 2020, 12:24
          0
          Потому что не будет проблем с обновлением MODX
            Андрей Степаненко
            15 мая 2020, 12:28
            0
            проблем с обновлением в любом случае не будет))
            Тут проблем в том что если удалишь site_name то при обновлении он заново будет создан.
              Николай Савин
              15 мая 2020, 12:31
              +1
              Я понимаю, конфиг не перезапишется. Хорошо — назовем это словом неудобство. Лишние манипуляции программисту. А вот если не будет программиста — попробуй разберись — чего это вдруг другая системная настройка появилась и где она определяется.
                Андрей Степаненко
                15 мая 2020, 12:43
                0
                Это да, но для работы с двумя сайтами одновременно у тебя в любом случае настройки у dev версии будут отличатся от product

                Варианты:
                1. Указывать через конфиг config.inc.php (с удалением записи в бд.)
                2. Добавить плагин через modzone.ru/blog/2016/12/23/downloaded-configs-from-files/
                  Андрей Степаненко
                  15 мая 2020, 12:44
                  0
                  Оба вариант подходящие. Но они 100% не рассчитаны на менеджеров сайта))
              Сергей Шлоков
              15 мая 2020, 12:28
              0
              Автор в постскриптуме указал почему. Плюс не очень удобно. Нужную настройку нужно обязательно удалить, иначе данный способ переопределения настройки не сработает. Т.е. придется лезть в админку.

              В моем варианте можно переопределять любые системные настройки. Они сразу будут применены. Кроме того, новые файлы подключаются автоматом.

              П.С. Файл конфига редактировать никто не запрещает. Он индивидуальный и его при обновлении никогда не трогают.
                Андрей Степаненко
                15 мая 2020, 12:32
                0
                Почти все:
                cache_path — однозначно нужно в файле config.inc.php заменять
                  Сергей Шлоков
                  15 мая 2020, 12:51
                  0
                  Почти все:
                  Ну мы же понимаем, что говорим об открытых системных настройках, доступных к изменению. ;)

                  cache_path — однозначно нужно в файле config.inc.php заменять
                  Осталось только понять зачем?
                    Андрей Степаненко
                    15 мая 2020, 13:04
                    0
                    Делаю чтобы на основе домена подменялась папка с кэшем, чтобы не вызывало проблем с кэшем на страницах.

                    Написал плагин, который во время сброса кэша срабатывает и удаляет директории с кэшем городов.
                    Ну и по аналогии обновление ресурсов при сохранении.

                    В папке
                    /core/cache/
                    создаются папки
                    /core/cache/city/kemerovo
                    /core/cache/city/moskva
                    Собственно так и выяснялось что в классе xPDOCacheManager невозможно изменить cache_path

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

                    Текущее решение очень простое и работает)
                      Андрей Степаненко
                      15 мая 2020, 13:10
                      0
                      В списке городов хранятся синонимы (Москва, Москве) которые так же пишутся в настройки. Ну это уже здесь не обязательно, можно уже ниже вынести в базу или как в твоем варианте в отдельные файлы.
                    Сергей Шлоков
                    15 мая 2020, 12:43
                    0
                    @Олег Щавелев Плюс, хорошим тоном считается разделять настройки. Пример — Ларавел.

                    Пользовательские настройки также лучше не мешать с системными, а вынести в отдельный файл. Тогда другой программист поймёт, какие настройки устанавливает система, а какие — переопределил пользователь.
                      Андрей Степаненко
                      15 мая 2020, 13:57
                      1
                      0
                      В общем вот решение для dev и product
                      <?php
                      switch ($modx->event->name) {
                          case 'OnHandleRequest':
                              // Загрузка общих настроек
                              $site_all = MODX_CORE_PATH . 'config/settings/';
                              if (file_exists($site_all) and is_dir($site_all)) {
                                  foreach (glob($site_all . '*.inc.php') as $file) {
                                      $response = require($file);
                                      if (is_array($response)) $modx->config = array_merge($modx->config, $response);
                                  }
                              }
                              
                              // Конфигурация для сайта с конфигом MODX_CONFIG_KEY
                              $site_dir = MODX_CORE_PATH . 'config/settings/' . MODX_CONFIG_KEY.'/';
                              
                              if (file_exists($site_dir) and is_dir($site_dir)) {
                                  foreach (glob($site_dir . '*.inc.php') as $file) {
                                      $response = require($file);
                                      if (is_array($response)) $modx->config = array_merge($modx->config, $response);
                                  }
                              }
                              break;
                      }
                      Структура папок
                      core/config/dev.inc.php
                      core/config/settings/*.inc.php # здесь общие настройки
                      core/config/settings/dev/*.inc.php # здесь настройки персонально для dev (MODX_CONFIG_KEY)
                        Вячеслав Варов
                        27 июля 2024, 00:35
                        0
                        А возможно ли и настройки контекстов сюда вынести?
                          Вячеслав Варов
                          27 июля 2024, 00:56
                          1
                          0
                          Отвечаю на свой же вопрос — можно вот так

                          <?php
                          switch ($modx->event->name) {
                              case 'OnHandleRequest':
                                  // Загрузка общих настроек
                                  $site_all = MODX_CORE_PATH . 'config/settings/';
                                  if (file_exists($site_all) && is_dir($site_all)) {
                                      foreach (glob($site_all . '*.inc.php') as $file) {
                                          $response = require($file);
                                          if (is_array($response)) {
                                              $modx->config = array_merge($modx->config, $response);
                                          }
                                      }
                                  }
                                  
                                  // Конфигурация для сайта с конфигом MODX_CONFIG_KEY
                                  $site_dir = MODX_CORE_PATH . 'config/settings/' . MODX_CONFIG_KEY . '/';
                                  
                                  if (file_exists($site_dir) && is_dir($site_dir)) {
                                      foreach (glob($site_dir . '*.inc.php') as $file) {
                                          $response = require($file);
                                          if (is_array($response)) {
                                              $modx->config = array_merge($modx->config, $response);
                                          }
                                      }
                                  }
                                  
                                  // Конфигурация для текущего контекста
                                  $context_key = $modx->context->get('key');
                                  $context_dir = MODX_CORE_PATH . 'config/settings/' . $context_key . '/';
                                  
                                  if (file_exists($context_dir) && is_dir($context_dir)) {
                                      foreach (glob($context_dir . '*.inc.php') as $file) {
                                          $response = require($file);
                                          if (is_array($response)) {
                                              $modx->config = array_merge($modx->config, $response);
                                          }
                                      }
                                  }
                                  break;
                          }
                          ?>
                          Структура папок
                          core/
                          └── config/
                              └── settings/
                                  ├── common.inc.php           // Общие настройки
                                  ├── config1/
                                  │   └── config1-settings.inc.php   // Настройки для MODX_CONFIG_KEY = config1
                                  ├── config2/
                                  │   └── config2-settings.inc.php   // Настройки для MODX_CONFIG_KEY = config2
                                  ├── web/
                                  │   └── web-settings.inc.php       // Настройки для контекста web
                                  └── en/
                                      └── en-settings.inc.php        // Настройки для контекста en
                          Вид настроек например для
                          core/config/settings/en/en-settings.inc.php
                          <?php
                          return [
                              'site_url' => 'https://your-uz-site-url.com/',
                              // Добавьте другие настройки контекста здесь
                          ];
                          ?>
                            Вячеслав Варов
                            29 июля 2024, 17:24
                            0
                            Докрутил, ранее не подтягивались настройки если запрашивать из одного контекста настройки другого
                            <?php
                            switch ($modx->event->name) {
                                case 'OnHandleRequest':
                                    // Функция для загрузки настроек из файлов
                                    function loadSettings($directory) {
                                        $settings = [];
                                        if (file_exists($directory) && is_dir($directory)) {
                                            foreach (glob($directory . '*.inc.php') as $file) {
                                                $response = require($file);
                                                if (is_array($response)) {
                                                    $settings = array_merge($settings, $response);
                                                }
                                            }
                                        }
                                        return $settings;
                                    }
                            
                                    // Загрузка общих настроек
                                    $site_all = MODX_CORE_PATH . 'config/settings/';
                                    $globalSettings = loadSettings($site_all);
                            
                                    // Конфигурация для сайта с конфигом MODX_CONFIG_KEY
                                    $site_dir = MODX_CORE_PATH . 'config/settings/' . MODX_CONFIG_KEY . '/';
                                    $configKeySettings = loadSettings($site_dir);
                            
                                    // Конфигурация для текущего контекста
                                    $context_key = $modx->context->get('key');
                                    $context_dir = MODX_CORE_PATH . 'config/settings/' . $context_key . '/';
                                    $contextSettings = loadSettings($context_dir);
                            
                                    // Объединение всех настроек
                                    $allSettings = array_merge($globalSettings, $configKeySettings, $contextSettings);
                            
                                    // Применение настроек к текущему контексту
                                    foreach ($allSettings as $key => $value) {
                                        $modx->context->setOption($key, $value);
                            
                                        // Сохранение настроек в базе данных
                                        $setting = $modx->getObject('modContextSetting', [
                                            'context_key' => $context_key,
                                            'key' => $key
                                        ]);
                                        if (!$setting) {
                                            $setting = $modx->newObject('modContextSetting');
                                            $setting->set('context_key', $context_key);
                                            $setting->set('key', $key);
                                        }
                                        $setting->set('value', $value);
                                        $setting->save();
                                    }
                                    break;
                            }
                            ?>
                  Андрей Степаненко
                  15 мая 2020, 12:54
                  1
                  0
                  Лучше так
                  <?php
                  switch ($modx->event->name) {
                      case 'OnHandleRequest':
                          foreach (glob(MODX_CORE_PATH . 'config/settings/*.php') as $file) {
                              $response = require ($file);
                              if (is_array($response)) $modx->config = array_merge($modx->config, $response);
                          }
                      break;
                  }
                  а то если несколько конфигов будет, то MODX_CONFIG_KEY не поможет.
                    Евгений Шеронов
                    18 мая 2020, 11:52
                    0
                    Только так работать не должно, потому что require возвращает true или падает с ошибкой.

                    А переменные, определённые в файле становятся доступны в текущей области действия.
                    Если же массив с настройками там называется $config_options, то получать его лучше так:
                    //...
                    require $file;
                    if (isset($config_options) && is_array($config_options)) {
                        $modx->config = array_merge($modx->config, $config_options);
                    }
                    //...
                      Андрей Степаненко
                      18 мая 2020, 11:54
                      +1
                      в этом коде нету переменных, там return
                        Евгений Шеронов
                        18 мая 2020, 12:14
                        0
                        Действительно, а я подумал, что все файлы имеют такой же вид, как в статье описан пример конфига.

                        Ну теперь это очевидно для всех, что в тех файлах настроек должен быть return, чтобы способ сработал.
                        Но даже если там будут переменные, они также включатся в эту область.
                  Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                  29