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

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

С нами с 06 сентября 2016; Место в рейтинге пользователей: #228
Вячеслав Варов
12 ноября 2024, 07:35
0
страниц много, но как вариант возможно.

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

на сайте настроен ci/cd и поэтому при перезаписи сайт ломается пока кэш не очистишь
Вячеслав Варов
16 октября 2024, 16:21
0
ну это я читал, я так и не понял сама кнопка запускает refresh или clearcache
Вячеслав Варов
20 сентября 2024, 12:21
0
Я пробовал так, в итоге происходит так, что при релизе сайта с одного окружения (stage) на другое (prod) методом миграции базы данных, мигируются и системные настройки, и пока ты вручную не удалишь папку cache полностью либо не откроешь сайт несколько раз, чтобы переписались системные настройки из статичных файлов — будут выводиться конфиги из бд. Я же полностью отказался от хранения в базе данных контур-зависимых параметров в пользу констант внутри файла config.inc.php — поскольку при миграции с одного контура на другой этот файлик не перезаписывается.
Вячеслав Варов
19 сентября 2024, 10:24
0
Реализовал через константы в файле config.core.php и вывод через феном в
{$.const.CONSTANT}
Вячеслав Варов
17 сентября 2024, 11:35
0
а ну такое не подходит( у меня очень много вложенных конфигураций для каждой tv создать то еще веселье) у меня около 150 конфигураций)
Вячеслав Варов
17 сентября 2024, 09:12
0
А есть туториала о том как компоненты с конфигурациями migx пилить?
Вячеслав Варов
16 сентября 2024, 19:01
0
Это понятно, а как подключить файл чтобы все конфигурации цеплялись из статичных файлов а не из бд
Вячеслав Варов
30 августа 2024, 09:39
0
Но ссылка тоже не совсем удобно, поскольку она генерит 301 редиректы, и вручную нужно вставлять ссылку на документ — нельзя выбрать через медиаисточник
Вячеслав Варов
30 августа 2024, 08:48
0
Думаю уже не актуально, но может будет кому полезно, добавил модификатор 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;
}
Вячеслав Варов
30 августа 2024, 08:33
0
это когда генерируешь страницу — да будет работать, у меня же задача прицепить сам файл pdf
Вячеслав Варов
29 августа 2024, 13:43
0
А нашел, для этого можно использовать тип ресурса Ссылка
Вячеслав Варов
28 августа 2024, 17:00
0
и далее создал копию файла
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 он есть
Вячеслав Варов
28 августа 2024, 16:44
0
Еще не совсем понимаю как ловится событие post в mfilter2 я думал плагином, а в итоге нет, как оно работает?

Понял, в файле assets/components/msearch2/action.php вся логика
Вячеслав Варов
28 августа 2024, 16:37
0
в итоге вот к чему пришел

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

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

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

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

Штанов по вашим критериям не найдено и тд, я вот пока склоняюсь к добавлению поля tplEmpty и настроить обработку чтобы отдавал чанк если пусто а не запись словаря
Вячеслав Варов
28 августа 2024, 14:27
0
Судя по сниппету 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);
}
Вячеслав Варов
08 августа 2024, 19:59
0
Сейчас возвращает строку c data, что с ней делать пока не понятно

string(50031) "Array ( [id] => 51 [type] => document [contentType].....
Вячеслав Варов
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;
}
?>