Необходимость избавляет нас от трудностей выбора.Люк де Клапье Вовенарг
Теги: ModX, CMS, CMF, оптимизация
Версия MODx 1.0.3 корректно работает без каких-либо исправлений, но для плодотворного использования системы при создании сайтов удобнее создать собственный дистрибутив, внеся ряд изменений в оригинал. В первую очередь полезно произвести полную русификацию всех компонентов, кроме того, некоторые изменения позволят избежать ряда проблем при установке и эксплуатации системы. При этом в данной статье не приводится подробное описание всех исправлений, упомянуты только некоторые рекомендации. Советы по установке системы рассматриваются в другой статье.
В последних версиях 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
Возможно, потребуются и некоторые другие исправления, в соответствии с вашими собственными предпочтениями.
//<?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В результате плагин будет устанавливаться точно так же, как и любые другие компоненты, включенные в состав MODx.
* @internal @events OnChunkFormRender,OnDocFormRender,OnModFormRender,OnPluginFormRender,OnSnipFormRender,OnTempFormRender
* @internal @modx_category Manager and Admin
* @internal @legacy_names EditArea
('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 закомментировать две последние строки.$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) . " МБ";При работе с кодировкой UTF-8 не забудьте кодировать этот файл в UTF-8 (без BOM). Если теперь вы в шаблоне добавите строку:
$out= str_replace("[^m^]", $phpMemory, $out);
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 МБ, документ взят из базы
Источник: здесь
Мои координаты
Электронная почта: arman@sab.kz , arman_sb@mail.ru
Местоположение: Казахстан, Астана