Всего 125 095 комментариев

Алексей Шумаев
09 июля 2025, 23:15
0
Сейчас навскидку не скажу. Скорее всего или нужно добавлять {page} всегда или добавить опцию для таких случаев.
Напишите в личку: временный доступ к админке + ссылку на нужный ресурс, придумаю что-нибудь.
Сергей Карпович
09 июля 2025, 19:05
0
Обнаружил проблему, что {page} не добавляется к заголовку страницы в режиме приоритет ресурс:
Видимо потому что у ресурса pagetitle заполнен, что логично.

Как выкрутиться из этой ситуации? Что бы у ресурса был приоритет и в тоже время шаблон {page} можно было добавить к pagetitle ресурса.
Ivan K.
09 июля 2025, 14:04
0
Значит я не зря все-таки вынес логику в сервисный класс))
Ivan K.
09 июля 2025, 13:43
+1
Точно плагин срабатывает (нормально проверил) с выключенным MODX_API_MODE.

Но чтобы выключить MODX_API_MODE тоже нужно править исходник, того же Fetchit, например.
Aleksandr Huz
09 июля 2025, 12:36
0
Пришлось проверить)))

POST-запрос на assets/components/fetchit/action.php с выключенным MODX_API_MODE вызывает как минимум событие OnHandleRequest.
Ivan K.
09 июля 2025, 12:01
0
Все-таки не минуя index.php, но из-за того, что включен режим API (MODX_API_MODE), плагины действительно не сработают.
Вы знаете вы ввергли меня в сомнения)
Попробовал, и выяснил, включен или нет API — не имеет значения плагин не срабатывает, если напрямую обращаться, например, к assets/components/fetchit/action.php
Ivan K.
09 июля 2025, 11:33
0
У компонентов FetchIt AjaxForm нет обновлений уже очень давно.

У меня есть идея использовать настройку auto_prepend_file в php.ini. Тогда не нужно будет править исходники. Не знаю стоит ли реализовывать и как это скажется на производительности.
Aleksandr Huz
09 июля 2025, 10:58
0
Все супер, но не нравится только правка исходников.

Он напрямую исполняет action.php, минуя index.php и весь основной жизненный цикл MODX.
Событие OnHandleRequest никогда не вызывается.
Все-таки не минуя index.php, но из-за того, что включен режим API (MODX_API_MODE), плагины действительно не сработают.

То есть, разработчикам нужно просто отключать режим API, чтобы плагины заработали, и тогда не придется лезть в исходники.

Но если компонент не обновлять, то и так сойдет))
Дмитрий Суворов
08 июля 2025, 15:21
+3
Вся экосистема PageBlocks вызывает огромное впечатление
Aleksandr Huz
08 июля 2025, 11:25
+2
Статью читали? В контроллерах вы сами указываете какой шаг вам нужно показывать, да что угодно, вы можете на любом шаге сделать редирект в зависимости от ответа.

Не хотите писать код, вот готовый компонент — Quiz
Сергей
08 июля 2025, 09:34
0
Может там есть смысл сделать фильтр и сохранять локальный?
if (!filter_var($ip, FILTER_VALIDATE_IP)) {	
		return '127.0.0.1';
	}
Артур Шевченко
04 июля 2025, 21:45
0
Как ты подключаешь бота к RSS каналу?
Сергей Карпович
03 июля 2025, 16:35
0
Подскажите компонент умеет из коробки импортировать товары и фото из архива?
У нас 1С будет загружать на сайт архив с таблицей с товарами и фото.
Планируется, что в настройках импорта я укажу путь к архиву. А после импорта этот архив будет удаляться компонентом.

Такой вариант возможен, или данные должны быть распакованы и указан путь к файлу с товарами?
vectorserver
03 июля 2025, 11:09
1
+1
Вот тебе решение, тут я использую сниппет phpThumbOn и проверяю файлы которые весят более 1мб и делаю ресайз по ширине 1024px, создай файл в корне сайта msproducts_resizer.php и запусти его, в журнале все сообщения!

<?php
// Ресайзер оригиналов изображений msProduct по быстрому
// Определяем режим API MODX
define('MODX_API_MODE', true);
require 'index.php';

// Инициализация MODX
/** @var modX $modx */
$modx->getService('error', 'error.modError');
$modx->setLogLevel(modX::LOG_LEVEL_FATAL);
$modx->setLogTarget(XPDO_CLI_MODE ? 'ECHO' : 'HTML');

// Путь к папке с продуктами
$basePath = MODX_BASE_PATH . 'assets/images/products/';

// Размер файла в байтах (1 МБ = 1048576 байт)
$maxFileSize = 1048576;

// Максимальная ширина после ресайза
$maxWidth = 1024;

// Логика поиска и ресайза изображений
function resizeImagesWithPhpThumb($basePath, $maxFileSize, $maxWidth)
{
    global $modx;

    // Получаем список всех подпапок в директории products
    $directories = glob($basePath . '*', GLOB_ONLYDIR);

    foreach ($directories as $dir) {
        // Получаем все файлы изображений в текущей подпапке
        $images = glob($dir . '/*.{jpg,jpeg,png,gif}', GLOB_BRACE);

        foreach ($images as $imagePath) {
            // Проверяем размер файла
            if (filesize($imagePath) > $maxFileSize) {
                try {
                    // Генерируем URL для ресайза с помощью phpThumbOn
                    $relativePath = str_replace(MODX_BASE_PATH, '', $imagePath); // Относительный путь
                    $thumbUrl = $modx->runSnippet('phpThumbOn', [
                        'input' => $relativePath,
                        'options' => "w={$maxWidth}&zc=1", // Ширина 1024px, сохранение пропорций
                    ]);

                    // Путь к новому изображению
                    $newImagePath = MODX_BASE_PATH . ltrim($thumbUrl, '/');

                    // Заменяем оригинальное изображение на новое
                    if (file_exists($newImagePath)) {
                        unlink($imagePath); // Удаляем старое изображение
                        rename($newImagePath, $imagePath); // Переименовываем новое изображение
                    }

                    // Логируем успешное изменение
                    $modx->log(modX::LOG_LEVEL_INFO, "Изображение {$imagePath} успешно изменено.");
                } catch (\Exception $e) {
                    // Логируем ошибку при обработке изображения
                    $modx->log(modX::LOG_LEVEL_ERROR, "Ошибка при обработке изображения {$imagePath}: " . $e->getMessage());
                }
            } else {
                // Логируем, если размер файла меньше порогового значения
                $modx->log(modX::LOG_LEVEL_INFO, "Изображение {$imagePath} меньше 1 МБ, пропускаем.");
            }
        }
    }
}

// Запуск логики
resizeImagesWithPhpThumb($basePath, $maxFileSize, $maxWidth);
Дмитрий
02 июля 2025, 15:45
0
Наверно сначала выполняется [[~[[+vendor.resource]]]], т к это не fenom, а потом проверяется условие…
сделал так
[[+vendor.resource:gt=`0`:then=`href="[[~[[+vendor.resource:default=`1`]]]]"`]]>[[!+vendor.name]]</a>
. Может более правильное решение?
Виктор
01 июля 2025, 23:31
0
Я ставил css файле — form .smart-captcha {height: 102px !important;}
Нормально работает, эти стили не перебивались.

Еще обнаружил странный баг в модальном окне на fancybox. Если стоит такой стиль на внешнем контейнере .modal {width: 100%;}, то бегунок капчи двигается но проверка не происходит и он снова сбрасывается в начало. Заменил параметр на «width: auto;» и все заработало.
Наумов Алексей
01 июля 2025, 17:17
0
request судя по всему null получился. но Кааак… я не знаю