Вывод вопросов в FAQ в нужной последовательности

Материал из Umicms
Перейти к:навигация, поиск

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

Макрос %faq category()% выводит последний заданный вопрос внизу страницы. Иногда возникает ситуация, когда требуется вывести вопросы в обратном порядке, то есть последний вопрос вверху страницы. Для этого можно написать кастомный макрос, в котором будет другая последовательность вывода. В файл ~/classes/modules/faq/_custom.php или ~/classes/components/faq/customMacros.php в зависимости от используемой Вами реализации модулей после строки //TODO: Write here your own macroses нужно добавить код:

	public function category_custom($template = "default", $element_path = false, $limit = false, $ignore_paging = false, $order = false) {		
	if(def_module::breakMe()) return;
	if(!$template) $template = "default";
	list($template_block, $template_block_empty, $template_line) = def_module::loadTemplates("faq/".$template, "questions_block", "questions_block_empty", "questions_block_line");
		
	$category_id = def_module::analyzeRequiredPath($path);

	$hierarchy_type_id = umiHierarchyTypesCollection::getInstance()->getTypeByName("faq", "question")->getId();

	$per_page = ($limit) ? $limit : $this->per_page;
	$curr_page = (int) getRequest('p');
	if($ignore_paging) $curr_page = 0;
		
	$sel = new umiSelection;
	$sel->addElementType($hierarchy_type_id);
	$sel->addHierarchyFilter($category_id);
	$sel->addLimit($per_page, $curr_page);
	$sel->addPermissions();
	$result = umiSelectionsParser::runSelection($sel);
	$total = umiSelectionsParser::runSelectionCounts($sel);
	if(($sz = sizeof($result)) > 0) {
		$block_arr = Array();
		$block_arr['total'] = $total;
		$block_arr['per_page'] = $per_page;
		$lines = Array();
		for($i = 0; $i < $sz; $i++) {
			
			if ($order==false){
				$ii=$sz-$i-1;
			}else{
				$ii=$i;
			}
			if ($ii < $limit || $limit === false) {
				$element_id = $result[$ii];
				$element = umiHierarchy::getInstance()->getElement($element_id);
				if(!$element) continue;

					$line_arr = Array();
					$line_arr['attribute:id'] = $element_id;
					$line_arr['attribute:name'] = $line_arr['void:text'] = $element->getName();
					$line_arr['void:alt_name'] = $element->getAltName();
					$line_arr['attribute:link'] = umiHierarchy::getInstance()->getPathById($element_id);
					$line_arr['xlink:href'] = "upage://" . $element_id;
					$line_arr['question'] = nl2br($element->getValue("question"));
					$line_arr['answer'] = ($answer = $element->getValue("answer")) ? nl2br($answer) : nl2br($element->getValue("content"));
					
					templater::pushEditable("faq", "question", $element_id);

					$lines []= def_module::parseTemplate($template_line, $line_arr, $element_id);
				}
			}

			$block_arr['subnodes:items'] = $block_arr['void:lines'] = $lines;
			
			return def_module::parseTemplate($template_block, $block_arr, $category_id);
			} else {
				return $template_block_empty;
			}
		}

Также нужно добавить разрешение на использование этого макроса в файле ~/classes/modules/faq/permissions.custom.php или ~/classes/components/faq/permissions.custom.php в зависимости от используемой реализации модулей:

<?php
	$permissions = Array(
		'projects' => Array('category_custom')
	);
?>

Макрос вызывается аналогично макросу %faq category()% (%faq category_custom()%). В качестве пятого параметра макрос принимает направление вывода, по умолчанию false, в этом случае первым выведется последний добавленный вопрос, передав пятым параметром значение "1" (true), последний вопрос будет внизу страницы. остальные параметры полностью соответствуют макросу %faq category()%.