Вячеслав Варов

Вячеслав Варов

Был в сети 20 января 2026, 11:18
Заказы принимаю
У меня есть компонент работающий через migxDB и несмотря на тип поля JSON в MariaDB оно всеравно экранируется

`name` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '{}' CHECK (json_valid(`name`)),
{\"uz\":\"Abdusattarov Axmadjon Abdiraxim o\\u2018g\\u2018li\",\"ru\":\"\\u0410\\u0431\\u0434\\u0443\\u0441\\u0430\\u0442\\u0442\\u0430\\u0440\\u043e\\u0432 \\u0410\\u0445\\u043c\\u0430\\u0434\\u0436\\u043e\\u043d \\u0410\\u0431\\u0434\\u0438\\u0440\\u0430\\u0445\\u0438\\u043c \\u0443\\u0433\\u043b\\u0438\",\"en\":\"\"}
поскольку MIGX сохраняет данные в JSON внутрь таблицы modx_site_tmplvar_contentvalues где значение является строка видимо это невозможно, вот я сам и дал себе ответ… Тут как вариант написать плагин который будет сохранять MIGX поля в отдельную таблицу где будет тип данных JSON и уже оттуда делать выборку когда потребуется. Но может есть тут юди кто тоже занимался решнием похожей пробелмы и подскажут более лучшее решение?
страниц много, но как вариант возможно.

В целом конечно пока не совсем понятно как лучше настроить контроль версий, я вот пока все сунул в Docker где внутри контейнеры nginx mariadb php и исключил папку cache из контроля версий. Однако репозиторий теперь весит 1.8гб… но это уже другая история
судя по тому что я нарыл в источниках js она вызывает action — system/clearcache
Однако после ее нажатия в папке cache по прежнему много файлов и папок и удаляется далеко не все, отсюда и вопрос, как мне например при переносе в bash скрипте автоматом удалить папки и файлы чтобы избежать простоя на время пока я залогинюсь в админке и нажму на эту кнопку

на сайте настроен ci/cd и поэтому при перезаписи сайт ломается пока кэш не очистишь
Я пробовал так, в итоге происходит так, что при релизе сайта с одного окружения (stage) на другое (prod) методом миграции базы данных, мигируются и системные настройки, и пока ты вручную не удалишь папку cache полностью либо не откроешь сайт несколько раз, чтобы переписались системные настройки из статичных файлов — будут выводиться конфиги из бд. Я же полностью отказался от хранения в базе данных контур-зависимых параметров в пользу констант внутри файла config.inc.php — поскольку при миграции с одного контура на другой этот файлик не перезаписывается.
Думаю уже не актуально, но может будет кому полезно, добавил модификатор fenom который выводит размер файла и его расширение. Создать плагин и повесить его на событие pdoToolsOnFenomInit

Вызывать в виде {'linkToFile' | getFileInfo}

<?php
/** Функция обрабатывает размер файла в байтах в человекочитаемый 
    формат добавляя к размеру файла размерность, например 128 Mb
*/
if (!function_exists("human_filesize")) {
    function human_filesize($bytes, $decimals = 2)
    {
        $sz = ["B", "Kb", "Mb", "Gb", "Tb", "Pb"];
        $factor = floor((strlen($bytes) - 1) / 3);
        return sprintf("%.{$decimals}f", $bytes / pow(1024, $factor)) .
            " " .
            @$sz[$factor];
    }
}

/** @var modX $modx */
switch ($modx->event->name) {
    case "pdoToolsOnFenomInit":
        /** @var Fenom $fenom
            Мы получаем переменную $fenom при его первой инициализации и можем вызывать его методы. 
            Например, добавим модификатор вывода имени домена сайта из произвольной ссылки.
        */
        $fenom->addModifier("getFileInfo", function ($input) {
            if (file_exists($input)) {
                return strtoupper(pathinfo($input, PATHINFO_EXTENSION)) .
                    ", " .
                    human_filesize(filesize($input), 0);
            }
        });
        break;
}
и далее создал копию файла
assets/components/msearch2/action.php

Назвал ее
assets/filters/action.php

Заменил
'results' => !empty($results) ? $results : $modx->lexicon('mse2_err_no_results'),
На
'results' => !empty($results) ? $results : $pdoFetch->getChunk($scriptProperties['tplEmpty'], []),
Далее в файле js который указывается в системных настройках, у меня он assets/js/filters.min.js

Поменял assets/components/msearch2/action.php на assets/filters/action.php

PS может как-то могу поспособствовать добавив это изменение в будущие версии mFilter2?

тут правда не реализована проверка запыленности этого банка, но вроде как это не сложный функционал, на msearch2 он есть
в итоге вот к чему пришел

Заменил все вхождения
$modx->lexicon('mse2_err_no_results')
на

$mSearch2->pdoTools->getChunk($scriptProperties['tplEmpty'], $output, $fastMode);
Добился того что при загрузке страницы mfilter2 отдает чанк из параметра tplEmpty

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

Шуб по вашим критериям не найдено

Штанов по вашим критериям не найдено и тд, я вот пока склоняюсь к добавлению поля tplEmpty и настроить обработку чтобы отдавал чанк если пусто а не запись словаря
Судя по сниппету mFilter2 он действительно не поддерживает стилизацию сообщения об отсутствии результатов под капотом

if (!empty($toSeparatePlaceholders)) {
	$modx->setPlaceholders($output['filters'], $toSeparatePlaceholders);
	$output['log'] = $log;
	if (is_array($output['filters'])) {
		$output['filters'] = implode($outputSeparator, $output['filters']);
	}

	$pcre = '#^' . preg_quote($toSeparatePlaceholders) . '(\d+)$#';
	$tmp = array();
	foreach ($modx->placeholders as $k => $v) {
		if (preg_match($pcre, $k)) {
			$tmp[] = $v;
		}
	}

	$output['results'] = !empty($tmp)
		? implode($outputSeparator, $tmp)
		: $modx->lexicon('mse2_err_no_results');

	$modx->setPlaceholders($output, $toSeparatePlaceholders);
}