====== Добавление подгрупп для хлебных крошек ======
Для решения этой задачи был создан класс 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