Некоторые советы по доработке MODx 1.0.4
Версия MODx 1.0.4 корректно работает без каких-либо исправлений, но для плодотворного использования системы при создании сайтов удобнее создать собственный дистрибутив, внеся ряд изменений в оригинал. В первую очередь полезно произвести полную русификацию всех компонентов, кроме того, некоторые изменения позволят избежать ряда проблем при установке и эксплуатации системы на сайте. При этом в данной статье не приводится подробное описание всех исправлений, упомянуты только некоторые рекомендации.
О работе MySQL в режиме strict
В последних версиях MODx при установке производится проверка сервера MySQL на режим STRICT_TRANS_TABLES и при его наличии выводится предупреждение, что в данном режиме некоторые возможности MODx не могут работать должным образом. При этом проверка выполняется не совсем корректно, так что в большинстве случаев, даже при наличии данного режима, предупреждений не появляется. Однако следует понимать, что режим strict предписывает проверять все запросы к базе на строгое соответствие стандарту SQL, и его отключение позволит записывать неверные и потенциально опасные данные в базу данных. Также следует отметить, что данный режим по умолчанию задается при установке сервера MySQL в Windows, поэтому нередко встречается на локальных компьютерах. На хостингах этот режим чаще всего отключен.
Правильнее было бы исправить все фрагменты, где генерируются неверные запросы к базе, а не отключать проверку корректности, тем более что в последней версии системы такие фрагменты исправлены, что позволяет без каких-либо проблем работать с MODx, даже если используется сервер MySQL в режиме strict.
Исправление ошибок
В версии 1.0.4 исправлены ошибки версии 1.0.3, и из ошибок, которые рекомендуется исправить, осталась только одна. Сниппет Breadcrumbs добавляет лишний псевдоним при ссылке на главную страницу сайта и неверно формирует список для страниц, дочерних относительно главной. Для исправления необходимо в папке install/assets/snippets в файле breadcrumbs.tpl строку
$pretemplateCrumb .= '<a class="'.$crumbClass.'" href="'.$modx->makeUrl($c['id']).'" title="'.$title.'">'.$text.'</a>';
изменить на
$pretemplateCrumb .= '<a class="'.$crumbClass.'" href="'.(($c['id'] == $modx->config['site_start']) ? $modx->config['base_url'] : $modx->makeUrl($c['id'])).'" title="'.$title.'">'.$text.'</a>';
а строку
while ( $parent && $loopSafety < 1000 )
изменить на
while ( $parent && $parent!=$modx->config['site_start'] && $loopSafety < 1000 )
также в строку, начинающуюся следующими выражениями:
if ( $showHomeCrumb && $homeCrumb = $modx->getPageInfo
следует добавить проверку, чтобы строка начиналась так:
if ( $showHomeCrumb && $homeId != $modx->documentObject['id'] && $homeCrumb = $modx->getPageInfo
Добавления и русификация
В составе MODx поставляется устаревшая версия PHPMailer, не удовлетворяющая современным требованиям. Рекомендуется заменить ее на версию 5.1, которую можно получить с официального сайта данной системы. Возможно, потребуются незначительные доработки, но в целом последняя версия работает намного лучше. Чрезвычайно полезно заменить все вызовы стандартной функции PHP mail отправкой писем через PHPMailer. Для этого требуется внести изменения в сниппеты Jot, Weblogin, плагин ForgotManagerPassword а также в файлы save_user.processor.php и save_web_user.processor.php. Например, в ForgotManagerPassword.tpl следует изменить функцию sendEmail таким образом:
function sendEmail($to) {
global $modx, $_lang;
$user = $this->getUser(0, '', $to);
if($user['username']) {
include_once "includes/controls/class.phpmailer.php";
$mail = new PHPMailer();
$mail->IsMail();
$mail->CharSet = $modx->config['modx_charset'];
$mail->IsHTML(true);
$mail->From = $modx->config['emailsender'];
$mail->FromName = 'MODx';
$mail->Subject = $_lang['password_change_request'];
$mail->Body = <<<EOD
<p>{$_lang['forgot_password_email_intro']} <a href="{$modx->config['site_url']}manager/processors/login.processor.php?username={$user['username']}&hash={$user['hash']}">{$_lang['forgot_password_email_link']}</a></p>
<p>{$_lang['forgot_password_email_instructions']}</p>
<p><small>{$_lang['forgot_password_email_fine_print']}</small></p>
EOD;
$mail->AddAddress($to);
$mail->AddReplyTo("no-reply@{$_SERVER['HTTP_HOST']}")
if(!$mail->send()) { $this->errors[] = $_lang['error_sending_email']; }
return $mail;
}
}
Аналогично можно исправить и другие программы.
Если вы собираетесь создавать русскоязычные сайты, рекомендуется перевести сниппеты Jot, Weblogin, плангин ForgotManagerPassword и файлы login.processor.php, error.class.inc.php, save_user.processor.php, save_web_user.processor.php. Также полезно перевести менеджер файлов mcpuk и добавить в него транслитерацию имен файлов, о чем писалось на форуме MODx.
Для повышения эффективности сниппета Wayfinder, как рекомендовано на форуме MODx, следует в файле wayfinder.inc.php вместо строки:
$ids = $modx->getChildIds($this->_config['id'],$this->_config['level']);
подставить:
if (!$this->_config['hideSubMenus']) {
$ids = $modx->getChildIds($this->_config['id'],$this->_config['level']);
} else { // then hideSubMenus is checked, we don`t need all children
// first we always included the chilren of startId document
// this fix problem with site root chidrens,
// because site root not included in $modx->getParentIds
$ids = $modx->getChildIds($this->_config['id'], 1, $ids);
$parents = array($modx->documentIdentifier);
$parents += $modx->getParentIds($modx->documentIdentifier);
// if startId not in parents, only show children of startId
if ($this->_config['id'] == 0 || in_array($this->_config['id'], $parents)){
//remove parents higher than startId(including startId)
$startId_parents = array($this->_config['id']);
$startId_parents += $modx->getParentIds($this->_config['id']);
$parents = array_diff($parents, $startId_parents);
//remove parents lower than level of startId + level depth
$level = $this->_config['level'];
if ($level == 0)
$level = 10; // constant getted from getParentIds function
$parents = array_slice(array_reverse($parents), 0, $level-1);
foreach($parents as $p)
$ids = $modx->getChildIds($p, 1, $ids);
}
}
Для корректной работы сниппета Ditto полезно исправить файл summary.extender.inc.php, добавив обработку строк функциями mbstring при использовании кодировки UTF-8.
Чтобы по умолчанию выполнялась правильная транслитерация русских псевдонимов, следует в папке install/assets/plugins в файле transalias.tpl заменить:
&table_name=Trans table;list;common,russian,utf8,utf8lowercase;utf8lowercase
на:
&table_name=Trans table;list;common,russian,utf8,utf8lowercase;russian
Возможно, потребуются и некоторые другие исправления, в соответствии с вашими собственными предпочтениями.
Дополнительные исправления
Вы можете добавить любые сниппеты, модули и плагины в состав собственного дистрибутива MODx. Например, для добавления плагина EditArea необходимо добавить папку assets из дистрибутива плагина в дистибутив MODx, а из папки install плагина взять файл plugin.EditArea.tpl и, переименовав его в EditArea.tpl, поместить в папку install/assets/plugins. Дополнительно необходимо исправить строки, расположенные в самом начале файла, чтобы он начинался так:
//<?php
/**
* EditArea
* Allows text formatting, search and replace and real-time syntax highlighting
* @status GA
* @version 0.5.2
* @date March 17, 2010
* @category plugin
* @EditArea Packaged version: 0.8.2
также после строки:
* @bugs See plugin_bugs.txt
необходимо добавить следующие строки:
* @internal @properties &eadbg=Debug Enabled?;list;true,false;false &word_wrap=Word Wrap Enabled?;list;true,false;true &font_size=Font Size;list;8,9,10,11,12;9 &defaultHeight=Initialize editor height;list;300px,400px,500px,600px,700px;500px &min_height=Minimum editor height;list;200,300,400;400 &start_highlight=Initialize with highlighting enabled?;list;true,false;true &allow_toggle=Allow editor toggling?;list;true,false;true &allow_resize=Allow editor resizing?;list;y,n;y &fullscreen=Initialize editor in fullscreen mode?;list;true,false;false &replace_tab_with_spaces=Replace tab with spaces?;list;// No,// Yes ;// Yes &tab_as_spaces=How many spaces per tab?;list;3,4,5;4 &plugins=Active Plugins;string;modx, syntax_selection &catchunload=Try/Catch on Unload?;list;yes,no;yes&compressor=PHP Compressor Enabled?;list;0,1;0
* @internal @events OnChunkFormRender,OnDocFormRender,OnModFormRender,OnPluginFormRender,OnSnipFormRender,OnTempFormRender
* @internal @modx_category Manager and Admin
* @internal @legacy_names EditArea
В результате плагин будет устанавливаться точно так же, как и любые другие компоненты, включенные в состав MODx.
Вы также можете изменить настройки по умолчанию конфигурации, которые предлагаются после установки MODx. Для этого в папке install следует исправить в файле setup.sql нужные поля. Например, чтобы в капче использовать только цифры, следует заменить соответствующую строку на:
('captcha_words','0,1,2,3,4,5,6,7,8,9'),
а для того, чтобы вновь создаваемые документы были сразу опубликованы, следует задать:
('publish_default','1'),
Также можно изменить внешний вид визуального редактора, сделав его таким же, как в предыдущих версиях системы, введя:
('tinymce_editor_theme','custom'),
Кстати, чтобы в списке стилей не появлялись непонятные строки, следует в папке assets/plugins/tinymce/style в файле content.css закомментировать две последние строки.
Чтобы после установки не менялись названия полей при редактировании ресурсов, следует в файле assets/plugins/managermanager/mm_rules.inc.php закомментировать все строки.
Если вы хотите получать на русском языке статистику работы парсера MODx, следует в файле manager/includes/document.parser.class.inc.php найти соответствующие строки и заменить английские названия на русские (s на с, base на базы и так далее):
$queryTime= sprintf("%2.4f с", $queryTime);
$totalTime= sprintf("%2.4f с", $totalTime);
$phpTime= sprintf("%2.4f с", $phpTime);
$source= $this->documentGenerated == 1 ? "базы" : "кэша";
Чуть ниже можно добавить:
$phpMemory = (memory_get_peak_usage(true) / 1024 / 1024) . " МБ";
$out= str_replace("[^m^]", $phpMemory, $out);
При работе с кодировкой UTF-8 не забудьте кодировать этот файл в UTF-8 (без BOM). Если теперь вы в шаблоне добавите строку:
MySQL: [^qt^], запросов: [^q^], PHP: [^p^], всего: [^t^], памяти [^m^], документ взят из [^s^]
то на страницах сайта появится примерно такая строка:
MySQL: 0.1646 c, запросов: 24, PHP: 0.1785 c, всего: 0.3430 c, памяти 3.25 МБ, документ взят из базы
Аналогично можно вносить и другие изменения в дистрибутив MODx, однако рекомендуется записывать все исправления, чтобы при выходе следующей версии вы смогли и в нее внести аналогичную правку.