Автоматизация загрузки информации о товарах

#
Re: Автоматизация загрузки информации о товарах
hostcms, итак, пробегусь еще раз.

Задача: при удалении всех меток (тегов) у товара в 1С при выполнении автоматического обмена удалять все метки товара и в БД HostCMS.

Для того, чтобы обозначить ситуацию, в которой у товара должны быть удалены все метки, в XML-код, который отдает 1С алгоритму обмена, были внесены изменения. Теперь в случае, когда нужно удалить все метки, этот код выглядит так.


<КоммерческаяИнформация>
   <Каталог>
      <Товары>
         <Товар>
            <ЗначенияСвойств>
               <ЗначенияСвойства>
                  <Ид>HCMSM</Ид>
                  <Значение>DELETEALLTAGS</Значение>
               </ЗначенияСвойства>
            </ЗначенияСвойств>
         </Товар>
      </Товары>
   </Каталог>
</КоммерческаяИнформация>


В каталоге modules/shop/item/import/cml я создал файл oberver.php. В нем я написал следующий код.

class Shop_Item_Import_Cml_Observer {
   
   static public function onAfterOffersShopItem($object, $args)
   {
      
      $oShopItem = $args[0];
      $oXmlItem = $args[1];
         
      // Добавляем значения для общих свойств всех товаров
      foreach ($object->xpath($oXmlItem, 'ЗначенияСвойств/ЗначенияСвойства') as $ItemPropertyValue)
      {
         
         $sPropertyGUID = strval($ItemPropertyValue->Ид);
         
         $sValue = strval($oPropertyValue->Значение);
         
         // Если это обработка меток товаров
         if ( $sPropertyGUID === "HCMSM" )
         {
            if ( $sValue === "DELETEALLTAGS" )
            {
               
               $oShopItem->Tag_Shop_Items->deleteAll(FALSE);
               
            }
         }
         
      }
   
      return $this;
      
   }
   
}


В файл bootstrap.php в самый конец я добавил это:

// Удаление меток при импорте товаров из 1С
Core_Event::attach('Shop_Item_Import_Cml_Controller.onAfterImportShopItem', array('Shop_Item_Import_Cml_Observer', 'onAfterOffersShopItem'));


Всё ли верно?
Модератор
#
Re: Автоматизация загрузки информации о товарах
lezhenkin,
мы не занимаемся выполнением PHP-кода, размещаете код, запускаете обмен, проверяете результат. Если что-то не работает, выполняете отладку кода, будут конкретные ошибки - пишите.
#
Re: Автоматизация загрузки информации о товарах
hostcms, я рассчитывал всего лишь на оценку правильности действий, не на отладку кода.
Проверю, напишу о результате. Благодарю.
Модератор
#
Re: Автоматизация загрузки информации о товарах
lezhenkin,
как минимум $oPropertyValue у вас не объявлено вовсе, будет warning
#
Re: Автоматизация загрузки информации о товарах
hostcms, точно. Спасибо.

Пока что обмен завершается ошибкой. Не пойму, где искать логи этого обмена. В папке /hostcmsfiles/logs ничего нет. На электронную почту сообщений с текстами ошибок не приходит.
#
Re: Автоматизация загрузки информации о товарах
Нашел логи.
#
Re: Автоматизация загрузки информации о товарах
Логи процесса обмена на текущий момент записываются в каталог /hostcmsfiles/tmp/1c_exchange_files/month-3
Но в этом каталоге я не вижу никаких записей, которые содержали бы информацию о причине ошибки. Где же искать эту информацию?
Модератор
#
Re: Автоматизация загрузки информации о товарах
lezhenkin писал(а):
Логи процесса обмена на текущий момент записываются в каталог /hostcmsfiles/tmp/1c_exchange_files/month-3

не записываются они туда, здесь присланные из 1С файлы.

Логи в hostcmsfiles/logs/, логи там всегда есть (если права на запись у системы есть), если там нет ошибок, то возникает фатальная ошибка, которая идет в логи на вашем хостинге.
#
Re: Автоматизация загрузки информации о товарах
hostcms, в hostcmsfiles/logs/ последняя запись о типе, режиме, URL и т.п. Ни о какой ошибке нет записей.
В файле с логами ошибок веб-сервера сообщений об ошибках тоже нет. На электронную почту письмо с текстом ошибки не приходило. Но 1С сообщила, что обработка файла import.xml завершилась ошибкой.

Если я комментирую свою запись в файле bootstrap.php, обмен работает без ошибок.
#
Re: Автоматизация загрузки информации о товарах
В общем, логи я так и не нашел.
Помогла мне только буферизация вывода.

Вот какой код заработал у меня так, как было мне нужно.


class Shop_Item_Import_Cml_Observer {
   
   static public function onAfterOffersShopItem($object, $args)
   {
      
      // Модель товара магазина передана первым элементом массива
      $oShopItem = $args[0];
      
      // Вторым аргументом передан объект SimpleXML
      $oXmlItem = $args[1];
      
      // Перебираем все свойства товара
      foreach ( $object->xpath($oXmlItem, 'ЗначенияСвойств/ЗначенияСвойства') as $oProperty )
      {
         
         // Сохраняем тип свойства
         $sPropertyGUID = strval($oProperty->Ид);
         
         // Если это не метка (тег товара), ничего не делаем
         if ($sPropertyGUID !== "HCMSM")
         {
            continue;
         }
         
         // Сами метки товара или факт их отсутствия
         $sValue = strval($oProperty->Значение);
         
         // Если нужно удалить все привязанные метки, удаляем их
         if ( $sValue === "DELETEALLTAGS" )
         {
            
            $oShopItem->Tag_Shop_Items->deleteAll(FALSE);
            
         }
      
      }
      
      return TRUE;
      
   }
   
}


Теперь метки товара удаляются, а не игнорируются.

Перехожу к обработке специальных цен, отпишусь потом и об этом.
Авторизация