События - подсчет количества комментариев для страницы

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