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


Если перед вами стоит задача подключения форума к готовой системе, то советую вам обратить внимание на Vanilla Forum. А дальше — скучноватый пошаговый мануал =\

Для начала нам потребуется скачать последнюю версию форума с официального сайта, а поскольку я тут успел наступить на одни грабли — то качаем последнюю бету — vanilla-core-2.0.18b2.

Встраиваем

По умолчанию, Vanilla форум имеет прекрасную возможность — встраиваться в любую HTML страничку посредством JavaScript’a, для этого нам понадобится активировать плагин <Embed> Vanilla (идет в стандартной поставке) и получить код скрипта:

&amp;amp;lt;script type=&amp;amp;quot;text/javascript&amp;amp;quot; src=&amp;amp;quot;http://forum.your-domain.com/plugins/embedvanilla/remote.js&amp;amp;quot;&amp;amp;gt;&amp;amp;lt;/script&amp;amp;gt;

Так же советую использовать дефолтную тему «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-&amp;amp;gt;_helper-&amp;amp;gt;layout()-&amp;amp;gt;disableLayout();
$this-&amp;amp;gt;_helper-&amp;amp;gt;viewRenderer-&amp;amp;gt;setNoRender(true);

// get current User
$user = Zend_Auth::getInstance()-&amp;amp;gt;getIdentity();
if ($user) {
echo &amp;amp;quot;UniqueID={$user-&amp;amp;gt;id}\n&amp;amp;quot;
     . &amp;amp;quot;Name={$user-&amp;amp;gt;username}\n&amp;amp;quot;
     . &amp;amp;quot;Email={$user-&amp;amp;gt;email}\n&amp;amp;quot;
     . &amp;amp;quot;Roles={$user-&amp;amp;gt;role}\n&amp;amp;quot;;
} else {
echo &amp;amp;quot;UniqueID=\n&amp;amp;quot;
     . &amp;amp;quot;Name=\n&amp;amp;quot;
     . &amp;amp;quot;Email=\n&amp;amp;quot;;
}

Как это работает — когда пользователь заходит на форум, то Vanilla незаметно так стучится на нашу страничку с текущей сессией пользователя, и пытается получить о нем информацию. Если это удалось, то движок пытается найти соответсвующую запись у себя в БД — если нашел, то мы авторизированы, если не нашел соответсвия — регистриует нового пользователя с указанными данными и так же авторизирует. Если наша страничка не вернула данных о пользователе, то он либо будет послан на страницу Sign In указанную в настройках ProxyConnect, либо отобразит страницу авторизации форума (зависит, от того, что разрешено пользователю guest).

Из замеченного: для разлогинивания на форуме следует чистить куки:

// vanilla forum logout
setcookie('Vanilla', ' ', time() - 3600, '/', '.domain.com');
unset($_COOKIE['Vanilla']);

Если пользователь авторизирован в вашей системе, а при входе на форум требуется логинится (банально клацнуть на кнопку, для запуска процесса авторизации), то это тоже поправимо — следует в вашем методе логина добавить следующую очистку куков (я их еще и в логаут добавил, так на всяк случай):

setcookie(&amp;amp;quot;Vanilla&amp;amp;quot;, &amp;amp;quot;deleted&amp;amp;quot;, time() - 1,'/', &amp;amp;quot;.domain.com&amp;amp;quot;, false);
setcookie(&amp;amp;quot;Vanilla-Volatile&amp;amp;quot;, &amp;amp;quot;deleted&amp;amp;quot;, time() - 1, '/', &amp;amp;quot;.domain.com&amp;amp;quot;, 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 используется); и таки удобная система интеграции.

6 thoughts on “Интеграция форума Vanilla”

  1. Эх, не дали мне в свое время его интегрировать… А так очень симпатичный форум.

  2. Спасибо, Антон! Пригодилось. Вот только, если юзер не залогинен – нужно показывать blank page, иначе будет создан юзер с пустым именем и айдишником.

  3. Есть еще неприятность, надеюсь кому-то пригодится.
    После включения активации через прокси коннект – вы больше не сможете выйти\войти тем админом, который был создан при установке форума. Т.е. как только вы потеряете куку этого юзверя – вы потеряете доступ в консоль. При авторизации через сайт с таким же именем плагин спросил о привязке аккаунта, но выбросил ошибку, хотя email и пароль были верными.
    Вернуть доступ в админку просто – нужно новому юзверю сделать Roles=Administrator
    К старому аккаунту, увы, доступа больше нет.

  4. думаю какой форум ставит на блог ВП. Ванилия нормально интегрируется с ВП? Подхватывает его пользователей?

    а что вы можете сказать про SMF форум?

  5. здравствуйте! Интерисует вопрос? Как поменять ссылку логотипа на внешнюю? Блогадорю заранее!!!

  6. Спасибо за информацию, теперь попробую объединить Vanilla с WordPress

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.