vectorserver

vectorserver

С нами с 12 декабря 2018; Место в рейтинге пользователей: #24
9 часов назад
0
Вот давно для себя писал: modx.pro/solutions/18489
или через мускул (перед выполнением обязательно сделайте дамп) напрямую + потом кеш почистить
UPDATE modx_site_content t1
JOIN (
    SELECT 
        id,
        CONCAT(alias, '-', ROW_NUMBER() OVER (PARTITION BY uri ORDER BY id ASC)) AS new_alias
    FROM 
        modx_site_content 
    WHERE 
        uri IN (
            SELECT uri 
            FROM modx_site_content 
            GROUP BY uri 
            HAVING COUNT(*) > 1
        )
        AND deleted = 0
) t2 ON t1.id = t2.id
SET 
    t1.alias = t2.new_alias
WHERE 
    t2.new_alias != t1.alias;
9 часов назад
0
Надо глянуть структуру XML что именно поменялось, если что пишите в ЛС могу посмотреть.
9 часов назад
0
Используй phpThumbOn он как раз в префиксе указывает размер изображения.
Ссылка: modstore.pro/packages/photos-and-files/phpthumbon
07 октября 2025, 16:04
0
Согласен с первым комментарием, деградация написания 80lvl.
06 октября 2025, 07:28
0
UPD: Добавлен метод OnBeforeTempFormSave (Очистка кеша при сохранении шаблона.)
30 сентября 2025, 10:52
0
Используй:
transliterator_transliterate('Any-Latin; Latin-ASCII', $tag);
www.php.net/manual/ru/transliterator.transliterate.php
30 сентября 2025, 10:49
0
Можно использовать leftJoin с таблицей modResource (или msCategory), чтобы проверить статус родителя.
Вот так примерно:
[[!msProducts?
    &element=`msProducts`
    &parents=`[[*id]]`
    &tpl=`product.tpl`
    &sortby=`id`
    &sortdir=`DESC`
    &limit=`0`
    &leftJoin=`{
        "Remains": {
          "class": "msprRemains",
          "on": "msProduct.id = Remains.product_id AND Remains.remains > 0"
        },
        "Category": {
          "class": "modResource",
          "on": "msProduct.parent = Category.id"
        }
    }`
    &groupby=`msProduct.id`
    &select=`{
        "msProduct": "*",
        "Remains": "SUM(Remains.remains) as remains"
    }`
    &where=`{
        "Remains.remains:>": "0",
        "Data.favorite":"0",
        "Category.published": 1
    }`
]]
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);
03 июня 2025, 07:57
+1
Мне хватает указать ссылки)
<?php
/** @var modX  $modx*/
/** @var modResource  $res*/
11 февраля 2025, 12:30
0
Примерно так
[[!pdoPage?
    &element=`pdoResources`
    &parents=`0` <!-- ID родителя -->
    &pageVarKey=`page` <!-- Параметр для пагинации (по умолчанию 'page') -->
    &tplPageWrapper=`@INLINE <div class="pagination">[[+prev]][[+next]]</div>` <!-- Обертка для пагинации -->
    &tplPagePrev=`@INLINE <a href="[[+href]]" class="prev">← Предыдущий</a>` <!-- Шаблон для предыдущей страницы -->
    &tplPageNext=`@INLINE <a href="[[+href]]" class="next">Следующий →</a>` <!-- Шаблон для следующей страницы -->
    &tplPagePrevEmpty=`@INLINE <span class="disabled">← Предыдущий</span>` <!-- Если предыдущей страницы нет -->
    &tplPageNextEmpty=`@INLINE <span class="disabled">Следующий →</span>` <!-- Если следующей страницы нет -->
]]
08 ноября 2024, 06:31
0
Можно и в консоли только кнопочку руками придется нажимать, одна итерация 50 ресурсов)

По второму вопросу не скажу, не вникал)
11 сентября 2024, 11:11
0
Подтверждаю все работает MODX Revolution 2.8.7-pl, PHP Version 7.4.33!
09 сентября 2024, 09:22
0
Ошибка 23000 с кодом 1062 и сообщением Duplicate entry '2024' for key 'year' указывает на то, что в таблице modx_stat_page_statistics есть уникальный индекс (или ключ), который уже содержит значение 2024 в поле year. Это значит, что вы пытаетесь вставить запись, которая нарушает уникальность в этом поле.
12 августа 2024, 13:24
0
При импорте блоков из CSV не создает дочерние ресурсы)
08 апреля 2024, 09:41
0
Сергей, спасибо за статью, оптимизировал сниппет выше!
20 марта 2024, 06:45
0
Тоже замучился но у меня форма динамическая инпуты подставляются через JS и хеш не совпадает, сделал такой костыль пока:
В assets/components/ajaxform/action.php
Закомментировал с 25 по 27 строку проверку
$_REQUEST['af_action']
Кому лень вот готовый код (костыль):
<?php
/** @var modX $modx */
define('MODX_API_MODE', true);
require_once dirname(dirname(dirname(dirname(__FILE__)))) . '/index.php';
$modx->getService('error', 'error.modError');
$modx->setLogLevel(modX::LOG_LEVEL_ERROR);
$modx->setLogTarget('FILE');

// Switch context if need
if (!empty($_REQUEST['pageId'])) {
    if ($resource = $modx->getObject('modResource', (int)$_REQUEST['pageId'])) {
        if ($resource->get('context_key') != 'web') {
            $modx->switchContext($resource->get('context_key'));
        }
        $modx->resource = $resource;
    }
}

/** @var AjaxForm $AjaxForm */
$AjaxForm = $modx->getService('ajaxform', 'AjaxForm', $modx->getOption('ajaxform_core_path', null,
        $modx->getOption('core_path') . 'components/ajaxform/') . 'model/ajaxform/', array());

if (empty($_SERVER['HTTP_X_REQUESTED_WITH']) || $_SERVER['HTTP_X_REQUESTED_WITH'] != 'XMLHttpRequest') {
    $modx->sendRedirect($modx->makeUrl($modx->getOption('site_start'), '', '', 'full'));
} /*elseif (empty($_REQUEST['af_action'])) {
    echo $AjaxForm->error('af_err_action_ns');
}*/ else {
    echo $AjaxForm->process($_REQUEST['af_action'], array_merge($_FILES, $_REQUEST));
}

@session_write_close();