mSync удаление старых картинок товаров

Доброго времени суток!
При выгрузке товаров на сайт из 1С через mSync новые картинки товаров загружаются в галерею, создаются превьюшки, но старые не удаляются. Видимо, так сделано на тот случай, если старые картинки нужны. Клиент же хочет, чтобы при наличии новых картинок для товара в выгрузке старые удалялись.

Написала плагин на событие mSyncOnPrepareProduct:
$eventName = $modx->event->name;

if ($eventName == 'mSyncOnPrepareProduct') {
    
    if (!empty($data['images'])) {
        $id = $properties['id'];
        
        $images = $modx->getCollection('msProductFile', ['product_id' => $id]);
        
        if (!empty($images)) {
            foreach($images as $image) {
                $image->remove();
            }
        }
    }
}
В таблице событий mSync у этого события есть $data — новые полученные данные, и $properties — как я поняла, свойства товара, имеющиеся в данный момент. Но плагин не работает(. Похоже, что-то все-таки я делаю не так.

Решал ли кто-нибудь подобную задачу? Может ли кто-нибудь подсказать, где я ошиблась, и правильно ли вообще решать эту проблему таким путем?

Автор дополнения в отпуске, спросить у него не могу.
Svetlana S
13 июля 2020, 14:01
modx.pro
1 064
0

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

Максим
13 июля 2020, 15:14
0
Добрый день. Ну вродь как все правильно. Нужно только проверить, что данное событие у этого плагина включено и дебажить. Я бы для начала посмотрел что из себя представляет $properties
    Svetlana S
    13 июля 2020, 16:14
    0
    Событие, конечно же, включено. Плагин срабатывает — из-за этого выгрузка обрывается, и все. Картинки не обновляются, в логах никаких ошибок нет. Видимо, просто что-то не правильно в плагине. В документации к mSync написано, что $properties — это свойства товара. Как поточнее посмотреть — понятия не имею( Код mSync довольно сложный, разбитый на множество файлов, так и не нашла в них, где это событие вызывается
      Oleg
      08 октября 2020, 13:16
      0
      Добрый день, Светлана, в итоге удалось решить задачу, подскажите каким образом?)
        Svetlana S
        10 октября 2020, 20:23
        1
        0
        Хм, сейчас вспомню)

        В файле core/components/msync/model/msync/msynccataloghandler.class.php на 1383 строчке добавила в событие mSyncOnPrepareProduct параметр — id товара, его там, вроде, не было:

        $this->log("Вызвано событие mSyncOnPrepareProduct для товара с uuid={$productData['uuid']}", 1);
                $response = $this->msync->invokeEvent('mSyncOnPrepareProduct', array(
                    'data' => $productData,
                    'parent' => $categoryId,
                    'properties' => $properties,
                    'custom_id' => $productId,
                ));
        Затем плагин переписала так:

        $eventName = $modx->event->name;
        
        if ($eventName == 'mSyncOnPrepareProduct') {
            
            if (!empty($data['images']) && !empty($custom_id)) {
                $id = (int) $custom_id;
                
                $images = $modx->getCollection('msProductFile', ['product_id' => $id]);
                
                if (!empty($images)) {
                    foreach($images as $image) {
                        $image->remove();
                    }
                }
            }
        }
        Проверяем, есть ли в полученных данных новые картинки у товара, и, если есть хотя бы одна, удаляем старые. Править исходники плохо, но пока получилось только так) Так что при обновлении компонента придется вставлять строчку заново.

        На сайте с 10 000 товаров все работает. Только, если много товаров, сайт лучше разворачивать на модхосте, с хорошим запасом свободного места)
          Oleg
          12 октября 2020, 20:47
          0
          Большое спасибо! Ваш ответ помог =)
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    5