Советы по оптимизации MODx 1.0.3

Версия MODx 1.0.3 корректно работает без каких-либо исправлений, но для плодотворного использования системы при создании сайтов удобнее создать собственный дистрибутив, внеся ряд изменений в оригинал. В первую очередь полезно произвести полную русификацию всех компонентов, кроме того, некоторые изменения позволят избежать ряда проблем при установке и эксплуатации системы. При этом в данной статье не приводится подробное описание всех исправлений, упомянуты только некоторые рекомендации. Советы по установке системы рассматриваются в другой статье.

 

О работе MySQL в режиме strict

В последних версиях MODx при установке производится проверка сервера MySQL на режим STRICT_TRANS_TABLES и при его наличии выводится предупреждение, что в данном режиме некоторые возможности MODx не могут работать должным образом. При этом проверка выполняется не совсем корректно, так что в большинстве случаев, даже при наличии данного режима, предупреждений не появляется. Однако следует понимать, что режим strict предписывает проверять все запросы к базе на строгое соответствие стандарту SQL, и его отключение позволит записывать неверные и потенциально опасные данные в базу данных. Также следует отметить, что данный режим по умолчанию задается при установке сервера MySQL в Windows, поэтому нередко встречается на локальных компьютерах. На хостингах этот режим чаще всего отключен.

Правильнее было бы исправить все фрагменты, где генерируются неверные запросы к базе, а не отключать проверку корректности, тем более, что таких фрагментов достаточно мало. В первую очередь следует исправить фрагмент, мешающий нормальной установке системы. В папке install в файле instprocessor.php необходимо найти две строки, содержащие $locked = и после каждой из них вставить строки:

$locked = ($locked=='') ? 0 : $locked;

Далее в блоке проверки конфигурации следует пресечь вывод в журнал слишком длинных сообщений. Для этого в файле config_check.inc.php, расположенном в папке manager/includes, следует найти четыре строки:

$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');

При записи в журнал ошибок возможны и другие проблемы, так что лучше внести следующие коррективы: в файле manager/includes/document.parser.class.inc.php после строки:

$evtid= intval($evtid);

добавить две строки:

$LoginUserID=$this->getLoginUserID();
if ($LoginUserID=='') $LoginUserID=0;

и изменить:

"VALUES($evtid,$type," . time() . ",'$source','$msg','" . $this->getLoginUserID() . "')";

на:

"VALUES($evtid,$type," . time() . ",'$source','$msg','" . $LoginUserID . "')";

А также после строки

$source= $this->db->escape($source)

добавить

if ($GLOBALS['database_connection_charset'] == 'utf8' && extension_loaded('mbstring'))
{
$source = mb_substr($source, 0, 50 , "UTF-8");
} else {
$source = substr($source, 0, 50);
}

При этом подразумевается, что при работе в кодировке UTF-8 в PHP подключена библиотека mbstring.

Описанные исправления исправят ошибки в запросах SQL и позволят без каких-либо проблем работать с MODx, даже если используется сервер MySQL в режиме strict.

 

Исправление ошибок

В версии 1.0.3 все же имеется ряд ошибок, которые рекомендуется исправить. Необходимо фрагмент images/_tx_.gif заменить на images/icons/_tx_.gif в следующих файлах:

 - manager/media/style/MODxCarbon/style.css
 - manager/actions/logging.static.php
 - manager/actions/mutate_templates.dynamic.php
 - manager/actions/mutate_user.dynamic.php
 - manager/actions/mutate_web_user.dynamic.php

Сниппет 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 )

Имеется небольшая ошибка и в сниппете AjaxSearch. Необходимо в файле ajaxSearch.class.inc.php в функции getExtract добавить одну строку, то есть вместо:

if (($this->dbCharset == 'utf8') && ($this->cfg['mbstring'])) 
{
...

$mbStrrpos = 'mb_strrpos';
}

получить

if (($this->dbCharset == 'utf8') && ($this->cfg['mbstring'])) {
...
 $mbStrrpos = 'mb_strrpos';

mb_internal_encoding("UTF-8");
}

а также в файле search.class.inc.php после строки

$mbStrlen = $this->cfg['mbstring'] ? 'mb_strlen' : 'strlen';

добавить строку

if (($this->dbCharset == 'utf8') && ($this->cfg['mbstring']))
mb_internal_encoding("UTF-8");

Также имеются ошибки в плагине ForgotManagerPassword, но их лучше исправить подключением единой программы работы с почтой.

 

Добавления и русификация

В составе 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. Кроме того следует скачать с соответствующего сайта последние языковые файлы для TinyMCE, так как на момент выпуска MODx 1.0.3 некоторых языковых файлов еще не было.

Для повышения эффективности сниппета 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 полезно в начало файла lang/russian-UTF8.inc.php после заголовка вставить строку:

 

setlocale (LC_ALL, 'ru_RU.UTF-8');

а также исправить файл 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: 0.0041 s, запросов: 1, PHP: 0.1955 s, всего: 0.1996 s, памяти [^m^], документ взят из cache
то на страницах сайта появится примерно такая строка:
MySQL: 0.1646 c, запросов: 24, PHP: 0.1785 c, всего: 0.3430 c, памяти 3.25 МБ, документ взят из базы

Аналогично можно вносить и другие изменения в дистрибутив MODx, однако рекомендуется записывать все исправления, чтобы при выходе следующей версии вы смогли и в нее внести аналогичную правку.

Источник: здесь

Веб разработка

Мои координаты

Электронная почта: arman@sab.kz , arman_sb@mail.ru

Местоположение: Казахстан, Астана