====== Короткие URL ====== Нужно в этом решнии предусмотреть проверку на совпадение URL товаров в разных группах. 1. ТДС интернет магазин, настройки страницы, вставить перед: $Shop_Controller_Show ->limit($limit) ->parseUrl(); Код: $newPath = Core::$url['path']; $partsPath = explode('/', $newPath); $briefUrl = false; if(count($partsPath) == 4) { $partsPath = array_reverse($partsPath); $oItems = Core_Entity::factory('shop_item'); $oItems->queryBuilder() ->where('shop_id', '=', 1) ->where('path', '=', $partsPath[1]); $aoItems = $oItems->findAll(); if(count($aoItems) == 1) { $oldPath = $aoItems[0]->Shop->Structure->getPath() . $aoItems[0]->getPath(); Core::$url['path'] = urldecode($oldPath); $briefUrl = true; } elseif(count($aoItems) > 1) { $oldPath = $aoItems[0]->Shop->Structure->getPath() . $aoItems[0]->getPath(); Core::$url['path'] = urldecode($oldPath); $briefUrl = true; Core_Log::instance() ->clear() ->status(4) ->write("Найдено более одного товара с путём $partsPath[1], выводится первый из них"); } } После: $Shop_Controller_Show ->limit($limit) ->parseUrl(); Добавить: Core::$url['path'] = $newPath; Что бы сделать редирект на новый адрес. Нужно после $Shop_Controller_Show ->limit($limit) ->parseUrl(); Добавить: if($Shop_Controller_Show->item && $briefUrl == false ) { $view_item = $Shop_Controller_Show->item; $item_path = Core_Entity::factory('Shop_Item', $view_item)->path; $shop_path = $oShop->Structure->path; header("Location: /$shop_path/{$item_path}/"); exit(); } 2. Меняем в нужных XSLT шаблонах в ''shop_item'' ссылки. Вместо ''{url}'' вставить ''{/shop/url}{path}/''. 3. Для того чтобы на карте сайта (/sitemap/) выводились товары с изменённым url, необходимо в ТДС Google SiteMap в настройках страницы создать новый класс, который наследуется от ''Core_Sitemap'', и переопределить метод ''_structure'' в котором изменяется часть с url товара. class Core_Sitemap_Ixta extends Core_Sitemap { protected function _structure($structure_id = 0) { $oSite = $this->getSite(); $aStructure = $this->_selectStructuresByParentId($structure_id); $dateTime = Core_Date::timestamp2sql(time()); $oSite_Alias = $oSite->getCurrentAlias(); foreach ($aStructure as $oStructure) { $sProtocol = $oStructure->https ? 'https://' : 'http://'; $this->addNode($sProtocol . $oSite_Alias->name . $oStructure->getPath(), $oStructure->changefreq, $oStructure->priority); // Informationsystem if ($this->showInformationsystemGroups && isset($this->_Informationsystems[$oStructure->id])) { $oInformationsystem = $this->_Informationsystems[$oStructure->id]; $offset = 0; do { $oInformationsystem_Groups = $oInformationsystem->Informationsystem_Groups; $oInformationsystem_Groups->queryBuilder() ->select('informationsystem_groups.id', 'informationsystem_groups.informationsystem_id', 'informationsystem_groups.parent_id', 'informationsystem_groups.path' ) ->where('informationsystem_groups.siteuser_group_id', 'IN', $this->_aSiteuserGroups) ->where('informationsystem_groups.active', '=', 1) ->where('informationsystem_groups.indexing', '=', 1) ->offset($offset)->limit($this->limit); $aInformationsystem_Groups = $oInformationsystem_Groups->findAll(FALSE); $path = $sProtocol . $oSite_Alias->name . $oInformationsystem->Structure->getPath(); foreach ($aInformationsystem_Groups as $oInformationsystem_Group) { $this->addNode($path . $oInformationsystem_Group->getPath(), $oStructure->changefreq, $oStructure->priority); } $offset += $this->limit; } while (count($aInformationsystem_Groups)); // Informationsystem's items if ($this->showInformationsystemItems) { $offset = 0; do { $oInformationsystem_Items = $oInformationsystem->Informationsystem_Items; $oInformationsystem_Items->queryBuilder() ->select('informationsystem_items.id', 'informationsystem_items.informationsystem_id', 'informationsystem_items.informationsystem_group_id', 'informationsystem_items.shortcut_id', 'informationsystem_items.path' ) ->open() ->where('informationsystem_items.start_datetime', '<', $dateTime) ->setOr() ->where('informationsystem_items.start_datetime', '=', '0000-00-00 00:00:00') ->close() ->setAnd() ->open() ->where('informationsystem_items.end_datetime', '>', $dateTime) ->setOr() ->where('informationsystem_items.end_datetime', '=', '0000-00-00 00:00:00') ->close() ->where('informationsystem_items.siteuser_group_id', 'IN', $this->_aSiteuserGroups) ->where('informationsystem_items.active', '=', 1) ->where('informationsystem_items.shortcut_id', '=', 0) ->where('informationsystem_items.indexing', '=', 1) ->offset($offset)->limit($this->limit); $aInformationsystem_Items = $oInformationsystem_Items->findAll(FALSE); foreach ($aInformationsystem_Items as $oInformationsystem_Item) { $this->addNode($path . $oInformationsystem_Item->getPath(), $oStructure->changefreq, $oStructure->priority); } $offset += $this->limit; } while (count($aInformationsystem_Items)); } } // Shop if ($this->showShopGroups && isset($this->_Shops[$oStructure->id])) { $oShop = $this->_Shops[$oStructure->id]; $offset = 0; do { $oShop_Groups = $oShop->Shop_Groups; $oShop_Groups->queryBuilder() ->select('shop_groups.id', 'shop_groups.shop_id', 'shop_groups.parent_id', 'shop_groups.path' ) ->where('shop_groups.siteuser_group_id', 'IN', $this->_aSiteuserGroups) ->where('shop_groups.active', '=', 1) ->where('shop_groups.indexing', '=', 1) ->offset($offset)->limit($this->limit); $aShop_Groups = $oShop_Groups->findAll(FALSE); $path = $sProtocol . $oSite_Alias->name . $oShop->Structure->getPath(); foreach ($aShop_Groups as $oShop_Group) { $this->addNode($path . $oShop_Group->getPath(), $oStructure->changefreq, $oStructure->priority); } $offset += $this->limit; } while (count($aShop_Groups)); // Shop's items if ($this->showShopItems) { $offset = 0; do { $oShop_Items = $oShop->Shop_Items; $oShop_Items->queryBuilder() ->select('shop_items.id', 'shop_items.shop_id', 'shop_items.shop_group_id', 'shop_items.shortcut_id', 'shop_items.modification_id', 'shop_items.path' ) ->open() ->where('shop_items.start_datetime', '<', $dateTime) ->setOr() ->where('shop_items.start_datetime', '=', '0000-00-00 00:00:00') ->close() ->setAnd() ->open() ->where('shop_items.end_datetime', '>', $dateTime) ->setOr() ->where('shop_items.end_datetime', '=', '0000-00-00 00:00:00') ->close() ->where('shop_items.siteuser_group_id', 'IN', $this->_aSiteuserGroups) ->where('shop_items.active', '=', 1) ->where('shop_items.shortcut_id', '=', 0) ->where('shop_items.indexing', '=', 1) ->offset($offset)->limit($this->limit); // Modifications if (!$this->showModifications) { $oShop_Items->queryBuilder() ->where('shop_items.modification_id', '=', 0); } $aShop_Items = $oShop_Items->findAll(FALSE); foreach ($aShop_Items as $oShop_Item) { $this->addNode($path . $oShop_Item->path . '/', $oStructure->changefreq, $oStructure->priority); } $offset += $this->limit; } while (count($aShop_Items)); } } // Structure $this->_structure($oStructure->id); } return $this; } } И ниже уже используем новый класс: $oCore_Sitemap = new Core_Sitemap_Ixta($oSite); Вместо старого: $oCore_Sitemap = new Core_Sitemap($oSite); Страницу создал Константин Сериков 18.10.16 в 17:07