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

Пишем аддон для отображения списка последних тем на главной странице

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

Загрузка
  1. FractalizeR

    FractalizeR XenForo Addicted

    Регистрация:
    27.09.10
    Сообщения:
    1 085
    Симпатии:
    832
    Версия XF:
    1.3.2
    Добрый день.

    Это моя вторая статья из цикла "Пишем аддоны для XenForo". Для лучшего понимания материала я советую вам сначала прочесть статью XenForo: Краткий обзор архитектуры форума для программистов, а затем Пишем первый аддон для XenForo. MVC, шаблоны, стили, настройки, навигация — используем все!

    Итак, наше задание на сегодня написать аддон, который бы выводил список последних созданных на форуме сообщений на главной странице. Этот список мы будем вставлять в низ правой колонки под списком пользователей онлайн.

    Пройдясь поиском по шаблонам, можно убедиться, что нам нужен шаблон forum_list. Еще раз поискав по исходным текстам XenForo строку forum_list, мы приходим к выводу, что этот шаблон отрисовывает контроллер XenForo_ControllerPublic_Index. Чтобы отобразился наш список, нам нужно будет отредактировать шаблон forum_list, вставив туда нужную нам информацию и передать дополнительные параметры в этот шаблон. Привожу текст, который нужно вставить в шаблон forum_list перед завершающим его тегом </xen:sidebar>:
    HTML:
    <div class="section">
        <div class="secondaryContent statsList" id="xrf_lastpostsonhome">
            <h3>Последние темы</h3>
            <div class="pairsJustified">
                <xen:foreach loop="$xfr_lastthreadsonhome" value="$xfr_thread">
                    <dl class="discussionCount"><dt><a href="{xen:link "threads/unread", $xfr_thread}" title="{$xfr_thread.title}">{xen:helper wordTrim, $xfr_thread.title, 30}</a></dt>
                        <dd class="faint"><xen:datetime time="$thread.post_date" /></dd></dl>
                </xen:foreach>
            </div>
        </div>
    </div>
    • В переменную $xfr_lastthreadsonhome мы передадим список последних тем форума.
    • $xfr_thread на каждом витке цикла будет содержать данные об очередной теме.
    • {xen:link "threads/unread", $xfr_thread} на основании информации о теме построит нам красивую ссылку на нее.
    • {xen:helper wordTrim, $xfr_thread.title, 30} обрежет название темы, чтобы оно нам весь дизайн не изуродовало.
    • <xen:datetime time="$thread.post_date" /> красиво (или не очень) отформатирует дату и время создания поста.
    Теперь нужно перейти в админку и создать там наш аддон, как мы это делали ранее.


    Теперь пишем код. Нам нужно расширить класс контроллера, заставив его передавать дополнительные параметры в код. Вспомогательный класс для этой цели мы поместим в файл \library\XFR\ShowLastThreadsOnHome\Plugin.php. Его код:
    PHP:
    <?php
    class XFR_ShowLastThreadsOnHome_Plugin {
        public static function 
    Extend($class, &$extend) {
            if (
    $class === 'XenForo_ControllerPublic_Index')
                
    $extend [] = 'XFR_ShowLastThreadsOnHome_Controller_ShowLastThreadsOnHome';
        }
    }
    В этом файле мы просто говорим, что если имя переданного класса равно имени контроллера, который мы хотим усовершенствовать, его нужно расширить классом по имени XFR_ShowLastThreadsOnHome_Controller_ShowLastThreadsOnHome

    Теперь мы создаем сам класс расширяющего контроллера. Разместим его в папке \library\XFR\ShowLastThreadsOnHome\Controller\ ShowLastThreadsOnHome.php. Вот его код:
    PHP:
    <?php
    class XFR_ShowLastThreadsOnHome_Controller_ShowLastThreadsOnHome extends XFCP_XFR_ShowLastThreadsOnHome_Controller_ShowLastThreadsOnHome {
        public function 
    actionIndex() {
            
    //Вызываем XenForo_ControllerPublic_Index::actionIndex
            
    $response parent::actionIndex ();

            
    //Задаем параметры запроса тем
            
    $postFetchOptions = array ('limit' => 30'order' => 'post_date''orderDirection' => 'desc' );

            
    //Накладываем некоторые условия
            
    $postFetchConditions = array ('deleted' => false'moderated' => false );

            
    //Присваиваем переменной xfr_lastthreadsonhome в шаблоне результат получения тем из базы
            
    $response->params ['xfr_lastthreadsonhome'] = $this->_getThreadModel ()->getThreads (
                    
    $postFetchConditions$postFetchOptions );

            
    //Возвращаем результат виду
            
    return $response;
        }
        
    /**
         * @return XenForo_Model_Thread
         */
        
    protected function _getThreadModel() {

            
    //Возвращаем модель данных о темах
            
    return $this->getModelFromCache 'XenForo_Model_Thread' );
        }
    }
    Имя XFCP_XFR_ShowLastThreadsOnHome_Controller_ShowLastThreadsOnHome в данном случае - это специальное имя класса, которое равно нашему оригинальному с префиксом XFCP. XenForo создаст его в процессе работы динамически.

    Теперь в админке вам нужно создать обработчик события load_class_controller и в параметрах выполнения указать, что нужно использовать класс XFR_ShowLastThreadsOnHome_Plugin, метод Extend.

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

    Вложения:

    Smalesh, ZloYCRipeeR, Kranch и 7 другим нравится это.
  2. CyberAP

    CyberAP Местный

    Регистрация:
    05.10.10
    Сообщения:
    2 604
    Симпатии:
    1 660
    Версия XF:
    1.5.10
    А готовый аддон не выложишь? :)
     
  3. FractalizeR

    FractalizeR XenForo Addicted

    Регистрация:
    27.09.10
    Сообщения:
    1 085
    Симпатии:
    832
    Версия XF:
    1.3.2
    Прикрепил
     
    CyberAP нравится это.
  4. CyberAP

    CyberAP Местный

    Регистрация:
    05.10.10
    Сообщения:
    2 604
    Симпатии:
    1 660
    Версия XF:
    1.5.10
    Кстати, есть ли способ обойтись вообще без правки шаблона? Чтобы аддон сам добавлял блок с темами в forum_list.
     
  5. FractalizeR

    FractalizeR XenForo Addicted

    Регистрация:
    27.09.10
    Сообщения:
    1 085
    Симпатии:
    832
    Версия XF:
    1.3.2
    Пока нет. Кир скоро реализует шаблонные хуки и тогда будет. Пока руками. Ну, еще вроде можно где-то str_replace сделать, но я пока удобное место найти не могу.
     
  6. Romchik®

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

    Регистрация:
    26.09.10
    Сообщения:
    5 746
    Симпатии:
    5 311
    Версия XF:
    1.5.18
    Надеюсь это произойдет довольно скоро. Не слышно, будет ли это во второй бете? Ибо реально напрягает пока.
     
    CyberAP нравится это.
  7. CyberAP

    CyberAP Местный

    Регистрация:
    05.10.10
    Сообщения:
    2 604
    Симпатии:
    1 660
    Версия XF:
    1.5.10
    Я не ставлю аддоны которые требуют модификации шаблонов.
     
    FractalizeR нравится это.
  8. Romchik®

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

    Регистрация:
    26.09.10
    Сообщения:
    5 746
    Симпатии:
    5 311
    Версия XF:
    1.5.18
    Так в том то и дело, что пока это везде нужно делать. Ну или почти везде. Поэтому тоже не тороплюсь особо. Но после беты 2-й можно будет пару проверить.
     
  9. CyberAP

    CyberAP Местный

    Регистрация:
    05.10.10
    Сообщения:
    2 604
    Симпатии:
    1 660
    Версия XF:
    1.5.10
    есть аддон который внизу темы выводит юзеров которые сецчас смотрят эту тему. Так вот для его работы я ничего не модифицировал.
     
  10. Yoskaldyr

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

    Регистрация:
    27.09.10
    Сообщения:
    1 921
    Симпатии:
    1 163
    Версия XF:
    1.0.4
    Если есть желание, что бы в шаблонах не было темплейт хуков, а был намного более удобный функционал как хак TMS для булки (автоматическое изменения шаблонов самим плагином, т.е. фактически можно сделать себе темплейт хук в любом месте ,а не только там где захотел автор шаблона), советую отписаться на офф.форуме здесь http://xenforo.com/community/threads/template-management.5459/
     
  11. FractalizeR

    FractalizeR XenForo Addicted

    Регистрация:
    27.09.10
    Сообщения:
    1 085
    Симпатии:
    832
    Версия XF:
    1.3.2
    Угу. Он переопределяет класс контроллера и в переопределенном методе возвращает свой шаблон вместо thread_view. Если еще какой-нибудь аддон будет использовать тот же хук подобным способом, расширяя тот же контроллер, первый перестанет работать. Это не выход из положения, хотя как временное решение очень даже.
     
    CyberAP нравится это.
  12. FractalizeR

    FractalizeR XenForo Addicted

    Регистрация:
    27.09.10
    Сообщения:
    1 085
    Симпатии:
    832
    Версия XF:
    1.3.2
    Я тоже кое что предложил
     
    CyberAP нравится это.
  13. Yoskaldyr

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

    Регистрация:
    27.09.10
    Сообщения:
    1 921
    Симпатии:
    1 163
    Версия XF:
    1.0.4
    Очень неплохой вариант, но все-таки как мне кажется поиск/замена + поиск/замена по регулярным выражениям (для сложных случаев замены) будет более универсальным решением.
    --- добавлено : 18 окт 2010 в 12:33 ---
    Может вынесем весь оффтоп связанный с ТМС в отдельную тему?
     
  14. FractalizeR

    FractalizeR XenForo Addicted

    Регистрация:
    27.09.10
    Сообщения:
    1 085
    Симпатии:
    832
    Версия XF:
    1.3.2
    Ну, вообще before_template_compilation хук, который я предложил, совмещает в себе эти два подхода. А само предложение этим не ограничивается.
     
  15. Yoskaldyr

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

    Регистрация:
    27.09.10
    Сообщения:
    1 921
    Симпатии:
    1 163
    Версия XF:
    1.0.4
    Это хук. А речь идет об интерфейсе для разработчиков, т.е. не добавление каждым продуктом доп кода, который будет выполняться перед компиляцией (да, там можно сделать поиск и замену и еще что угодно), а об интерфейсе, аналогичном редактированию шаблонов. Хотя хук тоже не помешает, но вот если будет и хук, отлавливать и дебажить непонятные изменения шаблонов будет явно труднее - это не просто Test Template Modifications из TMS.
     
    FractalizeR нравится это.
  16. megavolt

    megavolt Местный

    Регистрация:
    31.10.10
    Сообщения:
    80
    Симпатии:
    49
    А какие параметры в этом примере должны быть у $postFetchOptions , чтоб получать последние темы из определенного раздела?
     
  17. FractalizeR

    FractalizeR XenForo Addicted

    Регистрация:
    27.09.10
    Сообщения:
    1 085
    Симпатии:
    832
    Версия XF:
    1.3.2
    Это не Options, а Conditions фактически. Смотрите исходный текст методов prepareThreadFetchOptions() и prepareThreadConditions() в файле library\XenForo\Model\Thread.php. Там все понятно, в принципе.

    Т.е. это параметр $conditions['forum_id'].
     
    megavolt нравится это.
  18. megavolt

    megavolt Местный

    Регистрация:
    31.10.10
    Сообщения:
    80
    Симпатии:
    49
    Миллион лайков :D
     
  19. CyberAP

    CyberAP Местный

    Регистрация:
    05.10.10
    Сообщения:
    2 604
    Симпатии:
    1 660
    Версия XF:
    1.5.10
    Есть ли способ подправить этот аддон чтобы он выводил список самого популярного контента за сегодняшний день? Счётчик чтобы считал по количеству просмотров за сегодняшний день и лайков первого поста.
     
  20. FractalizeR

    FractalizeR XenForo Addicted

    Регистрация:
    27.09.10
    Сообщения:
    1 085
    Симпатии:
    832
    Версия XF:
    1.3.2
    PHP:
    $conditions['last_post_date'] = array(">"time() - 1*24*60*60);
    Счетчик - поля first_post_likes, view_count

    И не ленимся в код-то смотреть :) Не ленимся... :)
     

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