private:koding:hostcms:modules:upravlenie_redirektami:sozdanie_redirekta_posle_udalenija_ili_izmenenija_aktivnosti

Создание редиректа после удаления в корзину/изменения активности товара/группы

В /modules/shop/item/ создать папку observer. Внутри этой папки создать файл updateredirect.php и поместить в него следующее содержимое:

class Shop_Item_Observer_Updateredirect
{
	static public function onAfterChangeActive($object)
	{
		if($object->active == 1)
		{
			self::deleteRedirectItem($object);
		}
		else
		{
			self::addRedirectItem($object);
		}
	}
 
	static public function addRedirectItem($object)
	{
		$sShopGroupId = $object->shop_group_id;
		$oShopGroup = Core_Entity::factory('Shop_Group', $sShopGroupId);
 
		if($sShopGroupId != 0)
		{
			$sOldPath = $oShopGroup->path . "/" . $object->path . "/";
			$sNewPath = $oShopGroup->path . "/";
		}
		else
		{
			$sOldPath = $object->path . "/";
			$sNewPath = "";
		}
 
		while($oShopGroup->parent_id != 0)
		{
			$oShopGroup = Core_Entity::factory('Shop_Group', $oShopGroup->parent_id);
			$sOldPath = $oShopGroup->path . "/" . $sOldPath;
			$sNewPath = $oShopGroup->path . "/" . $sNewPath;
		}
		$sOldPath = "{prefix}/shop/" . $sOldPath;
		$sNewPath = "{prefix}/shop/" . $sNewPath;
 
		$oHostcms_Redirect = Core_Entity::factory('Hostcms_Redirect');
		$oHostcms_Redirect->site_id = CURRENT_SITE;
		$oHostcms_Redirect->name = "temporarily_" . $object->id;
		$oHostcms_Redirect->source = $sOldPath;
		$oHostcms_Redirect->destination = $sNewPath;
		$oHostcms_Redirect->type = "302";
		$oHostcms_Redirect->save();
	}
 
	static public function deleteRedirectItem($object)
	{
		$oHostcms_Redirect = Core_Entity::factory('Hostcms_Redirect');
		$sShopItemId = $object->id;
 
		$oHostcms_Redirect
			->queryBuilder()
				->where('name', '=', 'temporarily_' . $sShopItemId);
 
		$aoHostcms_Redirect = $oHostcms_Redirect->findAll();
 
		if(count($aoHostcms_Redirect))
		{
			$aoHostcms_Redirect[0]->delete();
		}
	}
}

В /modules/shop/group/ создать папку observer. Внутри этой папки создать файл updateredirect.php и поместить в него следующее содержимое:

class Shop_Group_Observer_Updateredirect
{
	static public function onAfterChangeActive($object)
	{
		if($object->active == 1)
		{
			self::deleteRedirectGroup($object);
		}
		else
		{
			self::addRedirectGroup($object);
		}
	}
 
	static public function addRedirectGroup($oShopGroup)
	{
		$sShopGroupId = $oShopGroup->id;
		$sOldPath = $oShopGroup->path . "/";
		$sNewPath = "";
 
		while($oShopGroup->parent_id != 0)
		{
			$oShopGroup = Core_Entity::factory('Shop_Group', $oShopGroup->parent_id);
			$sOldPath = $oShopGroup->path . "/" . $sOldPath;
			$sNewPath = $oShopGroup->path . "/" . $sNewPath;
		}
 
		$sOldPath = "{prefix}/shop/" . $sOldPath;
		$sNewPath = "{prefix}/shop/" . $sNewPath;
 
		$oHostcms_Redirect = Core_Entity::factory('Hostcms_Redirect');
		$oHostcms_Redirect->site_id = CURRENT_SITE;
		$oHostcms_Redirect->name = "temporarily_" . $sShopGroupId;
		$oHostcms_Redirect->source = $sOldPath;
		$oHostcms_Redirect->destination = $sNewPath;
		$oHostcms_Redirect->type = "302";
		$oHostcms_Redirect->save();
	}
 
	static public function deleteRedirectGroup($oShopGroup)
	{
		$oHostcms_Redirect = Core_Entity::factory('Hostcms_Redirect');
		$sShopGroupId = $oShopGroup->id;
 
		$oHostcms_Redirect
			->queryBuilder()
				->where('name', '=', 'temporarily_' . $sShopGroupId);
 
		$aoHostcms_Redirect = $oHostcms_Redirect->findAll();
 
		if(count($aoHostcms_Redirect))
		{
			$aoHostcms_Redirect[0]->delete();
		}
	}
}

В файл bootstrap.php добавить следующий код:

Core_Event::attach('shop_item.onAfterMarkDeleted', array('Shop_Item_Observer_Updateredirect', 'addRedirectItem'));
Core_Event::attach('shop_item.onAfterUndelete', array('Shop_Item_Observer_Updateredirect', 'deleteRedirectItem'));
Core_Event::attach('shop_item.onAfterChangeActive', array('Shop_Item_Observer_Updateredirect', 'onAfterChangeActive'));
Core_Event::attach('shop_group.onAfterMarkDeleted', array('Shop_Group_Observer_Updateredirect', 'addRedirectGroup'));
Core_Event::attach('shop_group.onAfterUndelete', array('Shop_Group_Observer_Updateredirect', 'deleteRedirectGroup'));
Core_Event::attach('shop_group.onAfterChangeActive', array('Shop_Group_Observer_Updateredirect', 'onAfterChangeActive'));

Теперь после удаления в корзину или изменения активности товара или группы, в модуле "Управление редиректами" будут создаваться редиректы. При восстановлении из корзины удаляться. После удаления товара из корзины, редиректы остаются.

Страницу создал Константин Сериков 14.06.17 в 10:12

private/koding/hostcms/modules/upravlenie_redirektami/sozdanie_redirekta_posle_udalenija_ili_izmenenija_aktivnosti.txt · Last modified: 27.06.17 в 14:40 by maximzasorin_gmail.com