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

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 получился. но Кааак… я не знаю
Сергей
01 июля 2025, 15:38
0
С чем может быть связано появление 500 ошибки Call to a member function getClientIp() on null после отправки формы (в итоге не отправляется)?
Сергей
01 июля 2025, 13:35
0
К сожалению, нет. Хотя там сейчас есть новая версия, возможно это пофиксили. Как предположение у меня js не был закрыт ;. Сейчас обновил, проверил, вроде работает корректно. 1.0.3 версия.
Ivan K.
30 июня 2025, 21:17
+5
Безусловно, использование Git является золотым стандартом в современной разработке.
Позвольте я объясню, почему IskFileGuardian является не заменой, а дополнением к таким практикам, и для кого он предназначен в первую очередь.
IskFileGuardian создан для другой аудитории и решает несколько иные задачи:
MODX часто используют менеджеры контента, владельцы малого бизнеса, веб-мастера, которые не работают с Git и не имеют SSH-доступа к серверу. Из собственного опыта скажу, многие не закрывают даже доступ к папке /core/ — типа и так сойдет.
Компонент предоставляет им интуитивно понятный интерфейс прямо в админке MODX, не требуя технических навыков.

Скрипт с git status требует настроенного Git на сервере и прав на его выполнение через cron.
Мой компонент работает на любом шаред-хостинге, где есть PHP и MODX.
Git — это инструмент для разработчика на этапе разработки и деплоя.
IskFileGuardian — это инструмент для администратора/владельца сайта на этапе эксплуатации и мониторинга безопасности. Это разные плоскости применения.

Команда git status отслеживает изменения только в файлах, которые индексируются Git. Она целенаправленно игнорирует все, что указано в файле .gitignore. Что обычно находится в .gitignore на проекте MODX?
Кэш (/core/cache/)
Загружаемые пользователями файлы (/assets/uploads/, /images/)
Логи и сессии
Иногда — папки с компонентами, установленными из репозитория MODX.

Хацкер, получивший доступ к сайту, с вероятностью 99% загрузит веб-шелл или бэкдор именно в одну из этих папок. git status никогда не покажет этот новый файл.
Николай Савин
30 июня 2025, 19:19
0
Ну держать весь код проекта (за исключением gitignore) в гите как будто промышленный стандарт. Я давно не видел не одного серьезного проекта, который бы работал как-то по другому.
Павел Голубев
29 июня 2025, 16:46
+1
Для этого git на проде должен быть + весь код проекта должен в нём хранится. А во многих проектах git или нет вообще или только часть кода в нём.
Николай Савин
28 июня 2025, 11:21
0
Искренне не понимаю, что мешает сделать тоже самое через git status, и если будет получен непустой ответ — отправить письмо админу с содержанием ответа.
Александр
26 июня 2025, 15:08
0
Скажите а когда примерно ожидать версию под MODX3?
Aleksandr Huz
26 июня 2025, 11:01
+1
Нет ли каких-то сроков, когда можно будет «пощупать»?
в планах до 15.07, если все будет ок.

Или пока хотя бы планируемый функционал.
Пока, что базовый функционал.
Алексей Шумаев
26 июня 2025, 10:10
+1
Магазин в составе единой экосистемы pb очень интересен, особенно для modx3. Нет ли каких-то сроков, когда можно будет «пощупать»? Или пока хотя бы планируемый функционал.
Aleksandr Huz
25 июня 2025, 14:30
+1
[1.0.1-pl] — 2025-06-25

Добавлено
  • Загрузка аватарки
  • Автоматическое добавление пользователя в группу при регистрации
Улучшено
  • Валидация форм
Изменено
  • Импорт `Request` заменён на `Http\Request`
Сергей
24 июня 2025, 18:51
0
Спасибо, я его смотрел но не уверен, что он поможет в данной ситуации. Я добавил кастомный плагин и он решил эту проблему, удивительно что у меня у одного такая проблема) Возможно не все отслеживают сервер)
Сергей Карпович
24 июня 2025, 15:51
0
Всем привет, кто может подсказать, столкнулся с проблемой (msMCD 2.2.1):
Для добавления товара использую сниппет msMCDCount
При нажатии на +, товар добавляется в корзину, но в сниппет не возвращается key, дальнешее изменение количества товара работает неверно.
Но если перезагрузить страницу — то key прописывается и переключатель работает верно.
Также, если до первого добавления товара в корзину нажать на -, появится ошибка что количество не верное, а затем нажать на +, то товар добавляется в корзину и key возвращается в сниппет.

Не понимаю, что ему нужно, что бы сразу работало верно
Максим
24 июня 2025, 07:50
0
Для решения данной проблемы нужно просто добавить NULL в значение по-умолчанию для поля position на уровне базы данных.
Ivan K.
23 июня 2025, 15:13
0
Попробуйте мой компонент. IskWaf — Web Application Firewall (MODX3) iskwaf2x (MODX2)
Может поможет.
А то мало скачиваний даже немного обидно))
Сергей
23 июня 2025, 09:08
0
Не знаю как у вас, но у меня продолжаются атаки. Плагин спасает. Похоже придется ставить на все сайты, где есть minishop2