18 Окт 2010

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

Category: XenForoFractalizeR @ 00:53

Добрый день.

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

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

Пройдясь поиском по шаблонам, можно убедиться, что нам нужен шаблон forum_list. Еще раз поискав по исходным текстам XenForo строку forum_list, мы приходим к выводу, что этот шаблон отрисовывает контроллер XenForo_ControllerPublic_Index. Чтобы отобразился наш список, нам нужно будет отредактировать шаблон forum_list, вставив туда нужную нам информацию и передать дополнительные параметры в этот шаблон. Привожу текст, который нужно вставить в шаблон forum_list перед завершающим его тегом </xen:sidebar>:

HTML:
<div>
    <div id="xrf_lastpostsonhome">
        <h3>Последние темы</h3>
        <div>
            <xen:foreach loop="$xfr_lastthreadsonhome" value="$xfr_thread">
                <dl><dt><a href="{xen:link "threads/unread", $xfr_thread}" title="{$xfr_thread.title}">{xen:helper wordTrim, $xfr_thread.title, 30}</a></dt>
                    <dd><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.

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

Метки: , , ,

Ответить

Для отправки комментария вам нужно зарегистрироваться. Войти.