Блого-социальная сеть на основе XenForo

в 15:33, , рубрики: cms, web 2.0, xenforo, Zend Framework, блоги, движок, социальные сети, стартап, форум, хабрахабр, метки: , , , , , , ,

В этой статье я постараюсь вкратце рассказать о построении аналога Livestreet на основе XenForo. Вся блого-социальная сеть представляет собой плагин для XenForo под названием Social. Обзор архитектуры движка и основы плагинописания описаны в статьях FractalizeR.

Проанализировав архитектуру XenForo, мы поняли, что принципиальных отличий форума от блогов не так уж и много. Действительно, первое сообщение темы легко превращается в статью, а остальные сообщения — в комментарии. Определенные разделы форума можно превратить в блоги.

Перечислю основные преимущества данного решения.

  • Встроенный форум.
  • Готовая система ббкодов и обработки сообщений.
  • Превращения статьи в темы, а темы в статьи путем переноса в нужный раздел.
  • Код плагина получился очень компактный.

Конечно, у такого подхода есть и недостатки.

  • Для правильного разделения функционала пришлось изучить движок от и до.
  • Меньше свободы действий, поскольку статьи расширяют темы.

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

Блоги

Сделаем настройку socialBlogRoot, определяющую родительский узел для всех блогов. Т.е. все дочерние форумы узла socialBlogRoot должны превращаться в блоги, а темы этих форумов — в статьи. Добавим поле parent_post_id к таблице xf_post для древовидных комментариев.

Контроллер

Расширяем классы XenForo_ControllerPublic_Thread и XenForo_ControllerPublic_Forum. Если текущий форум является дочерним от socialBlogRoot, делаем запись в реестр:
XenForo_Application::set('blogView', 1);
Теперь в любом месте скрипта мы знаем, что находимся внутри блога.

Вид

Расширяем класс XenForo_ViewPublic_Thread_View:

class Social_ViewPublic_Thread_View extends XFCP_Social_ViewPublic_Thread_View
{
   public function renderHtml()
   {
      parent::renderHtml();
                
      // Если тема является статьей, делаем древовидные комментарии
      if (XenForo_Application::isRegistered('blogView')) 
      {
         $firstPostId = $this->_params['firstPost']['post_id'];
	 $this->_params['firstPost'] = $this->_params['posts'][$firstPostId];
         // Оставляем все посты, кроме первого
	 unset($this->_params['posts'][$firstPostId]);
         // Строим дерево комментариев
	 $commentTree = Social_ViewPublic_Helper_Comment::buildCommentTree($this->_params['posts']);
	 $this->_params['commentsTemplate'] = Social_ViewPublic_Helper_Comment::createCommentsTemplateObject($this, $commentTree);
         // В шаблон подается первый пост и рендеренное дерево комментрариев
	 $this->_params['posts'] = array($this->_params['firstPost']['post_id'] => $this->_params['firstPost']);
       }
   }
}

Шаблон

В качестве параметров шаблона переданы первый пост и рендеренное дерево комментариев. Остается лишь вставить это дерево в конец первого поста, используя template hook под названием ad_message_below в щаблоне message.

Модуль комментариев на основе тем

Оказывается, темы можно использовать как универсальный способ коментирования любого контента. Покажем это на примере фотоальбомов. Из коробки фотографии можно загружать как вложения к сообщениям, а просматривать с помощью встроенного лайтбокса.

Опять же создадим настройку socialAlbumRoot для корня всех альбомов. Для блогов мы сделали древовидные комментарии. Теперь же сообщение может относиться не только к другому сообщению, но и к вложению. Для этого вместо добавления одного поля parent_post_id к таблице xf_post, добавим два поля target_id и target_type. Последнее указывает на тип контента, к которому относится сообщение (post или attachment).

Все альбомы одного пользователя теперь можно уместить в одну древовидную тему следующим образом:

  • Album (post: target_id=0, target_type=post, post_id=200 )
    • Photo (attachment: target_id=200, target_type=post, attachment_id = 1000)
      • Comment (post: target_id=1000, target_type=attachment, post_id=201 )
      • Comment (post: target_id=1000, target_type=attachment, post_id=202 )
      • Comment (post: target_id=1000, target_type=attachment, post_id=203 )
    • Photo (attachment: target_id=200, target_type=post, attachment_id = 1001)
      • Comment (post: target_id=1001, target_type=attachment, post_id=204 )
      • Comment (post: target_id=1001, target_type=attachment, post_id=205 )
      • Comment (post: target_id=1001, target_type=attachment, post_id=206 )

  • Album (post: target_id=0, target_type=post, post_id=201 )
    • Photo (attachment: target_id=201, target_type=post, attachment_id = 1002)
      • Comment (post: target_id=1002, target_type=attachment, post_id=207 )
      • Comment (post: target_id=1002, target_type=attachment, post_id=208 )
      • Comment (post: target_id=1002, target_type=attachment, post_id=209 )
    • Photo (attachment: target_id=201, target_type=post, attachment_id = 1003)
      • Comment (post: target_id=1003, target_type=attachment, post_id=210 )
      • Comment (post: target_id=1003, target_type=attachment, post_id=211 )
      • Comment (post: target_id=1003, target_type=attachment, post_id=212 )

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

Новости (главная)

Новостная лента имеет собственный контроллер, вид и шаблон. Каждая новость представляет собой обработанное первое сообщение какой-либо темы. Обработка заключается в автоматической обрезке, а также в ограничении числа вложенных картинок и видео. Новость появляется на главной, если первое сообщение темы собирает больше заданного количества лайков. Благодаря такому подходу новостью может быть статья, фотоальбом, опрос или простое обсуждение.

Заключение

XenForo показался нам одним из самых продуманных и технологичных скриптов не только среди форумных движков, но и среди CMS. Теперь я убежден, что на основе XenForo можно сделать как крупный портал, так и социальную сеть.

Проект развивается. Основная часть блогов готова. В планах фотоальбомы, CMS, интернет-магазин, вики, афиша. Если кому-то интересно поучаствовать — пишите. Если интересно посмотреть демо, добавлю ссылку.

Автор: guiltar

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js