Иконка ресурса

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

Jumuro

Проверенные
Сообщения
1,324
Реакции
2,491
Баллы
11,345
Пользователь Jumuro разместил новый ресурс:

Собственные страницы (подробно) - Создание произвольных страниц и навигационных вкладок

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

И так, начнем.
Для начала переведем форум в режим отладки. для этого добавим в файл /library/config.php строчку
Код:
$config['debug'] = true;

Теперь создадим...

Узнать больше об этом ресурсе...[DOUBLEPOST=1398636633,1398636610][/DOUBLEPOST]Вложение для ресурса.
 

Вложения

  • CustomNavTabs.zip
    2.1 KB · Просмотры: 108
Произошла ошибка:
ID дополнения:
Пожалуйста, введите ID, используя следующий набор символов: a-z, A-Z, 0-9 и _.
 
Вроде всё понятно, ид дополнения может содержать только латиницу, цифры и символ подчёркивания.
 
  • Мне нравится
Реакции: Hope
И так всем привет!
В этом мануале а точнее в файле по пути - library/CustomNavTabs/ControllerPublic/Chat.php
PHP:
public static function getSessionActivityDetailsForList(array $activities)
{
     return new XenForo_Phrase('viewing_chat_content');
}

Выводит обычную фразу без ссылки. Такого вида.
za-1.png

Если вам нужно сделать кликабельной ссылкой, всё очень просто.
Во фразе viewing_chat_content
Мы пишем обычный текст
za-2.png

После чего в файле по этому пути library/CustomNavTabs/ControllerPublic/Chat.php
Заменяем этот код
PHP:
public static function getSessionActivityDetailsForList(array $activities)
{
     return new XenForo_Phrase('viewing_chat_content');
}

На этот
PHP:
public static function getSessionActivityDetailsForList(array $activities)
{
        $output = array();
        foreach ($activities as $key => $activity)
        {
            $output[$key] = array(
                new XenForo_Phrase('viewing_chat_content'),
                new XenForo_Phrase('Баллы'),
                XenForo_Link::buildPublicLink('point'),
                false
            );
        }
        return $output;
}

XenForo_Phrase('viewing_chat_content') - сама фраза
XenForo_Phrase('Баллы') - выводит после нашей фразы XenForo_Phrase('viewing_chat_content')
buildPublicLink('point') - ссылка на XenForo_Phrase('Баллы')

Сохраняем и всё.
za-3.png
 
Последнее редактирование:
Не совсем пойму, как добавлять страницы

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

Как должна выглядеть ссылка и как, соответственно, страница?
 
Не совсем пойму, как добавлять страницы

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

Как должна выглядеть ссылка и как, соответственно, страница?
Если вдумчиво читать статью, то всё станет понятно.
 
У всех (большинства) всё получается. И без знания архитектуры.
В статье всё расписано - как еще проще объяснить я не знаю..
 
Если ограничиваться одной страницей, то проблем никаких. Все как в статье.
Если нужно несколько страниц, начинаются вопросы:
1. Контроллеры. Делаем несколько. На каждую страницу. Этого не описано. Либо нужно формировать действия, по аналогии с actionIndex (не пробовал).
2. Префиксы (CustomNavTabs_Route_Prefix_Extra). Добавляем в выборку нужного маршрута.
3. Навигация (CustomNavTabs_Listeners_Navigation). Пункт меню. Не разобрался до конца.
4. Шаблоны. Всё просто.

Не разобрался с тем, как для разных страниц с разным префиксом (/chat/test1, /chat/test2) отображать элементы меню. CustomNavTabs_Listeners_Navigation тут прописан один префикс.

Не разобрался, как в контроллере формируется вот это:
return $this->responseView('CustomNavTabs_ViewPublic_Chat', 'extra_chat', $viewParams);
а именно, как строится CustomNavTabs_ViewPublic_Chat и где оно лежит.
 
У меня вопрос. Как правильно указать id CustomNavTabs, что бы в меню рядом с названием вкладки вставить иконку FontAwesome?
Для стандартных вкладок все просто:

.navTab.forums .navLink:before {
content: '\f0e6';
font-family: FontAwesome;
font-size: 15px;
font-weight: normal;
padding-right: 3px;
}

А вот с вкладкой созданной Вашим методом не получается вставить картину.
 
С navigation_tabs разобрался, все оказалось просто если следовать инструкции.
Но мне нужны вкладки для меню, которое было сделано вручную и в изначальном шаблоне его нет.
Вот тут я и запутался...
Мое меню версталось в шаблоне "logo_block" и начинается со строк <ul class="menu">.

Как мне быть, дайте подсказку

Новый вопрос. после префикса extra можно вводить все что угодно в строке адреса и страницы будут дублироваться кучу раз, как это исправить?
/extra/пиши-чо-угодно-страница-будет
 
С navigation_tabs разобрался, все оказалось просто если следовать инструкции.
Но мне нужны вкладки для меню, которое было сделано вручную и в изначальном шаблоне его нет.
Вот тут я и запутался...
Мое меню версталось в шаблоне "logo_block" и начинается со строк <ul class="menu">.

Как мне быть, дайте подсказку

Новый вопрос. после префикса extra можно вводить все что угодно в строке адреса и страницы будут дублироваться кучу раз, как это исправить?
/extra/пиши-чо-угодно-страница-будет

Привет, Improvs!

В файле Extra.php
Найди этот код
PHP:
$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;
}

Попробуй заменить на это.
PHP:
$urlComponents = explode('/', $routePath);
$subPrefix = strtolower(array_shift($urlComponents));

if($urlComponents[0] == ' ') {
          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);
} else {
          switch($subPrefix)
          {
           default:
                        $controllerName = 'CustomNavTabs_ControllerPublic_Chat';
                        $routeName = '/';
                        break;
           }
           return $router->getRouteMatch($controllerName, 'redirect', $routeName, $routePath);
}

Потом в файле Index.php
Добавляем
такой код
PHP:
public function actionRedirect() {
        return $this->responseRedirect(
                    XenForo_ControllerResponse_Redirect::SUCCESS,
                    XenForo_Link::buildPublicLink('/forum'),
                    'Ошибка'
                );
}

Если у вас есть еще роутинги через к примеру /chat/blabla
В файле Extra.php делаем так
PHP:
$urlComponents = explode('/', $routePath);
$subPrefix = strtolower(array_shift($urlComponents));

if($urlComponents[0] == ' ') {
          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);
} elseif ($urlComponents[0] == 'blabla') {
          switch($subPrefix) {
          case 'chat/blabla/':
                        $controllerName = 'CustomNavTabs_ControllerPublic_BlaBla';
                        $routeName = 'extra/chat/blabla/';
                        break;
          default:
                        $controllerName = 'CustomNavTabs_ControllerPublic_BlaBla';
                        $routeName = 'extra/chat/blabla/';
                        break;
           }
           return $router->getRouteMatch($controllerName, 'index', $routeName, $routePath);
} else {
          switch($subPrefix)
          {
           default:
                        $controllerName = 'CustomNavTabs_ControllerPublic_Chat';
                        $routeName = '/';
                        break;
           }
           return $router->getRouteMatch($controllerName, 'redirect', $routeName, $routePath);
}
 
  • Мне нравится
Реакции: Hope
Георгий Шевченко, привет.
У меня index.php не принимает такой код:
public function actionRedirect() {
return
$this->responseRedirect(
XenForo_ControllerResponse_Redirect::SUCCESS,
XenForo_Link::buildPublicLink('/forum'),
'Ошибка'
);
}

После добавки такого кода сайт отображает белую страницу.
Если у вас есть еще роутинги через к примеру /chat/blabla
В файле Extra.php делаем так
Ошибку выдает
 
Георгий Шевченко, привет.
У меня index.php не принимает такой код:


После добавки такого кода сайт отображает белую страницу.

Ошибку выдает

В файл Index.PHP (который лежит в папке ControllerPublic) вы там добавили?
PHP:
public function actionRedirect() {
 return $this->responseRedirect(
 XenForo_ControllerResponse_Redirect::SUCCESS,
 XenForo_Link::buildPublicLink('/forum'),
 'Ошибка'
 );
}

Последнее было не обязательно делать, это если есть еще роутинги.
Главное сделать вам это для начало.

PHP:
$urlComponents = explode('/', $routePath);
$subPrefix = strtolower(array_shift($urlComponents));

if($urlComponents[0] == ' ') {
 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);
} else {
 switch($subPrefix)
 {
 default:
 $controllerName = 'CustomNavTabs_ControllerPublic_Chat';
 $routeName = '/';
 break;
 }
 return $router->getRouteMatch($controllerName, 'redirect', $routeName, $routePath);
}
 
  • Мне нравится
Реакции: Hope
Похоже у меня и там и там ошибки, если не сложно, выложи полные файлы, попробую, а то не в какую не идет
 
Похоже у меня и там и там ошибки, если не сложно, выложи полные файлы, попробую, а то не в какую не идет

Ты лучше свои выложи, я поправлю.
А то у меня всё переделанное.
 
chat.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');
    }
}

Extra.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);
    }
}
 
chat.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');
    }
}

Extra.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);
    }
}



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 function actionRedirect() {
     return $this->responseRedirect(
          XenForo_ControllerResponse_Redirect::SUCCESS,
          XenForo_Link::buildPublicLink('/forum'),
          'Ошибка'
          );
     }
    public static function getSessionActivityDetailsForList(array $activities)
    {
        return new XenForo_Phrase('viewing_chat_content');
    }
}


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));

        if($urlComponents[0] == ' ') {
        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);
} else {
 switch($subPrefix)
 {
 default:
 $controllerName = 'CustomNavTabs_ControllerPublic_Chat';
 $routeName = '/';
 break;
 }
 return $router->getRouteMatch($controllerName, 'redirect', $routeName, $routePath);
}
    }
}
 
Современный облачный хостинг провайдер | Aéza
Назад
Сверху Снизу