private:koding:hostcms:modules:shop:import_export:import_as_shortcut:observer
<?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;
	}
}
private/koding/hostcms/modules/shop/import_export/import_as_shortcut/observer.txt · Last modified: 27.12.17 в 10:02 by maximzasorin_gmail.com