Вывод тем указанной конференции

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

Актуально для версии 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