События - подсчет количества комментариев для страницы
Материал из Umicms
Обычно для подсчета количества комментариев используется системный макрос comments countComments(). Для высокопосещаемых сайтов, рекомендуется использовать "События" для подсчета количества комментариев к странице и сохранения этого значения. Рассмотрим пример для модуля Каталог, когда к объектам каталога можно оставить комментарий. Сначала необходимо добавить поле в которое будет сохраняться количество комментариев. В модуле "Шаблоны даных", в типе "Объект каталога", добавим группу полей "Количество комментариев", а в ней поле "Комментарии" с идентификатором count_comments и типом Число. Потом добавим в папку /classes/modules/comments/ файл custom_events.php следующего содержания:
<?php new umiEventListener('comments_message_post_do', 'comments', 'setCountComments'); ?>
Также добавим файл permissions.custom.php:
<?php $permissions = Array('insert' => Array('setCountComments')); ?>
А в файл __custom.php, после слов //TODO: Write here your own macroses добавим новый метод setCountComments:
public function setCountComments(iUmiEventPoint $e) { if ($e->getMode() == "after") { $topic_id = $e->getParam('topic_id'); $message_id= $e->getParam('message_id'); $hierarchy = umiHierarchy::getInstance(); $element = $hierarchy->getElement($topic_id); if($element && $message_id){ $hierarchy_type_id = umiHierarchyTypesCollection::getInstance()->getTypeByName("comments", "comment")->getId(); $sel = new umiSelection; $sel->addElementType($hierarchy_type_id); $sel->addHierarchyFilter($topic_id); $total = umiSelectionsParser::runSelectionCounts($sel); $element->setValue('count_comments', $total); $element->commit(); } } }
В методе setCountComments используется событие:
$oEventPoint = new umiEventPoint("comments_message_post_do"); $oEventPoint->setMode("after"); $oEventPoint->setParam("topic_id", $parent_element_id); $oEventPoint->setParam("message_id", $element_id); $this->setEventPoint($oEventPoint);
которое прописано в конце метода post(), файл /classes/modules/comments/class.php
В итоге, при добавлении комментария, в объекте каталога, в поле count_comments будет записываться количество комментариев оставленных к этому объекты. Значение поля count_comments можно будет вывести также как и любое другое значение страницы.
