Вывод вопросов в FAQ в нужной последовательности
Актуально для версии 2.9
Макрос %faq category()% выводит последний заданный вопрос внизу страницы. Иногда возникает ситуация, когда требуется вывести вопросы в обратном порядке, то есть последний вопрос вверху страницы. Для этого можно написать кастомный макрос, в котором будет другая последовательность вывода. В файл ~/classes/modules/faq/_custom.php после строки //TODO: Write here your own macroses нужно добавить код:
public function category_custom($template = "default", $element_path = false, $limit = false, $ignore_paging = false, $order = false) {
if($this->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 = $this->analyzeRequiredPath($element_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:
<?php
$permissions = Array(
'projects' => Array('category_custom')
);
?>
Макрос вызывается аналогично макросу %faq category()% (%faq category_custom()%). В качестве пятого параметра макрос принимает направление вывода, по умолчанию false, в этом случае первым выведется последний добавленный вопрос, передав пятым параметром значение "1" (true), последний вопрос будет внизу страницы. остальные параметры полностью соответствуют макросу %faq category()%. С версии 2.8.5.2 данный функционал присутствует в коробочной версии.