+417.60
Рейтинг

Борисов Евгений

Как я понял, вопрос относится к Revo
Не придирки ради, а справедливости для… Многие программисты в сообществе выпускают компоненты беря за основу код из других компонентов, которые зачастую устаревшие. Поэтому просто оставлю свои примечания к коду

Использование $modx->config['base_path'] (как и некоторых других параметров) в коде, мне кажется дурной тон. Глядя на такой код можно подумать, что путь к вашим файлам меняется через системные настройки. Но это не так, ведь значение берется из константы MODX_BASE_PATH. Поэтому, чтобы небыло разночтений или случайных ошибок вызванных перезаписью $modx->config['base_path'], рекомендуется обращаться именно к константе.

$modx->config['base_path'] определяется только с одной целью — доступ к абсолютному пути из парсера modx через плейсхолдер [(base_path)]

$modx->Event является синонимом для $modx->event. Добавленый еще в какой-то лохматой версии. Так мы и тащим за собой это наследние. Поэтому тоже рекомендуется использовать $modx->event, чтобы не привязываться к устаревшему коду.

Ну и наконец, с версии 1.4.6, вместо $modx->event->output() рекомендуется использовать $modx->event->addOutput() как метод с более говорящим названием (в версии 2.0 метод output уже объявлен как deprecated)
Давайте начнем с того, что единственное место в папке core где вы можете вносить свои правки — папка custom. Но прежде чем пояснять как сделать, я объясню как это работает в ядре.

Есть файл core/config/view.php в котором определен ключ массива directive. Там перечислен список директив добавляемые в blade.

[
        'evoParser' => [EvolutionCMS\Support\BladeDirective::class, 'evoParser'],
        'evoLang' => [EvolutionCMS\Support\BladeDirective::class, 'evoLang'],
        'evoStyle' => [EvolutionCMS\Support\BladeDirective::class, 'evoStyle'],
        'evoAdminLang' => [EvolutionCMS\Support\BladeDirective::class, 'evoAdminLang'],
        'evoCharset' => [EvolutionCMS\Support\BladeDirective::class, 'evoCharset'],
        'evoAdminThemeUrl' => [EvolutionCMS\Support\BladeDirective::class, 'evoAdminThemeUrl'],
        'evoAdminThemeName' => [EvolutionCMS\Support\BladeDirective::class, 'evoAdminThemeName'],
        'makeUrl' => [EvolutionCMS\Support\BladeDirective::class, 'makeUrl'],

    ]

Т.е. за директиву makeUrl отвечает метод makeUrl из класса EvolutionCMS\Support\BladeDirective.

Таким образом, чтобы добавить совою директиву — необходимо зарезервировать для нее имя и подготовить код который будет заниматься преобразованием blade стиля в нативный php. Ну для примера, это будет exampleDirective. Чтобы добавить новую или изменить директиву в конфиге, нам не нужно править файл core/config/view.php (поскольку в версии 2.0.1 могут добавиться новые директивы и как вы будете потом обновлять движок со всеми этими конфликтами?). По эмы создаем файлик core/custom/config/view/directive/exampleDirective.php с содержанием вида
return [YouClass::class, 'youMethod'];
. Где YouClass это имя вашего класса, а youMethod как уже догадались — сам метод отвечающий за преобразование blade в нативный php.

Где и как правильно создать класс YouClass, чтобы он попал в автозагрузку это отдельная история. Поэтому рассмотрим варианты проще
Анонимный класс
<?php return [new class() { public function youMethod(){return '<?php phpinfo();?>';}}, 'youMethod'];

Анонимная функция
<?php return function() {
    return '<?php phpinfo();?>';
};


Именно так вы должны добавлять директиву
@exampleDirective
Создайте плагин на событии OnWebPagePrerender заменяйте в $modx->documentOutput что вам угодно на что вы хотите. ##CHUNK## или {!!{CHUNK}!!} на {{CHUNK}} и т.д.
Проверьте что вы получали до обновления и после на 71 строке файла assets/snippets/DocLister/snippet.DLGlossary.php
В анонсе 1.4.4 об этом сообщалось. Кто внимательно смотрит на список изменений — должны знать.
Нет. Ничего менять не нужно. Но в новых сниппетах рекомендуется отказаться от global
Все как и раньше. Даже без global.

В других местах где не доступен $modx, лучше использовать функцию evolutionCMS() вместо global.

P.S. Это актуально и для 1.4 ветки
потому, что обновить устаревший код и сохранить обратную совместимость — та еще задачка. Все ваши хотелки не ранее чем с версии 2.1
Очень интересно получать багрепорты сопровождаемые логами. А не просто вай-вай не работает.
А если внимательно читать топик, то об версию php можно было не споткнуться. И вместо простого error можно активировать расширеный вывод ошибки с трассировкой
Так что если для вас разницы нет, а для разработчиков есть — то будьте добры просто принять изменения как данность.
Столько хотелок и все это на легаси коде, который устарел лет так 10 назад. Нет, я понимаю, что вам нет никаой разницы как это написано, но авторам кода разница есть. Особенно когда вместо велосипедов используются готовые библиотеки. Взять тот же simpleTube. Он использует github.com/frandieguez/panorama-php и вынужден тянуть все классы за собой. А потом появится еще один компонент которому нужны эти классы. Тоже самое и с jquery, когда каждый плагин в админку внедряет свою версию. Так было и с DocLister, когда на его базе стали появляться решения.
github.com/AgelxNash/Evo-QThumb пока единственное решение
Что показывает debug? Какой текст ошибки?
Если вы дадите больше информации по этому поводу, то возможно я или кто-то еще сможет поправить.
Посмотрите логи ошибок веб-сервера, а так же логи ошибок в админке.
Вы можете написать сниппет обертку. Получать значение символа из GET параметров. Если пусто — вызывать DocLister для вывода всего каталога или отдавать текст «Необходимо выбрать букву».
Айболитом проверьте или ClamAV
Скиньте весь стек ошибки в личку или телеграмм
Нашел парочку небольших багов, о которых сразу не подумал. Фиксятся легко хаком через расширение класса.
1) Свойство $config не доступно для внешних обращений
2) При возникновении ошибки SQL запроса сайт падает из-за Exception. Это и хорошо и плохо. Хорошо, т.к. теперь можно оформить красивую страничку 500 ошибки. Плохо — по умолчанию не обрабатывается стандартными средствами движка. Как исправить смотрите ниже метод query().
3) Метод insert приводит параметр $fields по таким же правилам, как и в других методах. Соответственно из подобных запросов
$modx->getDatabase()->insert(
        array(
                'name'=>'',
                'description'=>'',
                'disabled'=>'',
                'moduleguid'=>'',
                'plugincode'=>'',
                'properties'=>'',
                'category'=>'',
                ), $modx->getDatabase()->getFullTableName('site_plugins'), // Insert into
        "CONCAT(name, ' {$_lang['duplicated_el_suffix']}{$count}') AS name, description, '1' AS disabled, moduleguid, plugincode, properties, category", $modx->getDatabase()->getFullTableName('site_plugins'), "id='{$id}'");


Мы получаем запрос на вставку данных с пустыми именами полей. Лечится так же подменой insertFrom метода.
Итого получается следующий класс
<?php namespace App;

use AgelxNash\Modx\Evo\Database\LegacyDatabase;
use AgelxNash\Modx\Evo\Database\Exceptions;

class Database extends LegacyDatabase
{
    public $config;

    public function query($sql)
    {
        try {
            return parent::query($sql);
        } catch (Exceptions\QueryException $exception) {
            $core = evolutionCMS();
            /**
             * Ошибка запроса лежит тут $exception->getMessage()
             * Код ошибки $exception->getCode()
             * Сам запрос $exception->getQuery()
             * Вместо $core->messageQuit оформляем свою страницу и делаем die();
             */
            $core->messageQuit($exception->getMessage());
        } catch (Exceptions\ConnectException $exception) {
            $core = evolutionCMS();
            /**
             * Ошибка подключения к базе. Текст ошибки $exception->getMessage()
             * Код ошибки $exception->getCode()
             * Вместо $core->messageQuit оформляем свою страницу и делаем die();
             */
            $core->messageQuit($exception->getMessage());
        } catch (\Exception $exception) {
            $core = evolutionCMS();
            $core->messageQuit($exception->getMessage());
        }
    }

    public function insertFrom(
        $fields,
        $table,
        $fromFields = '*',
        $fromTable = '',
        $where = '',
        $limit = ''
    ) {
        if (is_array($fields)) {
            $onlyKeys = true;
            foreach ($fields as $key => $value) {
                if (!empty($value)) {
                    $onlyKeys = false;
                    break;
                }
            }
            if ($onlyKeys) {
                $fields = array_keys($fields);
            }
        }

        return parent::insertFrom($fields, $table, $fromFields, $fromTable, $where, $limit);
    }
}


Именно App\Database::class нужно будет указать вместо AgelxNash\Modx\Evo\Database\LegacyDatabase::class при подмене