Финансовая поддержка VPS, бесплатные дополнения и docs Донаты оплачивают сервер и двигают бесплатные дополнения MODX и документацию. Поддержать

Всего 126 133 комментария

Wassi Wassinen
Wassi Wassinen
@Наумов Алексей нашёл ещё баг. В источнике файлов для Fileman указываю максимальный размер файла. Он больше, чем в системных настройках. Но не даёт загружать — подтягивает ограничение из системных настроек.
Артур Шевченко
Артур Шевченко
Вот код сниппета, который выбирает нужные данные из БД и форматирует их в нужный вид
$tablePrefix = $modx->getOption('table_prefix');
$sql = "SELECT Product.pagetitle AS name, Data.price AS price, Parent.pagetitle AS parent FROM {$tablePrefix}site_content Product
LEFT JOIN {$tablePrefix}ms2_products Data ON Product.id = Data.id 
LEFT JOIN {$tablePrefix}site_content Parent ON Product.parent = Parent.id
WHERE Product.class_key = 'msProduct'";
$statement = $modx->query($sql);
$products = $statement->fetchAll(PDO::FETCH_ASSOC);
$output = [];
foreach ($products as $product) {
    $output[$product['parent']][] = $product;
}
return $output;
Виктор
Виктор
Pandemic
Pandemic
Возможно у меня была проблема из-за того что в настройках мсинка установлена галка, чтобы публиковать в любом случае, и получается мои плагины на событие отрабатывают верно, но настройка мсинка отрабатывает позже, и перебивает друг друга, а на на импорте торговых предложений просто, отрабатывает как надо.
Но всё же как-то это событие должно лучше подходить «mSyncOnBeforeImportProduct» так как оно убирает доп сохранение ресурса, вместо условно двух, будет 1.
Сергей Карпович
Сергей Карпович
У меня такой плагин работает на событие «mSyncOnProductImport»

<?php
/*
    https://docs.modx.pro/components/msync/events-and-plugins
    mSyncOnProductImport:
    $mode: Строка "category" для категорий или "create" для новых товаров или "update" для обновления товара. 
    $resource: Объект msCategory или msProduct. Объект минишопа, созданный или обновленный в данный момент
    $properties: array Массив свойств товара, извлеченных из XML, пустой для категории.
    $data: Объект mSyncCategoryData или mSyncProductData. Объект привязки категории или товара 1С к объектам минишопа
*/

if ($modx->event->name != 'mSyncOnProductImport') return;

/*
    Проверим, что свойство "Исключить из публикации на веб-сайтах" передано в выгрузке из 1С 
    (может и не быть). Если его нет значит данное свойство не поддерживается в базе 1С и 
    ничего не делаем. Если есть и это товар тогда делаем что надо.
*/
if ( is_a($resource, 'msProduct') ) {
    if ( array_key_exists('Исключить из публикации на веб-сайтах', $properties) ) {
        $hide = mb_strtoupper($properties['Исключить из публикации на веб-сайтах']) === mb_strtoupper('Да');
        if ( !isset($mSync) ) {
            $mSync = $modx->getService('msync', 'mSync', $modx->getOption('msync_core_path', null, $modx->getOption('core_path') . 'components/msync/') . 'model/msync/', array());
        }
        if ($hide) {
            // Если параметр передан и имеет значение Да, скрываем номенклатуру:
            $resource->set('deleted', 1);
            $resource->set('deletedby', $mSync->config['user_id_import']);
            $resource->set('deletedon', time());
            $resource->save();
            $mSync->log('Товар с идентификатором ' . $resource->get('id') . ' помечен удаленным.', 1);
        } else {
            // Если параметр передан и имеет другое значение, восстанавливаем номенклатуру:
            if ($resource->get('deleted') == 1) {
                $resource->set('deleted', 0);
                $resource->save();
                $mSync->log('Товар с идентификатором ' . $resource->get('id') . ' восстановлен из корзины.', 1);    
            }
        }
    }
}
Pandemic
Pandemic
Обновлённые методы
pdoPage.Hash = {
get: function () {
    coockieHash = readCookie('pdoPage');
    var vars = {}, hash, splitter, hashes;

    hashes = decodeURIComponent(coockieHash.substr(1)).replace('+', ' ');
    splitter = '/';
    
    if (hashes.length == 0) {
        return vars;
    }
    else {
        hashes = hashes.split(splitter);
    }
    
    var matches, key;
    for (var i in hashes) {
        if (hashes.hasOwnProperty(i)) {
            hash = hashes[i].split('=');
            if (typeof hash[1] == 'undefined') {
                vars['anchor'] = hash[0];
            }
            else {
                matches = hash[0].match(/\[(.*?|)\]$/);
                if (matches) {
                    key = hash[0].replace(matches[0], '');
                    if (!vars.hasOwnProperty(key)) {
                        // Array
                        if (matches[1] == '') {
                            vars[key] = [];
                        }
                        // Object
                        else {
                            vars[key] = {};
                        }
                    }
                    if (vars[key] instanceof Array) {
                        vars[key].push(hash[1]);
                    }
                    else {
                        vars[key][matches[1]] = hash[1];
                    }
                }
                else {
                    vars[hash[0]] = hash[1];
                }
            }
        }
    }
    return vars;
},

set: function (vars) {
    var hash = '';
    for (var i in vars) {
        if (vars.hasOwnProperty(i)) {
            if (typeof vars[i] == 'object') {
                for (var j in vars[i]) {
                    if (vars[i].hasOwnProperty(j)) {
                        if (vars[i] instanceof Array) {
                            hash += '&' + i + '[]=' + vars[i][j];
                        }
                        else {
                            hash += '&' + i + '[' + j + ']=' + vars[i][j];
                        }
                    }
                }
            }
            else {
                hash += '&' + i + '=' + vars[i];
            }
        }
    }
    if (hash.length != 0) {
        hash = '?' + hash.substr(1);
    }
    eraseCookie('pdoPage');
    createCookie('pdoPage', hash, 2);
},
}
Александр Мельник
Александр Мельник
Обнаружил и у себя такую же ошибку.
[2024-02-23 10:44:55] (ERROR @ /home/somedir/public_html/core/xpdo/xpdo.class.php : 644) Could not load class: pdofetch from pdotools.pdofetch.
[2024-02-23 10:44:55] (ERROR @ /home/somedir/public_html/core/xpdo/xpdo.class.php : 1248) Problem getting service pdoFetch, instance of class pdotools.pdofetch, from path 
[2024-02-23 10:44:55] (ERROR @ /home/somedir/public_html/core/components/minishop2/model/minishop2/minishop2.class.php : 642) pdoTools not installed, metadata for miniShop2 objects not loaded
modx 2.8.6
minishop 3.0.7
pdotools 2.13.2
php 7.4
устанавливал из modstore.pro

ps. при этом fenom работает. Кстати еще при инсталяции minishop заметил, что в окне установки отображались красным ошибки, что не найден pdoTools, но я посчитал что это нормально, поскольку на тот момент еще не устанавливал pdoTools
Евгений
Евгений
Спасибо за перевод, сам не дорос еще до fenom, поэтому мне было полезно.
Нашел ошибочку в чанке rowtpl,
&tpl=`xhttmltpl`
одна t лишняя
И вопрос- зачем создавать перевод sitemap.xml? Нам ведь не нужен еще один sitemap?
и создаём копию(перевод) ресурса для контекста En
Алексей Смирнов
Алексей Смирнов
Понял.
Вариант первого решения:
1) 1 вызов pdoRes.
2) В чанке записываете в плейсхолдер вторую часть Html с нужными данными
3) в коде получаете 1 область вывод через PdoRes, а вторая — плейсхолдер.

Вариант 2.
1) 1 вызов pdoRes с указанием return => data. в этом случае вам придет голый массив.
2) с помощью не хитрых манипуляций типа foreach и прочих переменных фенома можно разделить данные в нужные блоки и вывести как хотите.

Это вкратце. те вызывать 2 раза pdoRes нет необходимости.
Дмитрий
Дмитрий
Спасибо, интересная заметка.

В общем я сделал так:
$_GET = array_diff_assoc($_REQUEST, $_COOKIE);
Единственное, в url в пагинации остается параметр limit=

*?page=3&limit=36

Но при переходе он очищается из url.