Обзор Discuss 1.1.0-pl
В продолжение радостной новости о выходе новой версии Discuss, публикую обзор.
Сначала о грустном… В процессе установки вылезли SQL-ошибки.
Error adding index user to disUserFriend: Array ( [0] => 42S02 [1] => 1146 [2] =>
Table 'discuss_v01.modx_discuss_user_friends' doesn't exist )
Error adding index friend to disUserFriend: Array ( [0] => 42S02 [1] => 1146 [2] =>
Table 'discuss_v01.modx_discuss_user_friends' doesn't exist )
Error adding field disBoard->ltr: No metadata defined
Error adding index ltr to disBoard: No metadata defined
Error adding field disThread->post_last_on: Array ( [0] => 42S02 [1] => 1146 [2] =>
Table 'discuss_v01.modx_discuss_threads' doesn't exist )
Error adding index post_last_on to disThread: Array ( [0] => 42S02 [1] => 1146 [2] =>
Table 'discuss_v01.modx_discuss_threads' doesn't exist )
Error adding field disThread->participants: Array ( [0] => 42S02 [1] => 1146 [2] =>
Table 'discuss_v01.modx_discuss_threads' doesn't exist )
Could not load class: disBanGroup from mysql.disbangroup.
Could not load class: disBanItem from mysql.disbanitem.
Запустил переустановку пакета (из расчета того, что таблицы уже есть и все дело в очередности вызова скриптов). Получил новую порцию ошибок:
Error adding index user to disUserFriend: Array ( [0] => 42000 [1] => 1061 [2] => Duplicate key name 'user' )
Error adding index friend to disUserFriend: Array ( [0] => 42000 [1] => 1061 [2] => Duplicate key name 'friend' )
Error adding field disBoard->ltr: No metadata defined
Error adding index ltr to disBoard: No metadata defined
Error adding field disThread->post_last_on: Array ( [0] => 42S21 [1] => 1060 [2] => Duplicate column name 'post_last_on' )
Error adding index post_last_on to disThread: Array ( [0] => 42000 [1] => 1061 [2] => Duplicate key name 'post_last_on' )
Error adding field disThread->participants: Array ( [0] => 42S21 [1] => 1060 [2] => Duplicate column name 'participants' )
Could not load class: disBanGroup from mysql.disbangroup.
Could not load class: disBanItem from mysql.disbanitem.
С индексами еще ладно, просто ошибка попытки создать уже существующий индекс, а вот за невозможностью подгрузки класса «disBanItem» надо еще будет последить.
Javascript-ошибки действительно есть, типа этой: «ReferenceError: $LAB is not defined». И видим вот такие неприятные моменты:

Но это мелочи… Самое главное, что бросается в глаза, и хотя еще не изучены последствия, но уже очень грустно становится — это отдельная таблица для пользователей форума, при чем со своими полями username, email и т.п. При чем изменение данных у основного пользователя не влияет на данные пользователя форума, даже если это емейл, или пользователя вообще заблокировали. Это очень и очень грустно…
При попытке входа не выводится никаких ошибок о неправильном логине и пароле (на официальном форуме перебрасывает на самостоятельную страницу авторизации на сам modx.com).
Еще один большой минус — для работы форума требуется куча правил реврайта. Тоже вообще не порадовало.
Кстати, хотя он по умолчанию заточен под адрес /forums/, и создает для себя документ при установке (и, к слову, при переустановке тоже, каждый раз), тем не менее его пути все равно формируются от корня. Это происходит по той причине, что при работе он получает настройку discuss.forums_resource_id и на основе ID этого документа формирует ссылку к корню. Но при этом в момент установки он не ставит id созданного собой же документа в эту переменную. Так что не забывайте вручную установить корневой документ.
Так же сразу видно, что основа закладывалась очень давно, и много просто переходит по наследству, но уже давно не работает. К примеру GET-параметр print должен сигнализировать о том, чтобы вывести версию для печати, и он действительно выводит урезанную версию страницы, да вот только файл print.css отсутствует. В итоге страничка получается вообще не пригодная для чтения.
Система шаблонизации оставляет желать лучшего. Это если мягко выражаться… Куча файлов tpl-ок с огромным количеством плейсхолдеров и т.п. А файл-манифест, описывающий правила для отдельных разделов содержит 500+строк кода и выглядит вот так:
$manifest = array(
'preview' => 'preview.png',
'global' => array(
'js' => array(
'inline' => 'var DIS = {config: {}}; DIS.url =
"'.$this->discuss->request->makeUrl().'";DIS.shJsUrl = "'.$this->discuss->config['jsUrl'].'sh/";DIS.config.connector =
"'.$this->discuss->config['connectorUrl'].'"; DIS.config.forum_url =
"'.$this->discuss->request->makeUrl().'"',
),
'options' => array(
'registerJsToScriptTags' => false,
'showBreadcrumbs' => true,
'showTitleInBreadcrumbs' => true,
'showReaders' => true,
'showModerators' => true,
'showPaginationIfOnePage' => false,
'showPrintOption' => false,
)
),
'print' => array(
'css' => array(
'header' => array(
'print.css',
),
),
),
Все через кучу контроллеров, свои классы-реквестеры и т.п. В общем довольно-таки жутко.
И самое интересное: когда создается пользователь в админке, он не создается в пользователях форума. А регистрацию я так и не проверил, так как для этого еще надо документ создавать (как и для обновления профиля, и для регистрации).
Есть еще куча всяких ошибок, но расписывать их лень. Мой вердикт: все это надо переписывать с нуля. То, как оно сейчас выглядит, развивать перспективы нет. В общем я сильно разочарован… Реально. Livestreet для MODX (modLivestreet) — это конечно костыль, но зато устанавливается в пару кликов и сразу работает. А тут… Печально:-(
P.S. Плагин, чтобы работало без дополнительных правил в .htaccess и т.п. (вешаем его на событие OnPageNotFound) Может что-то доработать надо, но это можно узнать только в процессе работы.
if($modx->context->key == 'mgr'){return;}
if(isset($modx->resource) && is_object($modx->resource)){return;}
$base_url = $modx->getOption('base_url', null);
$url = $_SERVER['REQUEST_URI'];
$forums_resource_id = $modx->getOption('discuss.forums_resource_id', null, $modx->getOption('site_start', null));
$forum_url_prefix = $modx->makeUrl($forums_resource_id, '', '', 'abs');
if(!$forum_url_prefix) $forum_url_prefix = $modx->getOption('base_url', null);
// Check for forums path
if(strpos($url, $forum_url_prefix) !== 0){return;}
$preg = str_replace('/', '\/', $forum_url_prefix);
$url = preg_replace("/^{$preg}/", $base_url, $url);
$_SERVER['REQUEST_URI'] = $url;
// cleare from params
$url = preg_replace('/\?.*/','', $url);
if(!$url){return;}
$params = array();
if(preg_match('/^\/(board|thread|category)\/([0-9]+)\/(.*)$/', $url, $match)){
$params['action'] = $match[1];
$params[$match[1]] = $match[2];
}
else if(preg_match('/^\/u\/(.*)$/', $url, $match)){
$params['action'] = 'user';
$params['user'] = $match[1];
}
else{
$params['action'] = $url;
}
foreach($params as $k => $v){
$_GET[$k] = $v;
$_REQUEST[$k] = $v;
}
$modx->sendForward($forums_resource_id);
P.P.S. До хорошего так и не добрался…