====== Добавление подгрупп для хлебных крошек ====== Для решения этой задачи был создан класс Kad_Subgroups и метод add(). Суть работы метода в том, что он отлавливает события (хуки) добавления групп и структур в хлебные крошки и к каждой группе (структуре) добавляет список дочерних элементов. === Пример добавления === Выполнение этого метода в коде должно быть между созданием контроллера хлебных крошек и их выводом: // Вывод строки навигации $Structure_Controller_Breadcrumbs = new Structure_Controller_Breadcrumbs( Core_Entity::factory('Site', CURRENT_SITE) ); $shop_id = 9; $oSubgroups = new Kad_Subgroups; $oSubgroups ->shop_id($shop_id) ->addSubgroupsToBreadcumbs(); $Structure_Controller_Breadcrumbs ->xsl( Core_Entity::factory('Xsl')->getByName('ХлебныеКрошкиСайт7') ) ->show(); По умолчанию подгруппы добавляются только для раздела "Интернет-магазин" и групп этого магазина. Однако, установив свойство: $oSubgroups ->shop_id($shop_id) ->forAllStructures(TRUE) ->addSubgroupsToBreadcumbs(); Можно указать, что подгружать подгруппы (дочерние структуры) необходимо для любых элементов хлебных крошек, а не только для интернет-магазина и его групп. === Структура подгрупп в XML === В XML подгруппы имеют следующую структуру: ..... ..... ..... А дочерние структуры (если задано forAllStructures(TRUE)) имеют вид: ..... ..... ..... ..... === Дополнительные возможности === Так же этот класс обладает ещё одним методом: getAllChildrenGroups(), который в качестве параметра принимает группу интернет-магазина и возвращает массив всех подгрупп любой степени вложенности, вкюлчая родительскую (ту, что была передана в качестве параметра). === Пример использования данного решения на сайте z97.ru === {{:private:koding:hostcms:modules:shop:useful:pasted:20171117-161309.png}} {{:private:koding:hostcms:modules:shop:useful:pasted:20171117-161718.png}} === Исходный код === > */ class Kad_Subgroups { private $shop_id; //Идентификатор интернет-магазина private $bForAllStructures; //Указатель на то, будут ли добавляться подгруппы первого уровня только для интернет-магазина или для для всех разделов public function shop_id($id) { $this->shop_id = $id; return $this; } public function forAllStructures($arg) { $this->bForAllStructures = $arg; return $this; } /** * Добавление подгрупп первого уровня в контроллер хлебных крошек */ public function addSubgroupsToBreadcumbs() { Core_Event::attach('Structure_Controller_Breadcrumbs.onAfterAddStructure', function($controller, $args) { $controller->clearEntities(); $oStructure = $args[0]; $xml = Core::factory("Core_Xml_Entity") ->name('subgroups'); $oShop = Core_Entity::factory('Shop', $this->shop_id); //Для интернет-магазина добавляем группы товаров if($oStructure->id == $oShop->structure_id) { $group = Core_Entity::factory("Shop_Group"); $group->queryBuilder() ->where("parent_id", "=", 0) ->where("active", "=", "1") ->where("shop_id", "=", $this->shop_id); $aoChildren = $group->findAll(); foreach (array_reverse($aoChildren) as $oChild) { $cloned = clone $oChild; $xml ->addEntity( $cloned ); } } //Для любой другой структуры добавляем дочерние структуры первого уровня elseif($this->bForAllStructures) { $aoChildren = $oStructure->Structures->findAll(); foreach($aoChildren as $oChild) { $cloned = clone $oChild; $xml ->addEntity( $cloned ); } } $oStructure->addEntity($xml); }); Core_Event::attach('Structure_Controller_Breadcrumbs.onAfterAddShopGroups', function($controller, $args) { $controller->clearEntities(); $aShop_Groups = $args[0]; //Добавление подгрупп в группы товаров foreach (array_reverse($aShop_Groups) as $oGroup) { $group = Core_Entity::factory("Shop_Group"); $group->queryBuilder() ->where("parent_id", "=", $oGroup->id) ->where("active", "=", "1"); $aoChildren = $group->findAll(); $xml = Core::factory("Core_Xml_Entity") ->name('subgroups'); foreach ($aoChildren as $oChild) { $cloned = clone $oChild; $xml ->addEntity( $cloned ); } $oGroup->addEntity($xml); } }); } /** * Принимает объект группы и возвращает массив с этой самой группой * и всеми её дочерними подгруппами всех уровней вложенности */ public function getAllChildrenGroups($oGroup) { $aResult = array($oGroup); $oGroup->queryBuilder() ->where("parent_id", "=", $oGroup->id); $aGroups = $oGroup->findAll(); if(count($aGroups)) { foreach ($aGroups as $group) { $aResult = array_merge($aResult, $this->getAllChildrenGroups($group)); } return $aResult; } else { return array($oGroup); } } } /** * << Конец * @author Kozyrev Egor, KAD Systems (©) 2017 * @date 30-11-2017 */ Страницу создал Егор Козырев 17.11.17 в 15:36