Использование Событий для подсчета Фотографий в Фотоальбоме — различия между версиями
VITL' (обсуждение | вклад) (Новая страница: « category:Написание кастомных макросов Если стоит задача вывести на сайте количество фотог…») |
Velross (обсуждение | вклад) |
||
(не показаны 2 промежуточные версии этого же участника) | |||
Строка 1: | Строка 1: | ||
− | + | Актуально для 2.9.6 | |
+ | |||
+ | ---- | ||
+ | '''Задача:''' выводить на странице с фотоальбомом дополнительное поле с количеством фотографий в нём. | ||
+ | |||
+ | '''Решение:''' | ||
+ | |||
Если стоит задача вывести на сайте количество фотографий в Фотоальбоме, то для этого конечно можно использовать кастомный макрос, который каждый раз при переходе на страницу Фотоальбома будет считать количество элементов в разделе. Но такой подход плох в плане производительности системы, в данной ситуации наилучший вариант это использовать системные События. Если говорить точнее то можно к таким событиям как: systemCreateElement и systemDeleteElement привязать обработчик, который при добавлении фотографии в фотоальбом, изменит значение поля "Количество фотографий" на родительской странице, т.е. на странице Фотоальбом. Технически это реализуется следующим образом. В том модуле, где подключается файл __custom_adm.php, в котором можно прописать дополнительные макросы для админки, создаем файл custom_events.php. Т.е. в файле classes/modules/config/custom_events.php пропишем следующие строки: | Если стоит задача вывести на сайте количество фотографий в Фотоальбоме, то для этого конечно можно использовать кастомный макрос, который каждый раз при переходе на страницу Фотоальбома будет считать количество элементов в разделе. Но такой подход плох в плане производительности системы, в данной ситуации наилучший вариант это использовать системные События. Если говорить точнее то можно к таким событиям как: systemCreateElement и systemDeleteElement привязать обработчик, который при добавлении фотографии в фотоальбом, изменит значение поля "Количество фотографий" на родительской странице, т.е. на странице Фотоальбом. Технически это реализуется следующим образом. В том модуле, где подключается файл __custom_adm.php, в котором можно прописать дополнительные макросы для админки, создаем файл custom_events.php. Т.е. в файле classes/modules/config/custom_events.php пропишем следующие строки: | ||
<source lang="php"> | <source lang="php"> | ||
Строка 12: | Строка 18: | ||
<?php | <?php | ||
abstract class __custom_adm { | 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; | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | $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(); | ||
+ | } | ||
+ | } | ||
+ | } | ||
}; | }; | ||
?> | ?> | ||
Строка 40: | Строка 44: | ||
В модуле "Шаблоны данных", для типа данных "Фотоальбом" создадим новую группу полей, а в ней поле типа Счетчик, с идентификатором 'kolichestvo' и названием "Количество фотографий". | В модуле "Шаблоны данных", для типа данных "Фотоальбом" создадим новую группу полей, а в ней поле типа Счетчик, с идентификатором 'kolichestvo' и названием "Количество фотографий". | ||
В результате данных добавлений, при создании или удалении страницы типа Фотография, будет происходить пересчет значения поля "Количество фотографий", в том фотоальбоме, в котором создается или удаляется фотография. Значение поля типа Счетчик можно стандартным образом выводить на сайте, это все равно, что выводить значение поля типа Число. | В результате данных добавлений, при создании или удалении страницы типа Фотография, будет происходить пересчет значения поля "Количество фотографий", в том фотоальбоме, в котором создается или удаляется фотография. Значение поля типа Счетчик можно стандартным образом выводить на сайте, это все равно, что выводить значение поля типа Число. | ||
+ | |||
+ | В статье, количество фотографий является одним из полей Фотоальбома, которое можно просто вывести на странице. Вы также сможете узнать количество фотографий в фотоальбоме используя вызов системного макроса photoalbum album(), но в этом случае количество фотографий будет вычисляется только при вызове макроса. | ||
+ | [[category:Написание кастомных макросов]][[Категория:Модуль Фотогалереи]] |
Текущая версия на 09:04, 21 апреля 2014
Актуально для 2.9.6
Задача: выводить на странице с фотоальбомом дополнительное поле с количеством фотографий в нём.
Решение:
Если стоит задача вывести на сайте количество фотографий в Фотоальбоме, то для этого конечно можно использовать кастомный макрос, который каждый раз при переходе на страницу Фотоальбома будет считать количество элементов в разделе. Но такой подход плох в плане производительности системы, в данной ситуации наилучший вариант это использовать системные События. Если говорить точнее то можно к таким событиям как: 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' и названием "Количество фотографий". В результате данных добавлений, при создании или удалении страницы типа Фотография, будет происходить пересчет значения поля "Количество фотографий", в том фотоальбоме, в котором создается или удаляется фотография. Значение поля типа Счетчик можно стандартным образом выводить на сайте, это все равно, что выводить значение поля типа Число.
В статье, количество фотографий является одним из полей Фотоальбома, которое можно просто вывести на странице. Вы также сможете узнать количество фотографий в фотоальбоме используя вызов системного макроса photoalbum album(), но в этом случае количество фотографий будет вычисляется только при вызове макроса.