Вывод комментариев раздела — различия между версиями
Davidov (обсуждение | вклад) (Новая страница: «Может возникнуть ситуация, когда нужно пользователям показать комментарии, которые добав…») |
Davidov (обсуждение | вклад) |
||
Строка 96: | Строка 96: | ||
?> | ?> | ||
</source> | </source> | ||
+ | В качестве первого параметра макрос будет принимать id раздела, комментарии которого нужно вывести, макрос работает на 1 раздел вглубь, то есть показывает комментарии к товарам, которые находятся в указанном разделе. | ||
Ну и конечно же необходимо добавить этот макрос в permissions.custom.php, для того, чтобы пользователи тоже видели результат работы макроса. | Ну и конечно же необходимо добавить этот макрос в permissions.custom.php, для того, чтобы пользователи тоже видели результат работы макроса. | ||
[[Категория:Написание кастомных макросов]][[Категория:Модуль Комментарии]] | [[Категория:Написание кастомных макросов]][[Категория:Модуль Комментарии]] |
Версия 18:05, 17 апреля 2012
Может возникнуть ситуация, когда нужно пользователям показать комментарии, которые добавили к товарам в разделе каталога. Это может понадобиться для того, чтобы пользователь мог знать, какие обсуждения сейчас идут в комментариях. Для реализации, потребуется небольшая доработка стандартного макроса комментариев %comments insert()%. Для начала, напишем метод, возвращающий дочерние страницы, запишем этот метод в файле ~/classes/modules/comments/__custom.php:
<?php
public function getChildPages($page_id){
$hierarchy = umiHierarchy::getInstance();
$page=$hierarchy->getElement($page_id);
$childs=$hierarchy->getChilds($page_id);
return $childs;
}
?>
Можно было включить этот код непосредственно в макрос, но так как функция может пригодится и в других местах, напишем её отдельно. После этого, нужно добавить в тот же файл немного модифицированный код макроса %comments insert()%:
<?php
public function customFunc($idcat,$parent_element_id = false, $template = "default"){
$regedit = regedit::getInstance();
$default = $regedit->getVal('//modules/comments/default_comments');
$block_arr = Array();
if ($default == "0") return def_module::parseTemplate(false, $block_arr, false);
if(!$template) $template = "default";
$parent_element_id = $this->analyzeRequiredPath($parent_element_id);
list($template_block, $template_line, $template_add_user, $template_add_guest, $template_smiles) = def_module::loadTemplates("comments/".$template,"comments_block", "comments_block_line", "comments_block_add_user", "comments_block_add_guest", "smiles");
$controller = cmsController::getInstance();
if ($controller->getModule("users")->is_auth()) {
$template_add = $template_add_user;
}else {
$template_add = (regedit::getInstance()->getVal("//modules/comments/allow_guest")) ? $template_add_guest : "";
}
$oHierarchy = umiHierarchy::getInstance();
$oParent = $oHierarchy->getElement($parent_element_id);
$template_line = $template_line;
$per_page = $this->per_page;
$curr_page = (int) getRequest('p');
$hierarchy_type_id = umiHierarchyTypesCollection::getInstance()->getTypeByName("comments", "comment")->getId();
$sel = new umiSelection;
$sel->setElementTypeFilter();
$sel->addElementType($hierarchy_type_id);
$sel->setHierarchyFilter();
$sel->addHierarchyFilter($parent_element_id);
$sel->setPermissionsFilter();
$sel->addPermissions();
$object_type_id = umiObjectTypesCollection::getInstance()->getBaseType("comments", "comment");
$object_type = umiObjectTypesCollection::getInstance()->getType($object_type_id);
$publish_time_field_id = $object_type->getFieldId('publish_time');
$sel->setOrderFilter();
$sel->setOrderByProperty($publish_time_field_id, false);
$sel->setLimitFilter();
$sel->addLimit($per_page, $curr_page);
$result = umiSelectionsParser::runSelection($sel);
$total = umiSelectionsParser::runSelectionCounts($sel);
$lines = Array();
$key_for_arr=Array();
$array_of_items=$this->getChildPages($idcat);
$i=0;
$ii=0;
for(reset($array_of_items);($k=key($array_of_items));next($array_of_items)){
$key_for_arr[$i]=$k;
$arr_in= $this->getChildPages($k);
for(reset($arr_in);($j=key($arr_in));next($arr_in)){
$result[$ii]=$j;
$ii++;
}
$i++;
}
sort($result);//Будут выводится в порядке возрастания, если нужен обратный порядок, следует заменить на rsort($result);
$i = 0;
foreach($result as $element_id) {
$line_arr = Array();
$element = $oHierarchy->getElement($element_id);
$line_arr['attribute:id'] = $element_id;
$line_arr['attribute:title'] = $element->getName();
$line_arr['attribute:author_id'] = $author_id = $element->getValue("author_id");
$line_arr['attribute:num'] = ($per_page * $curr_page) + (++$i);
$line_arr['xlink:href'] = "upage://" . $element_id;
$line_arr['xlink:author-href'] = "udata://users/viewAuthor/" . $author_id;
$line_arr['node:message'] = def_module::formatMessage($element->getValue("message"));
if($publish_time = $element->getValue('publish_time')) {
$line_arr['attribute:publish_time'] = $publish_time->getFormattedDate("U");
}
templater::pushEditable("comments", "comment", $element_id);
$lines[] = def_module::parseTemplate($template_line, $line_arr, $element_id);
}
$block_arr['subnodes:items'] = $block_arr['void:lines'] = $lines;
$template_add = def_module::parseTemplate($template_add, $add_arr, $parent_element_id);
if (!$controller->getCurrentTemplater() instanceof tplTemplater) {
$permissions = permissionsCollection::getInstance();
$regedit = regedit::getInstance();
$isAuth = $permissions->isAuth();
$isGuestAllowed = $regedit->getVal("//modules/comments/allow_guest");
}
return def_module::parseTemplate($template_block, $block_arr, $parent_element_id);
}
?>
В качестве первого параметра макрос будет принимать id раздела, комментарии которого нужно вывести, макрос работает на 1 раздел вглубь, то есть показывает комментарии к товарам, которые находятся в указанном разделе. Ну и конечно же необходимо добавить этот макрос в permissions.custom.php, для того, чтобы пользователи тоже видели результат работы макроса.