1. Приветствуем Вас на неофициальном форуме технической поддержки XenForo на русском языке. XenForo - новый и перспективный форумный движок от бывших создателей vBulletin.

Нестандартное использование механизма Help_Wrapper в Xenforo

Тема в разделе "Статьи по XenForo Framework", создана пользователем megavolt, 24 апр 2011.

Загрузка
  1. megavolt

    megavolt Местный

    Регистрация:
    31.10.10
    Сообщения:
    80
    Симпатии:
    48
    Прилепить минисайтик из нескольких страничек к форуму можно используя и возможности ксена. Для примера создадим сайт из четырёх страниц - главная, новостная(при этом новости на неё будут выводиться из определённого раздела форума) и пара дополнительных.

    Итак, вначале создаём в панели управления префикс...скажем, site. Как это сделать - достаточно подробно описано в данном разделе форума. Также, не выходя из панели , создаём шаблоны-заглушки:

    site_start
    Код:
    Это главная страница
    site_page3
    Код:
    Третья страница
    site_page4
    Код:
    Это четвёртая страница
    Шаблон site_news - в нём будут выводиться новости из определённого в дальнейшем раздела форума

    Код:
    <h1>Новости</h1>
      <ol>
            <xen:foreach loop="$firstthread" value="$thread">
    
                <li>
                  <div class="primaryContent">
    
    <div class="subHeading">
    <p> <a target="blank" href="{xen:link "threads", $thread}" title="{$thread.title}">
    {$thread.title}</a></p>
    </div>
    
    <article><blockquote class="ugc baseHtml">
    {xen:helper bodytext, $thread.message  }</blockquote></article>
    <dt align=center><a target="blank" href="{xen:link "threads/unread", $thread}"
    title="{$thread.title}">
    Прочитать полностью</a></dt>
    
                        <dl class="secondaryContent pairsInline meta">
                            <dt>Автор темы - </dt>
    <dd><a href="{xen:link members, $thread}" class="username">{$thread.username}</a></dd>
            <dt>Размещена </dt> <dd><xen:datetime time="$thread.post_date" /></dd>
            <dt>Просмотров </dt> <dd>{$thread.view_count}</dd>
            <dt>Комментариев </dt> <dd>{$thread.reply_count}</dd>
    
                        </dl>
                    </div>
                </li>
            </xen:foreach>
    <p>&nbsp;</p>
        </ol>
    И шаблон site_wrapper. В нём прописывается общий контейнер того,что будет выводиться и адреса пунктов меню.
    Код:
    <xen:require css="help_wrapper.css" />
    <xen:title>Описание того,что Вы слепили</xen:title>
    <div class="container">
        <div class="helpSideBar">
            <ul>
                <li class="section"><h4 class="heading">Менюшка</h4>
                    <ul>
                        <li><a href="{xen:link site/}" class="{xen:if "{$selected} == ''",
    
    'secondaryContent', 'primaryContent'}">Главная</a></li>
                        <li><a href="{xen:link site/2}" class="{xen:if "{$selected} == '2'",
    
    'secondaryContent', 'primaryContent'}">Новости </a></li>
                        <li><a href="{xen:link site/3}" class="{xen:if "{$selected} == '3'",
    
    'secondaryContent', 'primaryContent'}">Страница 3</a></li>
                        <li><a href="{xen:link site/4}" class="{xen:if "{$selected} == '4'",
    
    'secondaryContent', 'primaryContent'}">Страница 4</a></li>
    
                    </ul>
                </li>
            </ul>
        </div>
    
        <div class="helpContent section sectionMain">{xen:raw $_subView}</div>
    </div>
    Потом создаём все необходимые файлы в library. Заострять внимание на этом не буду, если что - всё в аттаче. Интерес будет представлять только файл Site.php в папке library/Site/ControllerPublic/

    PHP:
    <?php

    class Site_ControllerPublic_Site extends XenForo_ControllerPublic_Abstract
    {
        public function 
    actionIndex()
        {
            
    $viewParams = array(
                
    'tosUrl' => XenForo_Dependencies_Public::getTosUrl()
    );
            return 
    $this->_getWrapper('',
                
    $this->responseView('XenForo_ViewPublic_Help_Index''site_start'$viewParams)
            );
        }

        public function 
    action2()
        {
            
    $viewParams = array(
    'firstthread'  => $this->_getSiteModel ()->getFirstThread (35140),

            );

            return 
    $this->_getWrapper('2',
                
    $this->responseView('XenForo_ViewPublic_Help_2''site_news'$viewParams)
            );
        }

        public function 
    action3()
        {
    $viewParams = array();

            return 
    $this->_getWrapper('3',
                
    $this->responseView('XenForo_ViewPublic_Help_3''site_page3'$viewParams)
            );
        }

        public function 
    action4()
        {
    $viewParams = array();

            return 
    $this->_getWrapper('4',
                
    $this->responseView('XenForo_ViewPublic_Help_4''site_page4'$viewParams)
            );
        }

        
    /**
        * Session activity details.
        * @see XenForo_Controller::getSessionActivityDetailsForList()
        */
        
    public static function getSessionActivityDetailsForList(array $activities)
        {
            return new 
    XenForo_Phrase('Та фраза, что будет выводиться в списке пользователей онлайн');
        }

        protected function 
    _getWrapper($selectedXenForo_ControllerResponse_View $subView)
        {
            
    $viewParams = array(
                
    'selected' => $selected,
                
    'tosUrl' => XenForo_Dependencies_Public::getTosUrl()
            );

            
    $wrapper $this->responseView('XenForo_ViewPublic_Help_Wrapper''site_wrapper'$viewParams);
            
    $wrapper->subView $subView;

            return 
    $wrapper;
        }

        protected function 
    _assertViewingPermissions($action)
        {

            
    parent::_assertViewingPermissions($action);
        }

        protected function 
    _getSiteModel()
        {
            return 
    $this->getModelFromCache('Site_Model_Code');
        }

    }
    Он представляет собой стандартный файл Xenforo Help.php, изменённый под наши нужды.
    При вызове actionIndex() , то бишь по переходу www.domain.ru/site/ будет показываться шаблон site_start . При вызове action2 ( www.domain.ru/site/2/) показывается раздел с новостями. Параметры функции getFirstThread - ID раздел с новостями, количество выводимых новостей, количество выводимых символов. Конечно же, для них лучше создать настройки в админпанели, просто весь этот код выдран из одного большого моего плагина, и мне лень:)
    При вызове action3 и action4 соответственно показываются шаблоны site_page3 и site_page4. Количество отображаемых страниц можно менять, добавляя или удаляя соответствующие action, необходимые шаблоны страниц, и пункты меню в site_wrapper по аналогии

    Минисайтом не обязательно ограничиваться. Например, я делаю подобные странички на поддоменах для больших разделов форума, а темы из подразделов выводятся по кликам в меню, наподобие новостей в примере. Или, опять же на поддоменах, висят странички
    пользователей и организаций, с выводом тем из форума.В общем, здесь приведён только макет и информация к размышлению:)

    Буфер обмена1.jpg Буфер обмена2.jpg Буфер обмена3.jpg

    З.Ы. Пример некоторое время провисит по этому адресу: http://www.pomortaxi.ru/site/
     

    Вложения:

    • site.zip
      Размер файла:
      2,5 КБ
      Просмотров:
      13
    Romchik®, Yoskaldyr и CyberAP нравится это.
  2. CyberAP

    CyberAP Местный

    Регистрация:
    05.10.10
    Сообщения:
    2.558
    Симпатии:
    1.589
    Версия XF:
    1.5.9
    А почему бы не использовать шаблон который создаётся вместе со страницей? Называться он будет _page_node.xx, где xx - id страницы.
    А в настройках страницы можно включить отображение дочерних страниц и страниц того же уровня.
    И никакого php не надо :)
     
  3. megavolt

    megavolt Местный

    Регистрация:
    31.10.10
    Сообщения:
    80
    Симпатии:
    48
    Главная страница вида http://domain.ru/site/ выглядит лучше, чем http://domain.ru/pages/site/
    Построение меню в моём примере получается более нагляднее.
    Да и php не надо отбрасывать...я привёл как образец вывод тем из раздела, но этим ограничиваться не нужно:)
    Скажем, у меня областной форум, и я хочу сделать подсайт /weather/ с выводом погоды на несколько дней для каждого из райцентров. Как будет лучше - сделать около 20 шаблонов по вашему способу, или всего два в моём варианте? Причём php придётся использовать и в том, и в другом случае.
     
    AOTN и CyberAP нравится это.
  4. Yoskaldyr

    Yoskaldyr Пользователь

    Регистрация:
    27.09.10
    Сообщения:
    1.919
    Симпатии:
    1.154
    Версия XF:
    1.0.4
    Все конечно хорошо, но только в качестве нестандартного подхода. Зачем делать копию стандартного ксеновкого файла, если можно просто наследовать его, т.е. изменять только методы, которые необходимо изменить???
    И еще - модель сайта (да и все основные файлы) лежат совсем не по тем путям, которым должны
    Т.е. модель Site_Model_Code должна лежать в library\Site\Model\Code.php а не в library\Model\Code.php ну и все остальные файлы соответственно.

    И еще сразу надо предупреждать что текущая модель, не выводит ббкоды.

    И еще более логично и правильно обработку ббкодов именно во вью класс запихивать, а не в модель. Не надо идти путем Jaxel-а, пишушего 8WR продукты.

    За старания - однозначно зачет.
    За качество исполнения - однозначно незачет.
     
    FractalizeR, Romchik® и CyberAP нравится это.
  5. megavolt

    megavolt Местный

    Регистрация:
    31.10.10
    Сообщения:
    80
    Симпатии:
    48
    Это куда-то потерялось когда файлы упаковывал:eek:

    На php я начал что-то лепить 5 месяцев назад одновременно с установкой форума, так что это ошибки молодости...:)
     
    Yoskaldyr нравится это.
  6. Romchik®

    Romchik® The Power of Dreams Команда форума

    Регистрация:
    26.09.10
    Сообщения:
    5.736
    Симпатии:
    5.263
    Версия XF:
    1.5.10
    Это нормально, без них никуда. Главное, чтобы они были учтены в будущем ;)
     
    Mirovinger и Yoskaldyr нравится это.

Поделиться этой страницей