События - подсчет количества объектов каталога в разделе
На сайте можно стандартными средствами выводить количтество объектов каталога в каждом разделе. Можно использовать макрос %catalog getObjectsList()% и его значение %total%, также можно использовать %data doSelection()% или протокол usel (XSLT), но при использовании данных макросов будет создаваться лишняя нагрузка на сервер, при каждой загрузки страницы, будет происходить пересчет по каждому разделу каталога. Идеальный вариант это производить подсчет при добавлении объекта каталога в раздел, при изменении активность объекта каталога или его удалении, все это можно сделать с помощью событий UMI.CMS. Для реализации данной задачи, в папке /classes/modules/catalog/ создадим файл custom_events.php следующего содержания:
<?php
new umiEventListener('systemCreateElement', 'catalog', 'onCountObjects');
new umiEventListener('systemDeleteElement', 'catalog', 'onCountObjects');
new umiEventListener('systemSwitchElementActivity', 'catalog', 'onCountObjects');
?>
Данные события:
systemCreateElement systemDeleteElement systemSwitchElementActivity
это события зарегистрированные в классе baseModuleAdmin, файл classes/modules/ baseModuleAdmin.php.
Добавим в эту же папку файл permissions.custom.php:
<?php
$permissions = Array('tree' => Array('onCountObjects'), 'view' => Array('getCountObjects'));
?>
В файл __custom_adm.php добавим метод, который будет запускаться при создании, удалении, смены активности объекта каталога:
public function onCountObjects(iUmiEventPoint $oEventPoint) {
if ($oEventPoint->getMode() == "after") {
$element = $oEventPoint->getRef('element');
$hierarchyTypes = umiHierarchyTypesCollection::getInstance();
$hierarchyType = $hierarchyTypes->getTypeByName("catalog", "object");
$hierarchyTypeId = $hierarchyType->getId();
if($element->getTypeId() == $hierarchyTypeId){
$hierarchy = umiHierarchy::getInstance();
$id_parent = $element->getParentId();
$element_parent = $hierarchy->getElement($id_parent);
$count = $hierarchy->getChildsCount($id_parent, false, true, 0, $hierarchyTypeId);
$element_parent->setValue('count_object',$count);
$element_parent->commit();
}
}
}
А в файл __custom.php добавим метод который будет отвечать за вывод значения количества объектов каталога, в случае необходимости этот же метод будет производить подсчет, если он еще ни разу не осуществлялся для раздела:
public function getCountObjects($id_parent){
$id_parent = (int) $id_parent;
$hierarchy = umiHierarchy::getInstance();
$element = $hierarchy->getElement($id_parent);
if($element && $element->getMethod() == 'category'){
$count = $element->count_object;
if(!is_null($count)){
if($count > 0) return "<span class='gray'>({$count})</span>";
}else{
$hierarchyTypes = umiHierarchyTypesCollection::getInstance();
$hierarchyType = $hierarchyTypes->getTypeByName("catalog", "object");
$hierarchyTypeId = $hierarchyType->getId();
$count = $hierarchy->getChildsCount($id_parent, false, true, 0, $hierarchyTypeId);
$element->setValue('count_object',$count);
$element->commit();
if($count > 0) return "<span class='gray'>({$count})</span>";
}
}
}
В административной части, в модуле "Шаблонный данных", в типе данных "Раздел каталога" добавим еще одно поле:
Название – Количество объектов Идентификатор - count_object Тип – число
В самих шаблонах сайта необходимо будет вывести значение поля count_object используя метод getCountObjects, метод принимает один параметр, это id раздела каталога. Для TPL-шаблонов вызов следующий:
%catalog getCountObjects(%id%)%
Для XSL-шаблонов, в случае если @id – id раздела:
<xsl:value-of select="document(concat('udata://catalog/getCountObjects/', @id))/udata" />