Не получается снять товар с публикации при импорте в msync, как снять с публикации?

Пробовал на эти события подключаться mSyncOnPrepareProduct
Код выводит правильно то что я хочу, но не снимает с публикации.
if($data['properties']){
    $props = json_decode($data['properties'], true);
    if($props && $props['ВыгружатьНаСайт']){
        $isUploadProduct = $props['ВыгружатьНаСайт'] == 'Да' ? 1: 0;
        $properties['published'] = $isUploadProduct;
        $data['published'] = $isUploadProduct;                  
    }
}
mSyncOnProductImport
Пытался не сохранять ресурс, и сохранять, всё равно не снимает с публикации.
if($properties && $properties['ВыгружатьНаСайт']){        
    $isUploadProduct = $properties['ВыгружатьНаСайт'] == 'Да' ? 1: 0;
    $resource->set('published', $isUploadProduct);
    $resource->save();
}
Вот ещё одно событие mSyncOnBeforeImportProduct
$data['published'] = $data['characteristics']['properties']['ВыгружатьНаСайт'] == 'Да' ? 1: 0;
$values['data'] = $data;
Pandemic
20 февраля 2024, 13:47
modx.pro
1 316
0

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

Pandemic
20 февраля 2024, 13:47
0
Ни одно событие не снимает товар с публикации, при этом в каждом блоке кода если что-то выводить оно выводится.
    Pandemic
    20 февраля 2024, 16:44
    0
    На событие mSyncOnProductOffers можно снять с публикации, но там я не могу отловить мой флаг, так как он находится в файле импорта товаров, что я делаю не так?
      Pandemic
      20 февраля 2024, 17:16
      0
      Единственный рабочий обходной метод, это просто отловить поле мсинком как обычно, запихнуть в твшку, и потом на событие mSyncOnProductOffers обработать, остальные действительно подходящее для этого события просто не работают.
      case 'mSyncOnProductOffers':
          $isUploadOnSite = $resource->getTVValue('uploadToSite');
          $isPublished = $resource->get('published');
          
      	$isPublish = 1;
      	if(($count == 0 || $count < 0) || ($isUploadOnSite == 'Нет' && $isPublished == 1)){
      	    $isPublish = 0;
      	} elseif($isUploadOnSite == 'Да' && $isPublished == 0){
      	    $isPublish = 1;
      	}
      	
      	$resource->set('published', $isPublish);
      
      	$resource->save();
          break;
        Сергей Карпович
        23 февраля 2024, 13:09
        0
        У меня такой плагин работает на событие «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
          23 февраля 2024, 13:18
          0
          Возможно у меня была проблема из-за того что в настройках мсинка установлена галка, чтобы публиковать в любом случае, и получается мои плагины на событие отрабатывают верно, но настройка мсинка отрабатывает позже, и перебивает друг друга, а на на импорте торговых предложений просто, отрабатывает как надо.
          Но всё же как-то это событие должно лучше подходить «mSyncOnBeforeImportProduct» так как оно убирает доп сохранение ресурса, вместо условно двух, будет 1.
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        5