События - подсчет количества комментариев для страницы
Обычно для подсчета количества комментариев используется системный макрос 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 можно будет вывести также как и любое другое значение страницы.