Автодобавление редиректов в модуль "Управление редиректами"

Реализация автоматического добавления редиректов в модуль "Управление редиректами" после удаления в корзину или изменения активности товара/группы.

Ссылка на модуль

В директории /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'));

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

comments powered by Disqus


Следующий "Скидка 30% на решение Бесконечная прокрутка каталога" К списку Предыдущий "Добавление дополнительных данных в сообщение модуля "Автопостинг в социальные сети""