Как и обещал выше, пишу о проблемах, обнаруженных в новой версии MODx. Отмечу, что большинство их них остались с предыдущих версий. Некоторые проблемы, обнаруженные и описанные в англоязычной части форума, я не рассматриваю.
I. ПРОБЛЕМЫ, НЕ СВЯЗАННЫЕ С РУССКИМ ЯЗЫКОМ
1. Имеется достаточно много проблем, связанных с попыткой записать в числовое поле базы данных пустое значение (""). Если MySQL работает в режиме Strict Mode, то есть в режиме строгого соответствия стандартам, такие попытки приводят к ошибкам (может возникнуть ошибка #1366 - Incorrect integer value или просто операция не будет выполнена). Рекомендации использовать другой режим MySQL не слишком полезны, так как не всегда эта возможность доступна, да и CMS, на мой взгляд, должна создавать корректные запросы SQL. А корректными в данном случае являются только числовые значения (например, 0) или NULL. Вот обнаруженные мною места, в которых требуется внести исправления:
1.1. Нельзя добавить значение TV после создания документа. Можно ввести значение вместе с вводом нового документа или исправить введенное ранее, но если при создании TV не задать, потом ввести его будет невозможно. Об этом я писал и в английской части форума:
http://modxcms.com/forums/index.php/topic,19892.msg156826.html#msg156826
и в русской:
http://modxcms.com/forums/index.php/topic,25778.msg157947.html#msg157947
но исправления в новую версию не внесены.
Для решения проблемы нужно найти файл
manager/processors/save_content.processor.php
и заменить в нем строки
$tvChanges[] = '(\''.$tvIds[$tvId].'\', '.$tvId.', '.$id.', \''.mysql_escape_string($tvVal).'\')';
на
if ($tvIds[$tvId] == '') $tvIds[$tvId]="NULL";
else $tvIds[$tvId]='\''.$tvIds[$tvId].'\'';
$tvChanges[] = '('.$tvIds[$tvId].', '.$tvId.', '.$id.', \''.mysql_escape_string($tvVal).'\')';
1.2. Нельзя добавить событие для ранее сохраненного плагина. В файле
manager/processors/save_plugin.processor.php
добавить строку
if ($priority=="") $priority=0;
перед
1.3. Ошибка при создании TV ($rs not set! New variable not saved!), возникающая, если не задать порядок в соответствующем списке. В файле
manager/processors/save_tmplvars.processor.php
заменить
$rank = isset ($_POST['rank']) ? mysql_escape_string($_POST['rank']) : 0;
на
$rank = (isset ($_POST['rank']) && $_POST['rank']!='') ? mysql_escape_string($_POST['rank']) : 0;
Скорее всего, есть и другие проблемные места, и было бы хорошо, если разработчики MODx везде обеспечили формирование запросов в соответствии с требованиями SQL.
2. Навязчивая ошибка «Error while inserting event log into database.», преследующая пользователей уже несколько версий. Я ранее писал о решении этой проблемы, но повторюсь.
Для начала, следует исправить неверный вызов записи события при проверке конфигурации. В файле
manager/includes/config_check.inc.php
найти четыре вызова функции logEvent:
$modx->logEvent(0,2,$warnings[$i][1],$_lang['configcheck_configinc']);
$modx->logEvent(0,2,$warnings[$i][1],$_lang['configcheck_installer']);
$modx->logEvent(0,2,$warnings[$i][1],$_lang['configcheck_cache']);
$modx->logEvent(0,2,$warnings[$i][1],$_lang['configcheck_images']);
КАЖДЫЙ вызов заменить на
$modx->logEvent(0,2,$warnings[$i][1],'Config Check');
То есть сделать все вызовы одинаковыми. Если есть желание, можно сделать их разными, например
’Config Check inclide’ и
’Config Check installer’.
Следует отметить, что ошибка возникает только при использовании неверной конфигурации, так что те, у которых нет проблем с конфигурацией, не встречались с этой ошибкой.
Для того, чтобы полностью исключить проблемы при сохранении сообщений об ошибках, следует исправить функцию logEvent. В файле
manager/includes/document.parser.class.inc.php
вместо
echo "Error while inserting event log into database.";
выводить
echo "Error while inserting event log into database: ". mysql_error().", SQL: ".$sql;
То есть писать, какая именно ошибка возникла, чтобы ее в дальнейшем исправить.
Также после строки
добавить две строки
$LoginUserID=$this->getLoginUserID();
if ($LoginUserID=='') $LoginUserID=0;
и изменить
"VALUES($evtid,$type," . time() . ",'$source','$msg','" . $this->getLoginUserID() . "')";
на
"VALUES($evtid,$type," . time() . ",'$source','$msg','" . $LoginUserID . "')";
То есть в численное поле записывается ноль, а не пустая строка (проблема та же, что и в предыдущем пункте).
И еще после строки
$source= mysql_escape_string($source);
добавить
if ($GLOBALS['database_connection_charset'] == 'utf8' && extension_loaded('mbstring')) {
$source = mb_substr($source, 0, 50 , "UTF-8");
} else {
$source = substr($source, 0, 50);
}
3. В последних версиях не работает блокировка при неверном вводе пароля. Для менеджеров исправления вносятся в файл
manager/processors/login.processor.inc.php
вставить строку
$blocked_minutes=$modx->config['blocked_minutes'];
после строки с комментарием
increment the failed login counter, and block!
а также несколькими строками ниже, сразу после строки
добавить строку
Аналогичные изменения для web-пользователей следует внести в файл
assets/snippets/weblogin/weblogin.processor.inc
4. Кстати, для сниппета Weblogin можно было бы внести небольшие изменения. В файле
assets/snippets/weblogin/weblogin.inc.php
Неплохо бы вынести JavaScript в отдельный файл, то есть добавить строку
<script type="text/JavaScript" src="assets/snippets/weblogin/weblogin.js"></script>
а то, что было раньше, записать в файл weblogin.js
Также для некоторых случаев лучше в строках
$tpl = "<div id='WebLoginLayer0' style='position:relative'>".$tpls[0]."</div>";
$tpl.= "<div id='WebLoginLayer2' style='position:relative;display:none'>".$tpls[2]."</div>";
убрать style=’position:relative’ (при необходимости это можно описать в файле стиля).
О проблемах с русским языком будет написано ниже.