Вывод тем указанной конференции
Актуально для версии 2.9
Для вывода тем текущей конференции используется макрос forum conf(). Если требуется вывести темы не текущей, а какой нибудь определённой конференции то можно написать кастомный макрос, на основе существующего forum conf(), который в качестве одного из параметров принимает id конференции. Для начала скопируем код метода conf из файла ~/classes/modules/forum/class.php и поместим его в файл в этой же директории __custom.php сразу после строки //TODO: Write here your own macroses после чего изменим его название на conf_custom. Чтобы макрос мог принимать в качестве параметра id конференции, изменим первую строку таким образом:
public function conf_custom($template = "default", $conf_id = "false", $per_page = false, $ignore_context = false)
после этого надо заменить строку
$element_id = cmsController::getInstance()->getCurrentElementId();
на
if (!$conf_id) {
$element_id = cmsController::getInstance()->getCurrentElementId();
} else {
$element_id = $conf_id;
}
и заменить в методе все self на def_module. в итоге мы получим такой метод:
<?php
public function conf_custom($template = "default", $conf_id = "false", $per_page = false, $ignore_context = false) {
if (!$template)
$template = "default";
list($template_block, $template_line) = def_module::loadTemplates("forum/" . $template, "topics_block", "topics_block_line");
if (!$conf_id) {
$element_id = cmsController::getInstance()->getCurrentElementId();
} else {
$element_id = $conf_id;
}
$element = umiHierarchy::getInstance()->getElement($element_id);
$this->pushEditable("forum", "conf", $element_id);
$per_page = ($per_page) ? $per_page : $this->per_page;
$curr_page = getRequest('p');
$sel = new umiSelection;
$sel->setLimitFilter();
$sel->addLimit($per_page, $curr_page);
$sel->setElementTypeFilter();
$topic_hierarchy_type_id = umiHierarchyTypesCollection::getInstance()->getTypeByName("forum", "topic")->getId();
$sel->addElementType($topic_hierarchy_type_id);
if (!$ignore_context) {
$sel->setHierarchyFilter();
$sel->addHierarchyFilter($element_id);
} else {
$sel->forceHierarchyTable();
}
$object_type_id = umiObjectTypesCollection::getInstance()->getBaseType("forum", "topic");
$object_type = umiObjectTypesCollection::getInstance()->getType($object_type_id);
$publish_time_field_id = $object_type->getFieldId('publish_time');
$last_post_time_field_id = $object_type->getFieldId('last_post_time');
$sel->setOrderFilter();
if (getRequest('order_property')) {
// == 'order by' requirements processing start
$b_asc = false;
$s_order_direction = getRequest('order_direction');
if (strtoupper($s_order_direction) === 'ASC')
$b_asc = true;
$s_order_property = getRequest('order_property');
if (!$s_order_property)
$s_order_property = 'publish_time';
switch ($s_order_property) {
/*
Дата создания - publish_time
Автор - author_id
Дата последнего добавления - last_post_time
sys::ord
sys::rand
sys::name
sys::objectid
*/
case 'sys::ord':
$sel->setOrderByOrd();
break;
case 'sys::rand':
$sel->setOrderByRand();
break;
case 'sys::name':
$sel->setOrderByName($b_asc);
break;
case 'sys::objectid':
$sel->setOrderByObjectId($b_asc);
break;
default:
$publish_time_field_id = $object_type->getFieldId($s_order_property);
if (!$publish_time_field_id)
$publish_time_field_id = $object_type->getFieldId('publish_time');
$sel->setOrderByProperty($publish_time_field_id, $b_asc);
break;
}
// == 'order by' requirements processing fin
} else {
if ($last_post_time_field_id) {
if (regedit::getInstance()->getVal("//modules/forum/sort_by_last_message")) {
$sel->setOrderByProperty($last_post_time_field_id, false);
} else {
$sel->setOrderByProperty($publish_time_field_id, false);
}
}
}
$sel->setPermissionsFilter();
$sel->addPermissions();
$result = umiSelectionsParser::runSelection($sel);
$total = umiSelectionsParser::runSelectionCounts($sel);
unset($sel);
$block_arr = Array();
$lines = Array();
foreach ($result as $topic_element_id) {
$line_arr = Array();
$topic_element = umiHierarchy::getInstance()->getElement($topic_element_id);
if (!$topic_element) {
continue;
}
$messages_count = $this->getTopicMessagesCount($topic_element_id);
$line_arr['attribute:id'] = $topic_element_id;
$line_arr['attribute:link'] = umiHierarchy::getInstance()->getPathById($topic_element_id);
$line_arr['attribute:messages_count'] = $messages_count;
$line_arr['xlink:href'] = "upage://" . $topic_element_id;
$line_arr['node:name'] = $topic_element->getName();
$lines[] = def_module::parseTemplate($template_line, $line_arr, $topic_element_id);
$this->pushEditable("forum", "topic", $topic_element_id);
}
$block_arr['attribute:id'] = $element_id;
$block_arr['subnodes:lines'] = $lines;
$block_arr['total'] = $total;
$block_arr['per_page'] = $per_page;
return def_module::parseTemplate($template_block, $block_arr, $element_id);
}
?>
теперь необходимо разрешить пользователям этот метод использовать, для чего в файл permissions.custom.php из этой директории добавить код
<?php
$permissions = Array(
"view" => Array(
'conf_custom'
)
);
?>
теперь для вывода тем нужной конференции можно просто в качестве второго параметра указать id нужной конференции, например udata://forum/conf_custom/notemplate/5396