[mSync] Вопрос по выгрузке товаров

Добрый день!
У нас на сайте реализована выгрузка из 1С с последующим отключением (выставлением deleted в 0) товаров, которых не было в выгрузке. Реализовано это так:
$q = $this->modx->newQuery('modResource');
$q->select($this->modx->getSelectColumns('modResource', 'modResource', '', array('id')));
$q->where(['class_key' => 'msProduct']);
if ($q->prepare() && $q->stmt->execute()) {
  $data = $q->stmt->fetchAll(PDO::FETCH_ASSOC);
  $uploadedProducts = array_column($data, 'id');
}
                              
if($uploadedProducts) {
  $result = array_diff($uploadedProducts, $_SESSION['product_mapping']);
  $this->modx->log(modX::LOG_LEVEL_ERROR, '[mSklad] Внимание! Будут деактивированы товары с ID: ' . json_encode($result));
  $this->modx->exec("UPDATE {$this->modx->getTableName('modResource')} SET `deleted` = 1 where `id` in (" . implode(',', $result) . ")");
}
Тестирование выявило, что некоторые товары, присутствующие в выгрузке, отсутствуют в массиве $_SESSION['product_mapping'] и следовательно попадают в массив $result на удаление. Как я понимаю, $_SESSION['product_mapping'] должен содержать id всех получаемых из выгрузки товаров? Почему тогда некоторых товаров в этом массиве нет?

Заранее спасибо за помощь!
Giant Dad
03 февраля 2023, 16:35
modx.pro
493
0

Комментарии: 1

Alexey
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();
}

Чутка доработать его и всё норм будет)
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    1