Использование Событий для подсчета Фотографий в Фотоальбоме
Материал из Umicms
Если стоит задача вывести на сайте количество фотографий в Фотоальбоме, то для этого конечно можно использовать кастомный макрос, который каждый раз при переходе на страницу Фотоальбома будет считать количество элементов в разделе. Но такой подход плох в плане производительности системы, в данной ситуации наилучший вариант это использовать системные События. Если говорить точнее то можно к таким событиям как: systemCreateElement и systemDeleteElement привязать обработчик, который при добавлении фотографии в фотоальбом, изменит значение поля "Количество фотографий" на родительской странице, т.е. на странице Фотоальбом. Технически это реализуется следующим образом. В том модуле, где подключается файл __custom_adm.php, в котором можно прописать дополнительные макросы для админки, создаем файл custom_events.php. Т.е. в файле classes/modules/config/custom_events.php пропишем следующие строки:
<?php new umiEventListener('systemCreateElement', 'config', 'onPhoto'); new umiEventListener('systemDeleteElement', 'config', 'onPhoto'); ?>
а в файле classes/modules/config/__custom_adm.php:
<?php abstract class __custom_adm { public function onPhoto(iUmiEventPoint $oEventPoint) { if ($oEventPoint->getMode() == "after") { $element = $oEventPoint->getRef('element'); $hierarchyTypes = umiHierarchyTypesCollection::getInstance(); $hierarchyType = $hierarchyTypes->getTypeByName("photoalbum", "photo"); $hierarchyTypeId = $hierarchyType->getId(); if($element->getTypeId() == $hierarchyTypeId){ $hierarchy = umiHierarchy::getInstance(); $id_parent = $element->getParentId(); $element_parent = $hierarchy->getElement($id_parent); $select = new selector('pages'); $select->types('hierarchy-type')->name('photoalbum', 'photo'); $select->where('hierarchy')->page($id_parent)->childs(1); $count = $select->length; $element_parent->setValue('kolichestvo',$count); $element_parent->commit(); } } } }; ?>
В модуле "Шаблоны данных", для типа данных "Фотоальбом" создадим новую группу полей, а в ней поле типа Счетчик, с идентификатором 'kolichestvo' и названием "Количество фотографий". В результате данных добавлений, при создании или удалении страницы типа Фотография, будет происходить пересчет значения поля "Количество фотографий", в том фотоальбоме, в котором создается или удаляется фотография. Значение поля типа Счетчик можно стандартным образом выводить на сайте, это все равно, что выводить значение поля типа Число.
