Добрый день.
В этой статье я постараюсь вкратце описать архитектуру нового форумного движка XenForo, нового конкурента VBulletin и IPB, насколько смогу после пары часов знакомства с исходным кодом.
О XenForo, разработанном бывшими авторами VBulletin3 Сайрусом и Майком, я уже рассказывал.
Размеры
Основная часть кода XenForo занимает 3,24 МБ (3 405 312 байт).
Еще 8,31 МБ (8 724 429 байт) занимает Zend Framework, который поставляется с кодом XenForo.
MVC
XenForo полностью основан на архитектуре MVC. Существуют отдельные классы для моделей, представлений и контроллеров.Корневой файл index.php имеет размер 467 байт и заканчивается так, как и должно быть в таких случаях.
Конечно, используется автозагрузчик классов.$fc = new XenForo_FrontController(new XenForo_Dependencies_Public()); $fc->run();
Система именования классов как в ZF. Сам MVC в настоящее время использует внутри себя классы Zend, но тот факт, что XenForo_Controller не наследуется от соответствующих классов ZF, говорит о том, что эта часть будет переписана.
Все контроллеры наследуются примерно одинаково: класс XenForo_ControllerPublic_Forum расширяет XenForo_ControllerPublic_Abstract. После Symfony с ее действиями такой подход несколько непривычен, но к нему быстро привыкаешь.
Система маршрутизации спроектирована с возможностью расширения.
Расширение происходит посредством привязки префиксов URL-адресов к классам-обработчикам.
SEO из коробки, конечно.
Никаких плагинов не требуется.
Модель контента
Архитектура XenForo разрабатывалась долго :) Во всяком случае, впервые в движке форума я столкнулся с более-менее понятной архитектурой контента, слегка напоминающей Drupal («Все — узел», помните?).На данный момент в XenForo есть четыре типа контента: категория, раздел форума, страница и ссылка (обычное перенаправление).
Каждый из них также называется Node. Более того, каждый экземпляр узла может быть предком/потомком экземпляра другого типа.
Пока не знаю, как будет отображаться эта гремучая смесь, например со страницы и ее дочернего раздела форума, не пробовал :).
Более того, некоторые типы контента можно немного расширить прямо из коробки.
Так, например, для страницы помимо ее HTML-содержимого можно указать PHP-обработчик, который будет получать дополнительные данные из базы данных, изменять дизайн страницы, вставлять в нее информацию или даже выдавать ошибку при пользователь.
Обработчики PHP везде обозначаются не PHP-кодом, как можно было бы ожидать, а именами классов и методов.
При активации хука класс будет загружен автозагрузчиком (соответственно, он должен правильно располагаться в файловой системе).
Типы контента по-прежнему строго определены; вы не сможете добавить их самостоятельно.
Даже их имена в админке почему-то не локализованы.
Использование сторонних библиотек
XenForo использует Сабля и Zend Framework. Более того, наличие в коде таких мест, как
.
/*require_once('Zend/Loader/Autoloader.php');
$autoloader = Zend_Loader_Autoloader::getInstance();
$autoloader->pushAutoloader(array($this, 'autoload'));*/
spl_autoload_register(array($this, 'autoload'));
скорее всего, это означает, что они продолжат избавляться от ненужных зависимостей на протяжении всей разработки, заменяя их чем-то более легким и специализированным.
Используются очень мало классов ZF. К ним относятся Zend_Registry (как реестр для одноэлементных объектов, таких как экземпляр XenForo_Db), Zend_Config, Zend_Cache (кэширует множество вещей, в частности используемых в базовом классе моделей XenForo_Model), Zend_Service_ReCaptcha, Zend_Http_Client, Zend_Mail, Zend_Validate и некоторые другие.
.
Для работы с базой данных используется часть пакета Zend_DB (Zend_Db_Adapater_Abstract и Ко), завернутая в класс XenForo_DB, что еще раз говорит о том, что эта часть также будет переписана позже.
Здесь не используется построитель запросов, они как обычно встроены прямо в код (что, конечно, несколько затруднит поддержку нескольких баз данных.
Но с другой стороны, запросы концентрируются внутри модели, так что.
)
Аддонная архитектура
Для расширения форума есть несколько событий, к которым можно прикрепить обработчики.Обработчики указываются, как уже говорилось, через имя класса и метода, что позволяет использовать ускорители типа APC для кэширования аддонов.
Список обработчиков вместе с основной информацией о плагине помещается в файл *.
xml. Не обязательно писать его от руки.
Достаточно активировать режим отладки на форуме и в админке появятся дополнительные возможности.
PHP-файлы аддона, естественно, предварительно нужно будет распаковать в соответствующую папку.
Классы XenForo находятся в /library/XenForo, поэтому ваши классы будут в /library/VasyaCorp. Меня это порадовало, так как довольно часто я ловил себя на поиске остатков плагина в файловой системе при его удалении из VBulletin. Поскольку практически каждый аддон должен иметь настройки, их можно создать прямо в админке и экспортировать в *.
xml плагина вместе с информацией о хуках.
Они находятся там же, где и настройки самого XenForo. Вы можете встроить их в произвольные места в разделе общих настроек XenForo. Все устроено примерно так же, как было в VBulletin. Очень удобно и практически не нужно писать код для их поддержки.
Меня немного удивило количество крючков.
Наверное, все помнят ошеломляющее количество хуков в VBulletin, которые даже в голове не удержать? В XenForo всего.
17 хуков! Такое количество объясняется их назначением.
Вот их имена:
- контейнер_admin_params
- контейнер_public_params
- контроллер_pre_dispatch
- front_controller_post_view
- front_controller_pre_dispatch
- front_controller_pre_route
- front_controller_pre_view
- инициализирующие_зависимости
- load_class_bb_code
- load_class_controller
- load_class_datawriter
- load_class_model
- load_class_route_prefix
- load_class_search_data
- load_class_view
- Navigation_tabs
- посетитель_setup
public static function resolveDynamicClass($class, $type, $fakeBase = false)
{
if (!XenForo_Application::autoload($class))
{
if ($fakeBase)
{
$fakeNeeded = true;
}
else
{
return false;
}
}
else
{
$fakeNeeded = false;
}
if (!empty(self::$_classCache[$class]))
{
return self::$_classCache[$class];
}
$createClass = $class;
$extend = array();
XenForo_CodeEvent::fire('load_class_' .
$type, array($class, &$extend));
if ($fakeNeeded)
{
if (!$extend)
{
return false;
}
eval('class ' .
$class .
' extends ' .
$fakeBase .
' {}');
}
if ($extend)
{
try
{
foreach ($extend AS $dynamicClass)
{
// XenForo Class Proxy, in case you're wondering
$proxyClass = 'XFCP_' .
$dynamicClass;
eval('class ' .
$proxyClass .
' extends ' .
$createClass .
' {}');
XenForo_Application::autoload($dynamicClass);
$createClass = $dynamicClass;
}
}
catch (Exception $e)
{
self::$_classCache[$class] = $class;
throw $e;
}
}
self::$_classCache[$class] = $createClass;
return $createClass;
}
И несколько неожиданно для меня показано использование хука visitor_setup для изменения чего-либо на странице.
здесь .
Практически через любой крючок можно проникнуть в самое сердце системы и заняться бизнесом.
В целом небольшое количество крючков, похоже, вполне компенсируется их мощностью.
Система шаблонов
Как и все современные форумы, XenForo имеет ТОННУ шаблонов.Синтаксис довольно мощный (см.
выдержки ниже), однако это никого не удивит. Специальные теги пишутся как в PHPTAL («XML/HTML с пространством имен»).
Один шаблон может содержать несколько файлов.
Например, шаблон forum_list содержит forum_list, node_list (он вставляется в forum_list), node_list.css,sidebar.css,sidebar_online_users. CSS в шаблоне подключается через xen:require, что позволяет кэшировать все CSS-файлы по вашему желанию.
<xen:require css="node_list.css" />
<xen:if hascontent="истинный">
<fieldset>
<ol class="nodeList sectionMain" id="forums">
<xen:contentcheck>
<xen:foreach loop="$renderedNodes" value="$node">{xen:raw $node}</xen:foreach>
</xen:contentcheck>
</ol>
</fieldset>
</xen:if>
-------------------------------------
<xen:edithint template="node_link.css" />
-------------------------------------
<xen:contentcheck>
<xen:foreach loop="$onlineUsers.records" value="$user">
<xen:if is="{$user.is_moderator} OR {$user.is_admin}">
<li>
<xen:avatar user="$user" size="s" img="true" />
<a href="{xen:link members, $user}" class="username">{xen:helper richUserName, $user}</a>
<div class="muted">{xen:helper userTitle, $user}</div>
</li>
</xen:if>
</xen:foreach>
</xen:contentcheck>
Обратите внимание на использование помощников в шаблонах.
Помощник, как и в Symfony, — это просто метод класса.
Например, вот вспомогательный код helperUserLink:
public static function helperUserLink(array $user)
{
return '<a href="'
.
XenForo_Link::buildPublicLink('members', $user) .
'" class="username">' .
htmlspecialchars($user['username']) .
'</a>';
}
Поисковый движок
Поисковая система в XenForo реализована как отдельный класс (в отличие от ненавистной мне реализации в VB, в котором, по моему мнению, сами разработчики уже давно запутались, просто не признаются в этом), унаследованный от XenForo_Search_SourceHandler_Abstract. На данный момент существует только одна реализация — MySqlFt.php (класс XenForo_Search_SourceHandler_MySqlFt расширяет XenForo_Search_SourceHandler_Abstract), но в ближайшее время должен появиться Sphinx. Сейчас это модно :) Форумы уже не те, что были раньше.Они растут как на дрожжах.
В админ-панели пока нет возможности активировать другую поисковую систему, но нельзя забывать, что это все еще бета-версия.
Система локализации
Система локализации практически полностью повторяет аналог из VBulletin, за исключением того, что групп фраз вообще нет. Вот начало файла английской фразы: <Эxml version="1.0" encoding="utf-8"?>
<phrases>
<phrase title="1_more_message" global_cache="0" version_id="1000017" version_string="1.0.0 Alpha 7"><![CDATA[1 more message]]></phrase>
<phrase title="о" global_cache="0" version_id="1000015" version_string="1.0.0 Alpha 5"><![CDATA[About]]></phrase>
Каждый аддон может иметь свои фразы.
Языки можно экспортировать.
Переводить аддоны можно прямо в админ-панели.
Кстати, русская локализация XenForo. почти готов .
Система стилей
Я не дизайнер и вообще имею плохой вкус.Меня пугает все, что касается дизайна и его развития.
Но в XenForo мы видим систему древовидных стилей, аналогичную VB, в которой мы можем взять стиль за основу и изменить некоторые его настройки или шаблоны.
Только Кир и Майк реализовали самый крутой CSS-редактор, который я когда-либо видел в своей жизни.
Dreamweaver отдыхает :).
В XenForo все настраивается и настраивается достаточно наглядно.
Забудьте о непосредственном редактировании CSS, о листе с двумя тысячами переменных, который какой-то засранец-плохиш реализовал на VB. Здесь все очень грамотно сгруппировано, так что 99% разделов умещаются на одном экране.
Если вы не такой любитель дизайна, как я, и у вас есть художественный вкус, вы, вероятно, можете уволить своего дизайнера, поскольку вы можете создать стиль самостоятельно (через пару месяцев, когда вам надоест играть с редактором).
Система аутентификации
У вас есть база данных, скажем, WordPress? Импортируйте пользователей из WP в базу данных XenForo, сохраняя их пароли! Чтобы в дальнейшем все работало, вам просто нужно расширить класс XenForo_Authentication_Abstract, чтобы сообщить XenForo, как проверять пароль.Таблица xf_user_authenticate связывает данные пользователя с вашими системами аутентификации.
Услуги связи
Форумы уже довольно давно позволяют указывать свои контакты в различных системах связи, таких как ICQ. XenForo имеет легко расширяемую систему контактных служб.Услуги можно добавить в панели управления.
Класс сервисной поддержки выглядит примерно так:
<Эphp
class XenForo_Model_IdentityService_Icq extends XenForo_Model_IdentityService_Abstract
{
protected function _getIdentityServiceId()
{
return 'icq';
}
static public function verifyAccountName(&$accountName, &$error)
{
if (!preg_match('/^\d+$/', $accountName))
{
$error = new XenForo_Phrase('please_enter_valid_icq_uin_using_numeric_characters_only');
return false;
}
return true;
}
}
Теперь никто не сможет ввести строку «Продажа шерстяных носков» в поле ICQ своего профиля :)
Система прав и привилегий
Каждая группа пользователей системы имеет права по умолчанию.Плюс права каждой группы можно дополнительно настроить на любом типе узла.
Конечно, привилегии передаются по наследству.
Существует четыре типа разрешений.
Наследовать, разрешить, отменить, запретить.
Пока мне не удалось понять, чем Revoke отличается от Deny. Более того, Revoke не входит в группу прав по умолчанию, что говорит о том, что этот тип связан с наследованием прав.
После перевода форума в режим отладки вы сможете добавлять в систему новые типы привилегий (их могут добавлять и аддоны).
В коде они проверяются примерно так:
$users[$userId]['canCleanSpam'] = (XenForo_Permission::hasPermission($visitor['permissions'], 'general', 'cleanSpam') && $this->getModelFromCache('XenForo_Model_User')->couldBeSpammer($users[$userId]));
Общие впечатления
В целом код XenForo произвел на меня хорошее впечатление.Красиво, понятно, гармонично, полно комментариев и ООП.
Поначалу, глядя на количество занятий, я собирался испугаться и отложить статью до лучших времён, но сейчас, приближаясь к концу, могу сказать, что почти всё ок, я немного понимаю, как всё работает. здесь.
Я надеюсь, что и ты тоже, хоть немного.
Кстати, я очень ждал выхода PHPBB3, хотел отнестись к этому серьезно.
Но мне его архитектура кажется гораздо менее понятной и логичной, чем у XenForo. Честно говоря, до PHPBB3 я так и не добрался.
Подождем четверку на Symfony2. Пожалуй, это все.
Вопросы по плагинам для XenForo можно задать здесь .
И дальше официальный форум Их уже несколько (на данный момент 18), вы можете скачать и просмотреть.
Сам я лицензию на движок пока не покупал, не было повода.
Поэтому я благодарю своих друзей, которые уже приобрели официальную версию за предоставленный для изучения код. Прошу прощения, если кому-то эта статья покажется неполной или неправильно структурированной.
Это мой первый обзор архитектуры чего-либо, поэтому с радостью приму любую критику в комментариях.
Думаю, часть критики я сразу увижу в своей карме и рейтинге :) Если вам интересно узнать что-то еще, дайте знать в комментариях; если разберусь быстро, то дополню статью.
Теги: #xenforo #vbulletin #форум #CMS
-
Как Снимаются Видео Нло
19 Oct, 24 -
Cephfs Против Glusterfs
19 Oct, 24 -
Первый Ноутбук С Chrome Os — Google Cr-48
19 Oct, 24 -
Переведите Меня На Visa
19 Oct, 24 -
Flickr.com Увеличивает Пространство
19 Oct, 24