Собственные страницы (подробно)

Raerek

Регистрация
17.01.16
Сообщения
131
Симпатии
13
#1
В следующем примере я покажу, как можно создать в меню навигации форума дополнительные кнопки, ведущие на страницы с произвольным контентом.
Созданные кнопки будут работать так же, как и основные, т.е. при переходе будут подсвечиваться и иметь свое суб-меню, а контент страниц будет правильно интегрирован в шаблон форума.

ВНИМАНИЕ! Не занимайтесь бездумным копипастом! Будьте внимательны и тогда всё получится.

И так, начнем.
Для начала переведем форум в режим отладки. для этого добавим в файл /library/config.php строчку:
Код:
$config['debug'] = true;
Теперь создадим необходимые для работы папки и файлы.
Или скачайте архив CustomNavTabs.zip из вложения в теме с обсуждением ресурса и распакуйте в папку library.
Листинг:
Код:
library/CustomNavTabs/ControllerPublic/Chat.php
library/CustomNavTabs/Listeners/Navigation.php
library/CustomNavTabs/Route/Prefix/Extra.php
Содержимое файла library/CustomNavTabs/ControllerPublic/Chat.php
PHP:
<?php

class CustomNavTabs_ControllerPublic_Chat extends XenForo_ControllerPublic_Abstract
{
    public function actionIndex()
    {
        $visitor = XenForo_Visitor::getInstance();
        $sessionModel = $this->getModelFromCache('XenForo_Model_Session');

        $onlineUsers = $sessionModel->getSessionActivityQuickList(
            $visitor->toArray(),
            array('cutOff' => array('>', $sessionModel->getOnlineStatusTimeout())),
            ($visitor['user_id'] ? $visitor->toArray() : null)
        );

        $boardTotals = $this->getModelFromCache('XenForo_Model_DataRegistry')->get('boardTotals');
        if (!$boardTotals)
            $boardTotals = $this->getModelFromCache('XenForo_Model_Counters')->rebuildBoardTotalsCounter();

        $viewParams = array(
            'onlineUsers' => $onlineUsers,
            'boardTotals' => $boardTotals
        );

        return $this->responseView('CustomNavTabs_ViewPublic_Chat', 'extra_chat', $viewParams);
    }
    public static function getSessionActivityDetailsForList(array $activities)
    {
        return new XenForo_Phrase('viewing_chat_content');
    }
}
CustomNavTabs_ControllerPublic_Chat - должно соответствовать пути к данному файлу.
CustomNavTabs_ViewPublic_Chat - конец строки _Chat должен соответсвовать имени данного файла
'extra_chat' - имя шаблона для вывода контента
'viewing_chat_content' - имя фразы, отвечающей для страницы "Сейчас на форуме"

Содержимое файла library/CustomNavTabs/Listeners/Navigation.php
PHP:
<?php

class CustomNavTabs_Listeners_Navigation
{
    public static function navtabs(array &$extraTabs, $selectedTabId)
    {
        $extraTabs['extra/chat/'] = array(
            'title' => new XenForo_Phrase('chat_nav_tab'),
            'href' => XenForo_Link::buildPublicLink('full:extra/chat/'),
            'selected' => ($selectedTabId == 'pages'),
            'position' =>  'middle',
            'selected' =>  ($selectedTabId == 'extra/chat/'),
            'linksTemplate' => 'extra_chat_sublinks',
        );
    }
}
CustomNavTabs_Listeners_Navigation - должно соответствовать пути к данному файлу.
'chat_nav_tab' - имя фразы, отвечающей за название создаваемой вкладки в меню.
'href' - путь до создаваемой страницы
'position' - позиция в меню. Возможны варианты home, end или middle.
'extra_chat_sublinks' - имя шаблона дополнительных ссылок ниже вкладок, false - без ссылок.

Содержимое файла library/CustomNavTabs/Route/Prefix/Extra.php
PHP:
<?php

class CustomNavTabs_Route_Prefix_Extra implements XenForo_Route_Interface
{
    public function match($routePath, Zend_Controller_Request_Http $request, XenForo_Router $router)
    {
        $urlComponents = explode('/', $routePath);
        $subPrefix = strtolower(array_shift($urlComponents));

        switch($subPrefix)
        {
            case 'chat':
                $controllerName = 'CustomNavTabs_ControllerPublic_Chat';
                $routeName = 'extra/chat/';
                break;
            default:
                $controllerName = 'CustomNavTabs_ControllerPublic_Chat';
                $routeName = 'extra/chat/';
                break;
        }

        return $router->getRouteMatch($controllerName, 'index', $routeName, $routePath);
    }
}
CustomNavTabs_Route_Prefix_Extra - должно соответствовать пути к данному файлу.
CustomNavTabs_ControllerPublic_Chat - должно соответствовать пути к файлу library/CustomNavTabs/ControllerPublic/Chat.php


С файлами закончили. Теперь перейдем в админку форума.

Создадим новое дополнение (ссылка

Пожалуйста, войдите или зарегистрируйтесь для просмотра текста.

)
ID дополнения: Custom Nav Tabs
Заголовок: Custom Nav Tabs
Информация о версии: 1
Номер версии: 1

Содадим новый префикс роутинга (ссылка

Пожалуйста, войдите или зарегистрируйтесь для просмотра текста.

)
Префикс роутинга: extra
Тип роутинга: Публичный
Класс роутинга: CustomNavTabs_Route_Prefix_Extra
Использовать класс для генерации ссылки: Всегда
Дополнение: Custom Nav Tabs
(К этому префиксу в дальнейшем можно будет добавлять и другие новые страницы. Ссылки на них буду иметь вид

Пожалуйста, войдите или зарегистрируйтесь для просмотра текста.

)

Содадим новый обработчик событий (ссылка

Пожалуйста, войдите или зарегистрируйтесь для просмотра текста.

)
Обрабатывать событие: navigation_tabs
Класс: CustomNavTabs_Listeners_Navigation
Метод: navtabs
Порядок выполнения обработчиков: 1
Дополнение: Custom Nav Tabs

Создадим новую фразу (ссылка

Пожалуйста, войдите или зарегистрируйтесь для просмотра текста.

)
Заголовок: chat_nav_tab
Текст фразы: Чат
Дополнение: Custom Nav Tabs
Добавлять данную фразу в глобальный кэш

Создадим еще одну новую фразу (ссылка

Пожалуйста, войдите или зарегистрируйтесь для просмотра текста.

)
Заголовок: viewing_chat_content
Текст фразы: В чате
Дополнение: Custom Nav Tabs
Добавлять данную фразу в глобальный кэш

Создадим новый шаблон (ссылка

Пожалуйста, войдите или зарегистрируйтесь для просмотра текста.

)
Имя шаблона: extra_chat_sublinks
Содержимое шаблона:

Код:
<ul class="secondaryContent blockLinksList">
    <li><a href="ваша ссылка">Суб-меню 1</a></li>
    <li><a href="ваша ссылка">Суб-меню 1</a></li>
    <li><a href="ваша ссылка">Суб-меню 3</a></li>
</ul>
Дополнение: Custom Nav Tabs

Создадим еще один новый шаблон (ссылка

Пожалуйста, войдите или зарегистрируйтесь для просмотра текста.

)
Имя шаблона: extra_chat
Содержимое шаблона:

HTML:
<xen:h1>Заголовок страницы</xen:h1>
<xen:title>Название страницы</xen:title>
<xen:description>Описание страницы</xen:description>

КОНТЕНТ СТРАНИЦЫ В ФОРМАТЕ HTML

<xen:sidebar>
    <xen:include template="sidebar_online_users" />
    <xen:include template="forum_stats" />
</xen:sidebar>
Дополнение: Custom Nav Tabs

Вот и закончили - можно проверять результат.
Данным способом можно создавать любые страницы.
Так же не обязательно создавать саму страницу, можно сделать вкладки просто для ссылок и в таком случае обработчик событий создавать не нужно.
 

Вложения