Антон Шевчук // Web-разработчик

Интеграция форума 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):

Тут всё просто, по пунктам (пути в примере полные, могут быть относительные):

  1. Ваш сайт
  2. Страничка для получения данных о вашем пользователе (о ней чуть далее)
  3. Страница регистрации
  4. Страница входа
  5. Страница выхода

Теперь займемся пунктом 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 или что там у вас). Далее следуем простой инструкции по переносу данных:

  1. Экспорт форума в TXT файл хитрого формата
  2. Импорт этого самого файла

Как просто-то :) Ну для наглядности приведу еще скриншот самой тулзы:

Но без нюансов тоже не обошлось — первое с чем столкнулся это непонимание формата файла в архиве, пришлось распаковывать и заливать. Второе — во время импорта все текущие пользователи Vanilla будут удалены, включая вашу учетную запись, так что в определенный момент вам надо будет указать email нового админа из портированных данных, после чего вы получите ошибку авторизации, без паники, логинимся заново под новым админом и продолжаем импорт данных (будет такая кнопочка). Следующий шаг — вам потребуется назначить права для всех ролей пользователей, которые были перенесены со старого движка. И напоследок, когда пользователи со старой системы попробуют зайти на новый форум им высветится следующий диалог (это верно для Vanilla + ProxyConnect):

Подготовьте пользователей к правильным действиям заранее.

Еще такой момент, умные дядьки часто изменяют алгоритм хэшированя паролей, на этот случай прийдется выполнить следующие действия:

  1. Заменить имя метода хэширования на некоторый произвольный
  2. Добавить его поддержку в файле 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 используется); и таки удобная система интеграции.

© Антон Шевчук 2007-2016