Вывод комментариев раздела

Материал из Umicms
Версия от 10:08, 5 июня 2013; Mad grant (обсуждение | вклад)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к:навигация, поиск

Актуально для версии 2.9

Может возникнуть ситуация, когда нужно пользователям показать комментарии, которые добавили к товарам в разделе каталога. Это может понадобиться для того, чтобы пользователь мог знать, какие обсуждения сейчас идут в комментариях. Для реализации, потребуется небольшая доработка стандартного макроса комментариев %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, для того, чтобы пользователи тоже видели результат работы макроса.