Я думаю, не будет открытием тот факт, что в MODX настройки системы и компонентов хранятся в таблицах. Их аж целых 4 — modx_system_settings, modx_context_setting, modx_user_group_settings и modx_user_settings. Эта особенность, конечно, никак не способствует популярности среди авторитетных программистов. Не так давно в компоненте pdoTools было реализовано решение для работы с файловыми элементами, которые изначально также хранятся в базе данных. Я был одним из его инициаторов. Сейчас я хочу предложить подобную альтернативу для загрузки настроек из файлов. Побудило меня сделать это несколько причин.

Во-первых, я являюсь сторонником файловых элементов. Преимуществ у данного подхода перед хранением в БД больше чем минусов — проще разрабатывать, разворачивать, тестировать и поддерживать в системах контроля версий. Во-вторых, мне не очень нравится реализация в менеджере. Конечно, AdminTools с возможностью запоминания последнего фильтра немного выручает, но всё равно кривишься при мысли, что нужно туда лезть. Ведь есть 4 разных интерфейса (общие настройки, настройки контекста, настройка группы пользователей и настройки пользователя), в которых меняются значения. И нужно помнить где что указано. Ну и последнее обстоятельство, которое побудило меня использовать данное решение, это обновление HybridAuth. Со страхом решил обновиться до новой мажорной версии. И в этоге у меня перестала работать авторизация через Facebook. Потеряв пару часов, я так и не смог заставить его работать и решил откатиться до старой версии (сейчас последняя версия работает нормально — ошибка была в том, что провайдер Facebook определял протокол как HTTP вместо HTTPS). Ну и при откате мои настройки стёрлись. Так как я предварительно сделал backup, я восстановил утерянные настройки. На эту операцию пришлось затратить время. А если бы настройки хранились в файле, то всё было бы гораздо проще.

Решил я эту задачу достаточно просто. В MODX есть директория для хранения главного файла настроек — core/config/config.inc.php. Я создал там файл hybridauth.php и перенёс все настройки для компонента HybridAuth из БД в него, а в базе их удалил. Загрузка настроек происходит в плагине по событию OnHandleRequest. Зато теперь я могу в файле управлять настройками по желанию — закомментиривать, быстро изменить значения, определить условие и т.д. Ну и конечно все прелести редактирования в любимом IDE.

Ну и ещё один большой плюс — это лёгкий экспорт/импорт настроек. Меня не однократно просили сделать такую возможность в AdminTools. Но это очень непростая задача. А решение с файлами — достаточно лёгкая реализация этой задачи.

Ладно, давайте к делу.

Шаг 1. Создание плагина

switch ($modx->event->name) {
    case 'OnHandleRequest':
        $configPath= MODX_CORE_PATH . 'config/';
        if (file_exists($configPath)) {
            $files= scandir($configPath);
            foreach ($files as $file) {
                if (preg_match('/.+\.php$/',$file) && $file != MODX_CONFIG_KEY . '.inc.php') {
                    $_file = require ($configPath . $file);
                    if (is_array($_file)) $modx->config = array_merge($modx->config, $_file);
                }
            }
        } 
        break;
}

В принципе папку можно указать любую. Если загрузить конфиг на событие OnMODXInit, то дополнительно будут созданы системные плейсхолдеры (которые с двумя плюсами — [[++setting]]).

Шаг 2. Файлы настроек

Теперь вы можете в папке core/config создавать файлы настроек, которые должны возвращать массив в следующем формате — 'key'=>'value'. Простой пример файла без каких-либо условий:

<?php //mysettings.php

return [
    'setting1' => 'value1',
    'setting2' => 'value2',
];

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

Вот и всё. Вы также можете в этом файле переопределять системные настройки. Удобно для отладки и тестирования. Я уже подключил несколько файлов из своих компонентов и не заметил какой-либо дополнительной нагрузки — время загрузки страниц вообще не изменилось. В общем, жду ваших замечаний и предложений.

23 декабря 2016, 23:35   688     0

Комментарии ()

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

    Выделите опечатку и нажмите Ctrl + Enter, чтобы отправить сообщение об ошибке.