[mSync] Вопрос по выгрузке товаров
Добрый день!
У нас на сайте реализована выгрузка из 1С с последующим отключением (выставлением deleted в 0) товаров, которых не было в выгрузке. Реализовано это так:
Заранее спасибо за помощь!
У нас на сайте реализована выгрузка из 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 всех получаемых из выгрузки товаров? Почему тогда некоторых товаров в этом массиве нет?Заранее спасибо за помощь!
Комментарии: 1
Привет!
Я не разбирался в сессиях компонента, если честно. Но у mSync есть событие mSyncAfterImport, по которому принимается массив выгруженных товаров: новых и обновленных. На мой взгляд, проще написать плагин на это событие, в котором будут прилетать выгруженные товары. И потом их сравнить с существующими на сайте.
Вот пример плагина, который публикует товары, которые были в выгрузке (перед импортом весь каталог снимается с публикации, но это в другом плагине):
Чутка доработать его и всё норм будет)
Я не разбирался в сессиях компонента, если честно. Но у 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();
}
Чутка доработать его и всё норм будет)
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.