Интеграция форума Vanilla
// PHP

Если перед вами стоит задача подключения форума к готовой системе, то советую вам обратить внимание на Vanilla Forum. А дальше — скучноватый пошаговый мануал =\
Для начала нам потребуется скачать последнюю версию форума с официального сайта, а поскольку я тут успел наступить на одни грабли — то качаем последнюю бету — vanilla-core-2.0.18b2.
Встраиваем
По умолчанию, Vanilla форум имеет прекрасную возможность — встраиваться в любую HTML страничку посредством JavaScript’a, для этого нам понадобится активировать плагин <Embed> Vanilla (идет в стандартной поставке) и получить код скрипта:
<script type="text/javascript" src="http://forum.your-domain.com/plugins/embedvanilla/remote.js"></script>
Так же советую использовать дефолтную тему «Embed-Friendly» для встроенного форума — она достаточно простая и удобная для кастомизации.
Единственная проблема которая у меня возникла при подобном подключении форума — это ошибки JavaScript’a — разработчики форума не в курсе о методе jQuery().delegate() и используют jQuery('a').live('click'), чем вызывают не очень адекватное поведение ссылок на странице без атрибута href.
Интеграция с использованием ProxyConnect
Как понятно из подзаголовка, нам потребуется скачать плагин Vanilla ProxyConnect. Устанавливаем и идем настраивать (Users > Authentication):
Тут всё просто, по пунктам (пути в примере полные, могут быть относительные):
- Ваш сайт
- Страничка для получения данных о вашем пользователе (о ней чуть далее)
- Страница регистрации
- Страница входа
- Страница выхода
Теперь займемся пунктом 2 — Authenticate URL. Это страничка, где у вас должны выводиться данные вашего текущего пользователя в простом формате:
UniqueID=1279 Name=Bob Email=bob@gmail.com TransientKey=qwerty DateOfBirth=1970-01-01 Gender=Male Roles=Member,Admin
- UniqueID — обязательное поле, UID пользователя в вашей системе
- Name — обязательное поле, username, или как он у вас обзывается
- Email — обязательное поле, email вашего пользователя
- TransientKey — ключ, для предотвращения CSRF атак (вам скорей всего не понадобится, для wordpress обязательно)
- DateOfBirth — дата рождения
- Gender — мальчик/девочка, Male/Female
- Roles — роли пользователя на Vanilla форуме, через запятую, можно IDшниками
Если у вас Zend Framework, то action будет выглядеть как-то так:
// disable View
$this->_helper->layout()->disableLayout();
$this->_helper->viewRenderer->setNoRender(true);
// get current User
$user = Zend_Auth::getInstance()->getIdentity();
if ($user) {
echo "UniqueID={$user->id}\n"
. "Name={$user->username}\n"
. "Email={$user->email}\n"
. "Roles={$user->role}\n";
} else {
echo "UniqueID=\n"
. "Name=\n"
. "Email=\n";
}
Как это работает — когда пользователь заходит на форум, то Vanilla незаметно так стучится на нашу страничку с текущей сессией пользователя, и пытается получить о нем информацию. Если это удалось, то движок пытается найти соответсвующую запись у себя в БД — если нашел, то мы авторизированы, если не нашел соответсвия — регистриует нового пользователя с указанными данными и так же авторизирует. Если наша страничка не вернула данных о пользователе, то он либо будет послан на страницу Sign In указанную в настройках ProxyConnect, либо отобразит страницу авторизации форума (зависит, от того, что разрешено пользователю guest).
Из замеченного: для разлогинивания на форуме следует чистить куки:
// vanilla forum logout
setcookie('Vanilla', ' ', time() - 3600, '/', '.domain.com');
unset($_COOKIE['Vanilla']);
Если пользователь авторизирован в вашей системе, а при входе на форум требуется логинится (банально клацнуть на кнопку, для запуска процесса авторизации), то это тоже поправимо — следует в вашем методе логина добавить следующую очистку куков (я их еще и в логаут добавил, так на всяк случай):
setcookie("Vanilla", "deleted", time() - 1,'/', ".domain.com", false);
setcookie("Vanilla-Volatile", "deleted", time() - 1, '/', ".domain.com", false);
Официальная документация по ProxyConnect
Портирование с phpBB, vBulletin и т.д.
На случай если вы решили сменить движок форума, то это тоже предусмотрено ;) Качаем Vanilla Porter и заливаем его в корень вашего текущего форума (phpBB или что там у вас). Далее следуем простой инструкции по переносу данных:
- Экспорт форума в TXT файл хитрого формата
- Импорт этого самого файла
Как просто-то :) Ну для наглядности приведу еще скриншот самой тулзы:

Но без нюансов тоже не обошлось — первое с чем столкнулся это непонимание формата файла в архиве, пришлось распаковывать и заливать. Второе — во время импорта все текущие пользователи Vanilla будут удалены, включая вашу учетную запись, так что в определенный момент вам надо будет указать email нового админа из портированных данных, после чего вы получите ошибку авторизации, без паники, логинимся заново под новым админом и продолжаем импорт данных (будет такая кнопочка). Следующий шаг — вам потребуется назначить права для всех ролей пользователей, которые были перенесены со старого движка. И напоследок, когда пользователи со старой системы попробуют зайти на новый форум им высветится следующий диалог (это верно для Vanilla + ProxyConnect):
Подготовьте пользователей к правильным действиям заранее.
Еще такой момент, умные дядьки часто изменяют алгоритм хэшированя паролей, на этот случай прийдется выполнить следующие действия:
- Заменить имя метода хэширования на некоторый произвольный
- Добавить его поддержку в файле
vanilla/library/core/class.passwordhash.php
С первым всё совсем просто:
UPDATE GDN_User SET HashMethod = 'myHash' WHERE HashMethod = 'phpBB';
Второй пункт тоже не сложен — нам потребуется найти switch в методе CheckPassword() и добавить туда новый case:
switch(strtolower($Method)) {
/* ... */
case 'myhash':
$Result = myMegaHashFunction($Password, $StoredHash);
break;
/* ... */
}
Документация по Vanilla Porter
Вместо вывода
Форум действительно стоит того, чтобы его установить и опробовать: много локализаций (включая русский и арабский) и полезных плагинов; простые для адаптации темы (хоть и Smarty используется); и таки удобная система интеграции.

