Интеграция MODx и Phorum
Инструкция как интегрировать MODx и Phorum. В данном случае регистрация и авторизация будет осуществляться средставми MODx, поэтому в MODx требуется настроенная регистрация и авторизация (WebSignup и WebLogin или WebLoginPE).
Phorum
Для Phorum существует модуль external_authentification. Интеграция с внешними приложениями реализуется с помощью подмодулей, которые располагаются в каталоге plugins_bin. В нем уже есть подмодули для интеграции с Drupal, LDAP. На основе их и создадим подмодуль интеграции с MODx.
Для связвания пользователей MODx и Phorum у пользователя на форуме создается дополнительное поле phorum_mod_external_authentication_modx_modxuserid. Особенность заключается в том, что нам не нужно делать синхронизацию для уже существующих пользователей в MODx, пользователи на форуме будут создаваться автоматически при первом заходе. Для новых пользователей в MODx дополнительно можно написать плагин, который при создании пользователя будет создавать пользователя на форуме. Но можно обойтись и без него.
Код подмодуля можно скачать с Dropbox
Вкратце вся логика находится в файле hook_user_session_restore.php. При каждом посещении страницы форума проверяется авторизован ли пользователь в MODx. Если да, то ищется пользователь на форуме со значением phorum_mod_external_authentication_modx_modxuserid равным ID пользователю в MODx. Если такой пользователь не найден, то он создается. Так как этот же код можно использовать в дальнейшем и в плагине MODx, то я вынес его в отдельный файл assets/plugins/phorum/syncuser.php.
Для включения модуля заходим в администраторский раздел форума по адресу www.site.ru/phorum/admin.php. В модулях включаем external_authentication. В настройках указываем использовать для авторизации MODx, полный путь к MODx. Также опционально можно установить «Automatically transfer admin status» и «Administrator groups in MODx». Первый параметр указывает автоматически присваивать статус администратора на форуме если пользователь входит в одну из заданных групп в MODx во втором параметре.
Теперь уже можно проверить авторизацию. Авторизуемся на сайте и переходим на форум. Если сделано все правильно, то должны быть авторизованы на форуме.
В external_authentification есть также дополнительные поля запрета регистрции и авторизации на форуме. Но так как это реализуется через javascript, то решил их заблокировать в настройках, так как считаю что правильней убрать все лишнее в шаблоне форума, чем делать это через javascript.
MODx
Со стороны MODx можно сделать дополнительно: написать плагин создания пользователя на форуме при регистрации на сайте, встраивание форума в сайт.
Написание плагина
Для начала нам нужно указать в настройках путь, где установлен форум. Правильней наверное сделать модуль, в настройках которого указать использовать обшие параметры. Но так как никакого модуля не предполагается, то просто создадим файл assets/plugins/phorum/config.ini.php
<?php
global $phorum_path,$phorum_assets_id;
//Полный путь до Phorum
$phorum_path = $modx->config['base_path'].’phorum/’;
//Идентификатор ресурса контейнера для CSS, JS итд
$phorum_assets_id = 48;
?>
Этот файл настроек потом также будет использовать и в сниппете встраивания форума. $phorum_assets_id указывает идентификатор страницы для CSS и JS форума (об этом ниже).
Код плагина следующий:
global $modx;
$e =&$modx->event;
if ($e->name == ‘OnWebSaveUser’) {
include($modx->config['base_path'].’assets/plugins/phorum/config.inc.php’);
include($modx->config['base_path'].’assets/plugins/phorum/syncuser.php’);
$user_data = array( ‘id’=>$userid,
‘username’=>$username,
‘fullname’=>$userfullname,
‘password’=>$userpassword,
‘email’=>$useremail);
$curcwd = getcwd();
chdir($phorum_path);
syncuser($phorum_path,$user_data);
chdir($curcwd);
}
В системных событиях укажите OnWebSaveUser.
Встраивание в сайт
За основу взят пример расположенный в каталоге portable форума. Встраивание осуществляется через include. Сложность в том, что при таком встраивании должны менятся URL страниц форума.
А для этого нужно:
Присвоить $PHORUM[«CUSTOM_QUERY_STRING»] измененный URL, тогда phorum будет брать параметры оттуда, а не из URL.
Создать callback-функцию phorum_custom_get_url. Тогда phorum при каждой генерации URL будет ее вызывать.
Также нужно подключить CSS шаблона форума. Поэтому сниппет будет иметь 2 режима: вставка ссылок в заголовок и вывод содержимого. Так как мы переопределим функцию генерирования URL для форума, то будут изменены ссылки и на CSS. Для этого мы создадим специальную страницу у которой в качестве шаблона укажем «blank» и вставим вызов сниппета. Идентификатор данной страницы указывается в config.inc.php.
Для phorum существует специальный шаблон Generic Integration, который можно взять за основу. В файле integration_variables.php можно отключить/включить элементы шаблона (логотип, хлебные крошки итд). Также в шаблоне реализовано отключения заголовка html-страницы и добавление ссылок на CSS и JS при встраивании.
Итого исходный код сниппета:
<?php
//include($modx->config['base_path'].’assets/snippets/phorum/phorum.snippet.php’);
// create a namespace for Phorum
if (!function_exists(‘phorum_namespace’)) {
function phorum_namespace($page)
{
global $PHORUM; // globalize the $PHORUM array
include_once(“./$page.php”);
}
}
// мы изменим URL так, чтобы они ссылались на страницу MODx
if (!function_exists(‘phorum_custom_get_url’)) {
function phorum_custom_get_url ($page, $query_items, $suffix, $pathinfo)
{
global $modx,$phorum_assets_id;
//страницы, которым необходимо чтобы шаблон был пустой
$bypass_pages = array(‘css’,'js’,'feed’,'file’,'redirect’);
$PHORUM=$GLOBALS["PHORUM"];
$resid = in_array($page,$bypass_pages)?$phorum_assets_id:$modx->documentIdentifier;
$url = $modx->makeUrl($resid);
if ($pathinfo !== NULL) $url .= $pathinfo;
$url .= “?$page”;
if(count($query_items)) $url.=”,”.implode(“,”, $query_items);
if(!empty($suffix)) $url.=$suffix;
return $url;
}
}
global $modx;
$action = isset($action)?$action:’content’;
include($modx->config['base_path'].’assets/plugins/phorum/config.inc.php’);
$curcwd = getcwd();
$olderror = error_reporting(E_ALL & ~E_NOTICE & ~E_WARINIG);
chdir($phorum_path);
// we set $PHORUM["CUSTOM_QUERY_STRING"] so Phorum will parse it instead of
// the servers QUERY_STRING.
if (preg_match(“/^.*(&|&|\\?)([a-z]+),?(.*)?$/”,$_SERVER["QUERY_STRING"], $match)) {
$page=$match[2];
$GLOBALS["PHORUM_CUSTOM_QUERY_STRING"] = $match[3];
} else
$page=”index”;
include_once($phorum_path.’/common.php’);
switch($action) {
case ‘header’:
//выводим ссылки на CSS и JS
$headerfilepath = $phorum_path.’/templates/’.$PHORUM['DATA']['template_dir'].’/header_content.php’;
if (file_exists($headerfilepath)) {
include($headerfilepath);
$PHORUM['DATA']['INTEGRATE_HEADER'] = true;
$PHORUM['DATA']['HEADER_LOADED'] = true;
}
break;
case ‘content’:
//выводим содержимое форума
if(file_exists(“./$page.php”)){
phorum_namespace($page);
}
break;
}
chdir($curcwd);
error_reporting($olderror);
?>
Создайте сниппет Phorum и вставьте даннный код. Создайте отдельный шаблон для форума и в заголовок страницы между и вставьте вызов [!Phorum? action=`header`!]. Затем создайте 2 страницы, которые будут являться контейнером форума и содержимого CSS и JS-файлов и в содержимое их вставьте вызов сниппета [!Phorum, action=`content`!]. У страницы, которая будет является контейнером для CSS укажите шаблон «blank» и снимите галочку «Показывать в меню».
Теперь можно проверять. Если сделано все правильно, то результат должен быть таким:
Все файлы можно скачать с Dropbox.
Что предстоит еще сделать
Интеграция делалась для личного проекта и пока только на этапе проверки возможности. В планах доделать следующее:
Реализовать SEO URL для форума. В сниппете можно получить заголовки тем форума и использовать плагин TransAlias из MODx для генерации URL;
Объединить хлебные крошки сайта и форума;
