Использование Событий для подсчета Фотографий в Фотоальбоме — различия между версиями

Материал из Umicms
Перейти к:навигация, поиск
 
(не показана 1 промежуточная версия этого же участника)
Строка 18: Строка 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);
  
public function onPhoto(iUmiEventPoint $oEventPoint) {
+
$select = new selector('pages');
if ($oEventPoint->getMode() == "after") {
+
$select->types('hierarchy-type')->name('photoalbum', 'photo');
$element  = $oEventPoint->getRef('element');
+
$select->where('hierarchy')->page($id_parent)->childs(1);
$hierarchyTypes = umiHierarchyTypesCollection::getInstance();
+
$count = $select->length;
$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();
 
}
 
}
 
}
 
  
 +
$element_parent->setValue('kolichestvo',$count);
 +
$element_parent->commit();
 +
}
 +
}
 +
}
 
};
 
};
 
?>
 
?>
Строка 48: Строка 46:
  
 
В статье, количество фотографий является одним из полей Фотоальбома, которое можно просто вывести на странице. Вы также сможете узнать количество фотографий в фотоальбоме используя вызов системного макроса photoalbum album(), но в этом случае количество фотографий будет вычисляется только при вызове макроса.
 
В статье, количество фотографий является одним из полей Фотоальбома, которое можно просто вывести на странице. Вы также сможете узнать количество фотографий в фотоальбоме используя вызов системного макроса photoalbum album(), но в этом случае количество фотографий будет вычисляется только при вызове макроса.
  [[category:Написание кастомных макросов]]
+
  [[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(), но в этом случае количество фотографий будет вычисляется только при вызове макроса.