Alexey

Alexey

С нами с 02 августа 2015; Место в рейтинге пользователей: #109
03 февраля 2023, 17:20
0
Привет!

Я не разбирался в сессиях компонента, если честно. Но у mSync есть событие mSyncAfterImport, по которому принимается массив выгруженных товаров: новых и обновленных. На мой взгляд, проще написать плагин на это событие, в котором будут прилетать выгруженные товары. И потом их сравнить с существующими на сайте.

Вот пример плагина, который публикует товары, которые были в выгрузке (перед импортом весь каталог снимается с публикации, но это в другом плагине):

if ($modx->event->name == 'mSyncAfterImport') {
    $good_ids = $importResources['product']['updated'];
    $good_ids = array_unique(array_merge($good_ids, $importResources['product']['created']));
    $query = $modx->newQuery('modResource');
    $query->command('update');
    $query->where(array('class_key' => 'msProduct', 'published' => 0, 'id:IN' => $good_ids));
    $query->set(array(
        'published' => 1
    ));
    $query->prepare();
    $query->stmt->execute(); 
    $modx->cacheManager->refresh();
}

Чутка доработать его и всё норм будет)
13 января 2023, 07:45
1
+1
Попробуй так:

$modx->log(modX::LOG_LEVEL_ERROR, print_r($dt, 1));

Это вариант для логирования массива
12 января 2023, 20:51
0
Перечитал свой коммент и понял, что коряво сформулировал. Артур прав, конечно, файлы из js никак не могут попасть на сервер, при помощи библиотеки dropzone они отправляются по урлу, указанному в action. И уже php-обработчик их отлавливает и может залить в нужную директорию.

Вот что я имел в виду, говоря «сразу попадают на сервер во временную папку».
12 января 2023, 14:43
0
Файлы, закинутые через dropzone, сразу попадают на сервер во временную папку, и ими можно манипулировать через отдельный php-загрузчик. И да — эти файлы в форме не прикрепляются к инпуту с типом file, так как они уже на сервере. Если, в процессе загрузки файлов обработчиком их складывать в определенную папку, то потом при помощи хука их можно прикрепить к письму. Получается, что стандартный хук mail для formIt не подходит, нужно мутить свой.

Если не прав, сорри, пишу по памяти) Возможно, есть ещё какие-то лайт-варианты.
07 января 2023, 12:15
0
docs.modx.pro/komponentyi/pdotools/parser#%D0%A1%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%BD%D1%8B%D0%B5-%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5

Попробуй $.server['DOCUMENT_ROOT']. Я сам ни разу не использовал, но — судя по мануалу — может сработать
07 января 2023, 11:59
1
0
if ($input && file_exists($path)) {

Делай доп. проверку на пустоту tv -поля
07 января 2023, 11:36
0
Если картинки лежат на этом же сервере, то нужно указывать путь от корня сервера, а не http. А если файлы лежат в удалённом хранилище, то file_exists в этом случае не работает — www.nomostech.it/2022/02/20/checking-if-a-file-exists-on-a-remote-server-with-php/
06 января 2023, 20:19
1
+1
Привет!

rtfm.modx.com/current/ru/extending-modx/plugins/system-events/ondocformsave

Плагин на это событие не подойдёт?
26 декабря 2022, 07:38
0
Покажите вызов сниппета, который вызываете в шаблоне.
25 декабря 2022, 23:35
0
Вот здесь отличный пример через xpdo с джоинами полей TV.
25 декабря 2022, 20:59
+1
В вызове сниппета в includeTVs названия этих доп полей прописаны? Если нет, то нужно добавить через запятую.
04 декабря 2022, 11:40
0
У $_modx->resource.pagetitle убрать кавычки?
30 ноября 2022, 08:42
+2
Да, вчера обратил внимание, что если закомментить указанную строку в файле processors/mgr/file/export.class.php ( if ($new_session == 'new_session') ), то начинается проблема при запуске генерации прайса с большим количеством позиций из админки, там же за несколько этапов генерация идет, каждый раз новую сессию создавая, и подумал, что нужно попозжЕ попытаться пробросить параметр из скрипта для крона, но vectorserver опередил))), за что ему снова человеческое спасибо!

Кстати, при запуске кода для крона, можно убрать эту строку:

$modx->user = $modx->getObject('modUser', 1);

авторизация при запуске процессора не требуется, как выяснилось — проверил в инкогнито, всё работает.
29 ноября 2022, 16:35
+1
Совсем забыл про существенный момент — столько времени компонент ковырял, что память стала подводить))

В файле core/components/mspricelist/processors/mgr/file/export.class.php в методе startExport закомментил это условие:



Без этого запуск генерации прайс-листа из внешнего файла не происходит
28 ноября 2022, 18:26
1
+2
Рабочее решение, благодарность @vectorserver:

define('MODX_API_MODE', true);
require '../index.php';

$modx->user = $modx->getObject('modUser', 1);

$msPriceList = $modx->getService('msPriceList', 'msPriceList', MODX_CORE_PATH . 'components/mspricelist/model/');
$modx->lexicon->load('mspricelist:default');

$corePath = $modx->getOption('mspricelist_core_path', null, $modx->getOption('core_path') . 'components/mspricelist/');
$path = $modx->getOption('processorsPath', $msPriceList->config, $corePath . 'processors/');

$params = array(
    'crontab' => true,
    'id' => 2,
);

/* @var modProcessorResponse $response */
$response = $modx->runProcessor('mgr/file/export', $params, array(
    'processors_path' => $path
));

if ($response->isError()) {
    die( $response->getMessage() );
} else{
    echo "cron OK";
}
28 ноября 2022, 16:05
0
@Андрей Степаненко будьте добры, ответьте на вопрос по крону. Либо тут, либо в ТП модстора. Уже неделю тишина. Проблема та же — по крону не запускается генерация прайс-листа
27 ноября 2022, 14:26
0
www.mail-tester.com/

Вот неплохой сервис для тестирования. Бесплатно 3 попытки в сутки позволяет.

И ещё частенько из-за неверной системной настройки emailsender в спам летят письма. Должно быть типа no-reply@site.ru
27 ноября 2022, 00:03
0
После раздумий на свежую голову, допер наконец-то, что данные, которые прилетают в комбобокс из базы при открытии модального окна, нужно смотреть в общем процессоре get.class.php, а не процессоре, который в комбобокс отдает список пользователей. Разумеется, из процессора get приходит массив айдишников юзеров — skrinshoter.ru/s/261122/swgV0bFJ, а нужен массив, соответствующий комбобоксу — skrinshoter.ru/s/261122/OUfflCjn. Остальное дело техники, добавил нужный код в метод cleanup:

public function cleanup() {
    $array = $this->object->toArray();
    
    $tmp = [];
    foreach($array['properties'] as $key => $item) {
        if($tmp_user = $this->modx->getObject('modUser', $item)) {
            $tmp[$key]['id'] = $item;
            $tmp[$key]['username'] = $tmp_user->get('username');
        }
    }
    $array['properties'] = $tmp;

    return $this->success('', $array);
}

из кода самого комбика выкинул лишее:

RewardsPupil.combo.Options = function (config) {
    config = config || {};
    Ext.applyIf(config, {
        xtype: 'superboxselect',
        allowBlank: true,
        allowAddNewData: true,
        addNewDataOnBlur: false,
        resizable: true,
        name: 'properties',
        anchor: '100%',
        minChars: 2,
        store: new Ext.data.JsonStore({
            id: (config.name || 'properties') + '-store',
            root: 'results',
            autoLoad: true,
            autoSave: false,
            totalProperty: 'total',
            fields: ['username','id'],
            url: RewardsPupil.config.connector_url,
            baseParams: {
                action: 'mgr/user/getoptions',
            }
        }),
        mode: 'remote',
        displayField: 'username',
        displayFieldTpl: '{username} ({id})',
        valueField: 'id',
        triggerAction: 'all',
        extraItemCls: 'x-tag',
        expandBtnCls: 'x-form-trigger',
        clearBtnCls: 'x-form-trigger',
        renderTo: Ext.getBody(),
    });
    config.name += '[]';
    RewardsPupil.combo.Options.superclass.constructor.call(this,config);
};
Ext.extend(RewardsPupil.combo.Options, Ext.ux.form.SuperBoxSelect);
Ext.reg('rewardspupil-combo-options', RewardsPupil.combo.Options);

Всё завелось — skrinshoter.ru/s/261122/6GN8iS6i.

В который раз убеждаюсь, что нельзя упираться надолго, если не получается найти решение, только мозг закипает… Голову проветрил и сразу дело пошло.
25 ноября 2022, 20:35
0
А если два плюса в последней строке убрать?