Исправления, необходимые для версии 0.9.6.2 описаны в разных местах на форуме, и многие не находят всю полезную информацию, в результате чего сталкиваются с проблемами. Я объединил в этой теме все необходимые исправления, а также немного скорректировал некоторые рекомендации.
1. Критически необходимые исправления, решающие проблемы с кодировкой и русификацией.
1.1. В файле
manager/includes/extenders/dbapi.mysql.class.inc.php
заменить:
function DBAPI($host='',$dbase='', $uid='',$pwd='',$pre=NULL,$charset='') {
на:
function DBAPI($host='',$dbase='', $uid='',$pwd='',$pre=NULL,$charset='',$connection_method='SET CHARACTER SET') {
ниже строки:
$this->config['charset'] = $charset ? $charset : $GLOBALS['database_connection_charset'];
добавить:
$this->config['connection_method'] = $this->_dbconnectionmethod = (isset($GLOBALS['database_connection_method']) ? $GLOBALS['database_connection_method'] : $connection_method);
ниже строки:
$charset = $charset ? $charset : $this->config['charset'];
добавить:
$connection_method = $this->config['connection_method'];
заменить строку:
@mysql_query("{$database_connection_method} {$charset}", $this->conn);
на:
@mysql_query("{$connection_method} {$charset}", $this->conn);
1.2. В папке
install/lang поменять имя папки
russian на
russian-UTF8, войти в эту папку и переименовать файл
russian.inc.php в
russian-UTF8.inc.php.
1.3. В файле
manager/includes/veriword.php
заменить
@mysql_query("{$database_connection_method} {$database_connection_charset}");
на
@mysql_query("{$GLOBALS['database_connection_method']} {$database_connection_charset}");
2. Рекомендуемые исправления, решающие проблемы с кодировкой и русификацией.
2.1. Скачать исправленные языковые файлы, расположенные здесь:
http://modxcms.com/forums/index.php/topic,29123.msg176816.html#msg176816
и поместить их в папку
manager/includes/lang.
2.2. В файле
install/lang/russian/russian.inc.php
заменить
$_lang["status_passed_server"] = 'успех - сопоставление базы данных не доступно';
на
$_lang["status_passed_server"] = 'успех - сопоставление базы данных доступно';
2.3. В файле
assets/plugins/tinymce3101/tinymce.linklist.php
удалить строку
global $database_connection_charset;
и заменить
@mysql_query("{$database_connection_method} {$database_connection_charset}");
на
@mysql_query("{$GLOBALS['database_connection_method']} {$GLOBALS['database_connection_charset']}");
Это исправление должно решить проблему неверного отображения русских названий ссылок в Tinymce, но часто данного исправления бывает недостаточно. Если проблема осталось, следует дополнительно внести исправления по одному из описанных ниже вариантов:
Вариант 1
В файл
assets/plugins/tinymce3101/jscripts/tiny_mce/plugins/advlink/link.html
добавить строку
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
но при этом ошибки появятся в других кодировках, отличных от UTF8.
Вариант 2
Можно в файл
assets/plugins/tinymce3101/tinymce.linklist.php
перед строкой:
$list .=($list!='')?",\n":"\n";
добавить:
if ($database_connection_charset == 'utf8' && extension_loaded('mbstring')) {
$caption = mb_convert_encoding($caption, "CP1251", "UTF-8");
}
но при этом проблемы возникнут при использовании UTF8 для других языков.
2.4. В файле
install/setup.sql
заменить
('fe_editor_lang','english'),
на
('fe_editor_lang','{MANAGERLANGUAGE}'),
2.5. В папке
manager/includes/lang/country файл
russian_country-UTF8.inc.php переименовать на
russian-UTF8_country.inc.php.
3. Дополнительные исправления, решающие другие проблемы.
3.1. Решение проблем, связанных с работой MySQL в режиме Strict Mode, то есть в режиме строгого соответствия стандартам, и не совсем стандартного формирования запросов в MODx. Можно проверить – в phpMyAdmin при попытке записать пустое значение (не NULL и не 0) в числовое поле выдается ошибка, то внести описанные ниже изменения необходимо.
3.1.1. В файле
manager/processors/save_content.processor.php
заменить строки
$tvChanges[] = '(\''.$tvIds[$tvId].'\', '.$tvId.', '.$id.', \''.mysql_escape_string($tvVal).'\')';
на
if ($tvIds[$tvId] == '') $tvIds[$tvId]="NULL";
$tvChanges[] = '('.$tvIds[$tvId].', '.$tvId.', '.$id.', \''.mysql_escape_string($tvVal).'\')';
3.1.2. В файле
manager/processors/save_plugin.processor.php
добавить строку
if ($priority=="") $priority=0;
перед
3.1.3. В файле
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;
3.2. При ошибках MODx записывает сообщения в системный журнал, и часто при этом возникает ошибка «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 Installer’ и
’Config Check Сache’.
В файле
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.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