<?php defined('HOSTCMS') || exit('HostCMS: access denied.'); /** * Наблюдитель для модификации импорта товаров: * * «При импорте товаров из CSV-файла необходимо, чтобы в случае, когда уже существующий товар импортируется в другую группу, * он не перемещался бы в нее, но оставался в той же группе, а в новой группе создавался ярлык на товар. * То есть при импорте находим товар в магазине по артикулу, если он находится в той же группе, в которую мы импортируем, * то обновляем его, если мы импортируем в другую группу, то обновляем товар и создаем ярлык в новой группе.» * * @author Maxim Zasorin, KAD Systems (©) 2017 * @date 05-12-2017 */ class Shop_Item_Import_Csv_Controller_Observer_CreateShortcuts { /** * Регистрирует необходимые обработчики. * * @return void */ static public function attach() { Core_Event::attach('Shop_Item_Import_Csv_Controller.onBeforeFindByMarking', array(__CLASS__, 'storeCurrentImportShopGroup')); Core_Event::attach('Shop_Item_Import_Csv_Controller.onAfterFindByMarking', array(__CLASS__, 'storeCurrentShopItemGroup')); Core_Event::attach('Shop_Item_Import_Csv_Controller.onBeforeAssociated', array(__CLASS__, 'createShortcut')); } /** * Запоминаем группу, в которую выполняется импорт. * * @param Shop_Item_Import_Csv_Controller $oShopItemImportCsvController * @return void */ static public function storeCurrentImportShopGroup(Shop_Item_Import_Csv_Controller $oShopItemImportCsvController) { Core_Registry::instance()->set('import_shop_group_id', $oShopItemImportCsvController->getCurrentItem()->shop_group_id); } /** * Запоминаем группу товара, который нашли по артикулу. * * @param Shop_Item_Import_Csv_Controller $oShopItemImportCsvController * @return void */ static public function storeCurrentShopItemGroup(Shop_Item_Import_Csv_Controller $oShopItemImportCsvController) { $oCurrentItem = $oShopItemImportCsvController->getCurrentItem(); if ($oCurrentItem->id) { Core_Registry::instance()->set('original_shop_group_id', $oCurrentItem->shop_group_id); } } /** * Создаем ярлык при необходимости. * * @param Shop_Item_Import_Csv_Controller $oShopItemImportCsvController * @return void */ static public function createShortcut(Shop_Item_Import_Csv_Controller $oShopItemImportCsvController) { if (is_null(Core_Registry::instance()->get('original_shop_group_id'))) { return; } // Группа, в которую загружается товар $importShopGroupId = Core_Registry::instance()->get('import_shop_group_id'); // Текущая группа товара сразу после поиска по артикулу $originShopGroupId = Core_Registry::instance()->get('original_shop_group_id'); // Товар после определения группы $oCurrentItem = $oShopItemImportCsvController->getCurrentItem(); // Новая группа товара $newShopGroupId = self::_belongsToGroup($importShopGroupId, $oCurrentItem->shop_group_id) ? $oCurrentItem->shop_group_id : $importShopGroupId; // Если загрузка идет в другую группу, то создаем там ярлык if ($originShopGroupId != $newShopGroupId) { $oCurrentItem->shop_group_id = $originShopGroupId; $oCurrentItem->save(); // Если в новой группе нет ярлыка, то создаем его $oShopItems = $oCurrentItem->Shop_Items; $oShopItems->queryBuilder() ->where('shop_items.shop_group_id', '=', $newShopGroupId); if (!$oShopItems->getCount()) { $oCurrentItem->shortcut($newShopGroupId); } } Core_Registry::instance()->delete('original_shop_group_id'); } /** * Возвраащет истину, если $parentGroupId явялется родителем $childGroupid или $parentGroupId == $childGroupid. * * @param integer $parnetGroupId * @param integer $childGroupId * @return boolean */ static protected function _belongsToGroup($parentGroupId, $childGroupid) { $oShopGroup = Core_Entity::factory('Shop_Group', $childGroupid); while ($oShopGroup) { if ($oShopGroup->id == $parentGroupId) { return TRUE; } $oShopGroup = $oShopGroup->getParent(); } return FALSE; } }