Umi вывод ошибок

Название

Секция [debug] — Настройки режима отладки

enabled = "0"

filter.ip[] = ""

Вывод ошибок только для посетителей с указанными ip. Например:
filter.ip[] = «127.0.0.1»
filter.ip[] = «192.168.0.1»

show-backtrace = 0

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

allowed-ip[] = ""

Вывод отладочной информации только для посетителей с указанными ip. Например:
allowed-ip[] = «127.0.0.1»
allowed-ip[] = «192.168.0.1»

callstack.disabled = "0"

Выключить вывод стека вызовов, при использовании флага «?showStreamsCalls=1» в адресе страницы.

Возможные значения

0

Вывод стека включён по умолчанию. При добавлении к адресу страницы (в адресной строке браузера) флага «?showStreamsCalls=1» (например, «http://site.ru/somepage/?showStreamsCalls=1») будет отображена подробная информация о запросах, произведенных при генерации данной страницы.

1

Вывод стека отключен (и для XSLT и для TPL-шаблрнизаторов) — добавление флага не даст никакого эффекта — будет загружена вызываемая страница.

allowed-ip[] = ""

Вывод отладочной информации только для посетителей с указанными ip. Например:
allowed-ip[] = «127.0.0.1»
allowed-ip[] = «192.168.0.1»

log-exceptions = "0"

Включает/отключает ведение лога неперехваченных исключений. Информация сохраняется в директорию errors/logs.

handle-shutdown = "0"

Включает/отключает отображение ошибок при аварийном завершении запроса.

Содержание

  • 1 Отладка ошибки 500 при помощи register_shutdown_function
  • 2 Вывод данных отладки в браузере
  • 3 Вывод данных отладки в файл
  • 4 Получить стек вызова функции при помощи debug_backtrace
  • 5 Получить расположение используемого класса, метода или функции
    • 5.1 Информация о функции
    • 5.2 Информация о классе
    • 5.3 Информация о методе
  • 6 Время выполнения скрипта

Отладка ошибки 500 при помощи register_shutdown_function

Иногда причину 500 ошибки можно определить при помощи вывода последней ошибки, которая произошла перед завершением скрипта. Для ее вывода в начало выполняемого PHP файла необходимо добавить следующий код:

register_shutdown_function(function(){
	if (error_get_last()) {
		var_export(error_get_last());
	}
});

Данный код регистрирует функцию, которая будет выполняться по завершении скрипта. В функции происходит вывод последней ошибки, которая была зафиксирована при выполнении скрипта.

Документация по register_shutdown_function

Вывод данных отладки в браузере

Наиболее простой способ вывести любую переменную это функции print_r(), var_dump() и var_export()

print_r() — выводит структуру переменной в удобочитаемом виде

Документация по print_r

var_dump() — также выводит тип данных для всех переменных

Документация по var_dump

var_export() — выводит структуру переменно в формате пригодным для выполнения в PHP

Документация var_export

По умолчанию выводы этих функций используют ‘\n’ в качестве переносов на новую строку.

Так как в браузере эти символы удаляются, то для того, чтобы результат было удобно читать, можно поместить его в тег <pre>

echo '<pre>';
print_r($var);
echo '</pre>';

или так

echo '<pre>' . print_r($var, true) . '</pre>';

В качестве второго аргумента для функций print_r() и var_export() можно указать true, если необходимо, чтобы функция возвращала результат, а не выводила его.

Код:

echo '<pre>';
print_r($variables['user']);
var_dump($variables['user']);
var_export($variables['user']);
echo '</pre>';

Результат вывода:

Array
(
    [id] => 3
    [type] => guest
)
array(2) {
  ["id"]=>
  int(3)
  ["type"]=>
  string(5) "guest"
}
array (
  'id' => 3,
  'type' => 'guest',
)

Иногда необходимо вывести все доступные в текущей области видимости переменные, в этом случае можно воспользоваться функцией get_defined_vars

Документация по get_defined_vars

Вывод данных отладки в файл

Иногда вывести переменные в браузер нет возможности: важно не нарушать работу сайта, либо скрипт выполняет редирект на другую станицу, а также по другим причинам.

Для записи данных отладки в файл нам поможет функция file_put_contents, можно использовать ее со следующими аргументами:

file_put_contents("umitest", print_r([__FILE__.' '.__LINE__, $variable], true).PHP_EOL, FILE_APPEND | LOCK_EX);

В результате выполнения данной функции рядом с файлом, из которого было запущено выполнение PHP (обычно это index.php в корне сайта), будет создан файл umitest в который запишется имя файла, строка в нем и содержимое переменной $variable.

__FILE__ — это волшебная константа PHP которая всегда содержит имя текущего файла.

__LINE__ — это волшебная константа PHP которая всегда содержит номер строки в файле в котором она была вызвана.

Эти константы рекомендуется добавлять в вывод по нескольким причинам:

1) Удобство отслеживания из какого файла и строки в нем была сделана запись

2) При отладке большого количества файлов можно забыть куда именно был добавлен отладочный код, эта информация поможет быстро найти его.

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

LOCK_EX — блокирует файл для записи, чтобы в него не смогли писать другие скрипты.

Можно вывести в файл все переменные, доступные в текущей области видимости:

file_put_contents("umitest", print_r([__FILE__.' '.__LINE__, get_defined_vars()], true).PHP_EOL, FILE_APPEND | LOCK_EX);

или только некоторые из них

file_put_contents("umitest", print_r([__FILE__.' '.__LINE__, $var1, $var2], true).PHP_EOL, FILE_APPEND | LOCK_EX);

Документация по file_put_contents

Получить стек вызова функции при помощи debug_backtrace

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

$debug_arr = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS)

Также в качестве второго аргумента можно указать глубину стека.

Стек вызова можно вывести как в браузер:

echo '<pre>' . print_r(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS), true) . '</pre>';

так и записывать в файл:

file_put_contents("umitest", print_r([__FILE__.' '.__LINE__, debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS)], true), FILE_APPEND | LOCK_EX);

Документация по debug_backtrace

Получить расположение используемого класса, метода или функции

Стек вызовов дает информацию откуда была вызвана функция, но иногда необходимо узнать где находится используемый в коде класс, метод или функция. Для решения этой задачи в PHP есть специальные классы ReflectionFunction, ReflectionClass и ReflectionMethod, методы которых дают возможность получить всю необходимую для этого информацию.

Информация о функции

$reflectionMethod = new ReflectionFunction('function_name');
file_put_contents("umitest", print_r([__FILE__.' '.__LINE__, $reflectionMethod->getFileName(), $reflectionMethod->getStartLine()], true), FILE_APPEND | LOCK_EX);

Этот код запишет в файл umitest путь до файла и номер строки в нем в которой находится функция ‘function_name’.

Документация по ReflectionFunction

Информация о классе

$reflectionClass = new ReflectionClass('class_name');
file_put_contents("umicheck", print_r([__FILE__.' '.__LINE__, $reflectionClass->getFileName(), $reflectionClass->getStartLine()], true), FILE_APPEND | LOCK_EX);

Этот код запишет в файл umitest путь до файла и номер строки в нем в которой находится класс ‘class_name’.

Документация по ReflectionClass

Информация о методе

$reflectionMethod = new ReflectionMethod('class_name', 'method_name');
file_put_contents("umicheck", print_r([__FILE__.' '.__LINE__, $reflectionMethod->getFileName(), $reflectionMethod->getStartLine()], true), FILE_APPEND | LOCK_EX);

Этот код запишет в файл umitest путь до файла и номер строки в нем в которой находится метод ‘method_name’ класса ‘class_name’.

Первым аргументом при создании ReflectionMethod можно передавать не только имя класса, но и его экземпляр, например:

namespace DebugNamespace;

$className = new class_name();
$reflectionMethod = new \ReflectionMethod($className, 'method_name');
file_put_contents("umicheck", print_r([__FILE__.' '.__LINE__, $reflectionMethod->getFileName(), $reflectionMethod->getStartLine()], true), FILE_APPEND | LOCK_EX);

Обратите внимание, что в данном случае в файле задан namespace ‘DebugNamespace’, поэтому при получении экземпляра класса \ReflectionMethod необходимо наличие косой черты в начале иначе произойдет ошибка:
Ошибка (Error): Class ‘DebugNamespace\ReflectionMethod’ not found

Документация по ReflectionMethod

Время выполнения скрипта

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

$start = microtime(true);
// тут код время выполнения которого необходимо посчитать
$stop = microtime(true) - $start;
file_put_contents("umitest", print_r([__FILE__.' '.__LINE__, $stop], true).PHP_EOL, FILE_APPEND | LOCK_EX);

Документация по microtime

1. Вывод ошибок. Иногда на UMI CMS при доработке сайта нужно вывести php ошибки, для этого есть config.ini и секция [debug], выставляем нужный нам IP в filter.ip (например filter.ip[] = «91.133.145.234») и работаем.

2. Отображение какой-то информации только администратору. В xslt можно отсеять по пользователю например с помощью такой записи: <xsl:variable name=»userType» select=»/result/user/@type» />

3. Отображение какой-то информации только определённому IP Иногда при доработке сайта нужно на уровне гостя проверить работу каких то функций или чего то ещё, но при этом не показывать эту информацию остальным, для этого можно создать функцию которая будет сравнивать текущий IP пользователя c указанным в filter.ip и работать через неё в xslt:

public function is_ini_current_ip($template){
    if(!$template) $template = "default";
    
    $this_ip = getServer('REMOTE_ADDR');
    $array_ip_debug = mainConfiguration::getInstance()->get('debug','filter.ip');
    
    list($is_ini_current_ip_true) = def_module::loadTemplates("content/is_ini_current_ip/" . $template, "is_ini_current_ip_true");
    
    $line = array();
    if($this_ip == $array_ip_debug[0]){
        $line['attribute:is_ini_current_ip'] = 1;
    } else{
        $line['attribute:is_ini_current_ip'] = 0;
        $is_ini_current_ip_true = '';
    }
    return def_module::parseTemplate($is_ini_current_ip_true, $line);
}

Обращаться к ней будем так:
<xsl:apply-templates select=»document(‘udata://custom/is_ini_current_ip/’)/udata» />, ищем атрибут is_ini_current_ip и по нему определяем совпадает IP в config.ini с нашим или нет.

Если работаем в TPL, то создаём в папке content папку is_ini_current_ip в ней создаём файл default.tpl в нём пишем:

<?php
$FORMS = Array();
$FORMS['is_ini_current_ip_true'] = <<<END
<div class="is_ip">текст</div>
END;
?>

По отладке custom методов будет также полезно

Актуально для всех версий системы.

Если у вас в файловом менеджере возникают ошибки: «Некорректный ответ сервера. Данные не формате JSON.» или «Некорректный ответ сервера. 15000», ниже можно найти причины возникновения ошибок и их устранение:

1. Файловый менеджер видит содержимое только двух папок, которые размещаются в корне сайта. Это ./images и ./files. Иногда в этих директориях оказываются папки и файлы с «мусорными» названиями, другими словами — в неверной кодировке ( например, rr°sЃrїsЂrѕrґr°r¶r°). Все файлы и папки с такими названиями необходимо удалить или переименовать, после чего файловый менеджер будет снова доступен.

2. Ещё одна причина — несоответствие версии PHP на сервере системным требованиями UMI.CMS.

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

3. Причиной ошибки может быть включённый режим отладки, для решения проблемы его необходимо отключить в секции debug в файле config.ini.

4. Файловый менеджер может быть недоступен из-за большого количества файлов в одной папке. Рекомендованное количество файлов в одной папке файлового менеджера не более 1000. Если этот лимит превышен, рекомендуем распределить файлы по директориям.

5. Проблема может возникнуть из-за добавления в файловый менеджер изображения, которое содержит несколько слоёв. Система не справляется с обработкой такого изображения, для решения проблемы в файле .htaccess корневой директории сайта можно увеличить размер памяти для выполнения скриптов:

php_value memory_limit 256M

Или можно перезалить изображение в формате .jpg

6. Сервер может не справляться с обработкой действия функции imageOptim (./classes/system/entities/umiFile/umiImageFile.php). Необходимо также увеличить количество выделяемой памяти для обработки скрипта.

7. Убедитесь, что переход в административную панель сайта осуществляется по домену, привязанному к лицензии.

Если при установке возникли проблемы

При установке любой программы иногда возникают вопросы. Большинство вопросов при установке CMS связано с настройками хостинга и системными требованиями. Обычно при возникновении ошибки система сообщает вам ссылку вида http://errors.umi-cms.ru/{номер}/, по которой доступно развёрнутое описание ошибки и способы её устранения.

Мы собрали для вас частые вопросы наших пользователей и их успешные решения:

1. Как быть если хостер не разрешает выполнение скриптов с правами доступа 777. Например, появляется сообщение: «File is writable by others. CGI must have a permission mask 0755» или Internal Server Error?
В таком случае нужно зайти на ваш сервер по FTP и поставить права доступа 755 на файл «index.php», а также на папку «JS» и все ее содержимое.
2. При установке системы возникает ошибка вида: Parse error: unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or ‘}’ .
Как правило, это означает, что Вы пытаетесь установить UMI.CMS на PHP4. Проверьте соответствие хостинга нашим системным требованиям.
3. После установки не загружаются страницы администратора или другие страницы сайта (сервер может выдавать ошибку, например, 404 error: File not found)
Скорее всего при установке не удалось произвести запись инструкций для mod_rewrite в файл .htaccess либо настройки хостинга не позволяют управлять переадресацией через этот файл. Необходимо дописать в файл .htaccess следующие директивы:

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} -f

RewriteRule ^(cache|xmldb|static|packages)/.*$ /500/ [L]

RewriteCond %{REQUEST_FILENAME} !-f

RewriteRule ^robots.txt$  /sbots.php?path=$1%{QUERY_STRING} [L]

RewriteRule ^config.ini$ / [L,R]

RewriteCond %{REQUEST_URI} !^styles

RewriteCond %{REQUEST_URI} !^css

RewriteCond %{REQUEST_URI} !.css

RewriteCond %{REQUEST_URI} !^js

RewriteCond %{REQUEST_URI} !.js

RewriteCond %{REQUEST_URI} !^images

RewriteCond %{REQUEST_URI} !^webstat

RewriteCond %{REQUEST_FILENAME} !-f

RewriteRule ^(.*).xml$ index.php?xmlMode=force&path=$1&%{QUERY_STRING} [L]

RewriteRule ^(udata|upage|uobject|ufs|usel|ulang|utype|umess|uhttp):?(//)?(.*)$ releaseStreams.php?scheme=$1&path=$3?%{QUERY_STRING} [L]

RewriteCond %{REQUEST_URI} !^styles

RewriteCond %{REQUEST_URI} !^css

RewriteCond %{REQUEST_URI} !.css

RewriteCond %{REQUEST_URI} !^js

RewriteCond %{REQUEST_URI} !.js

RewriteCond %{REQUEST_URI} !^images

RewriteCond %{REQUEST_URI} !(.ico|.ICO)$

RewriteCond %{REQUEST_URI} !(.jpg|.JPG)$

RewriteCond %{REQUEST_URI} !(.jpeg|.JPEG)$

RewriteCond %{REQUEST_URI} !(.png|.PNG)$

RewriteCond %{REQUEST_URI} !(.gif|.GIF)$

RewriteCond %{REQUEST_URI} !(.css|.CSS)$

RewriteCond %{REQUEST_URI} !(.js|.JS)$

RewriteCond %{REQUEST_FILENAME} !-f

RewriteRule ^(.*)$ index.php?path=$1&%{QUERY_STRING} [L]

RewriteCond %{REQUEST_URI} (.ico|.ICO)$

RewriteCond %{REQUEST_URI} (.jpg|.JPG)$

RewriteCond %{REQUEST_URI} (.jpeg|.JPEG)$

RewriteCond %{REQUEST_URI} (.png|.PNG)$

RewriteCond %{REQUEST_URI} (.gif|.GIF)$

RewriteCond %{REQUEST_URI} (.css|.CSS)$

RewriteCond %{REQUEST_URI} (.js|.JS)$

RewriteCond %{REQUEST_FILENAME} !-f

RewriteRule ^(.*)$ [R=404]

<IfModule mod_mime.c>

       AddType application/x-java-applet .class

   AddType text/x-component .htc

</IfModule>
 

Важно: Начиная с версии 2.8.4, блок инструкций в файле «.htaccess», необходимых для корректной работы UMI.CMS, обрамляется строками UMI_CMS_HTACCESS_BEGIN и UMI_CMS_HTACCESS_END. Маркеры предназначены для дальнейшего автообновления данного файла. Рекомендуется удалить старые инструкции UMI.CMS, находящиеся выше этого блока. Обратите внимание, что ваши кастомные инструкции не следует вносить в этот блок, поскольку при обновлении системы он будет полностью заменён на новый.

4. Можно ли установить UMI.CMS на сервер, если PHP 5 работает в режиме CGI?
Да, UMI.CMS можно запустить на серверах с PHP 5 в режиме CGI, но режим MOD предпочтительнее.
5.

В ходе использования вылетают сообщения вида:
XML Parsing Error: not well-formed Location: http://—-8/admin /Line Number 1, Column 3: —^ или: *»; $LANG_EXPORT[‘tempform_cname’] = »
В настройках PHP (файле PHP.INI) необходимо выставить значения переменных:

short_open_tag = On

asp_tags = Off

6. После установки вместо сайта появляется ошибка 500: Internal Server Error
Такое бывает, если хостинг-провайдер не разрешает выполнять скрипты с правами доступа 777. В таком случае нужно зайти на ваш сервер по FTP и поставить права доступа 755 на файлы «index.php» и «sbots.php», а также на папку «JS» и все ее содержимое.
7. После ввода ключа появляется ошибка 404: Not Found
Скорее всего, вы устанавливаете систему не в корневую директорию (обычно htdocs, www или public_html). В таком случае вам нужно создать поддомен, и уже в папку этого поддомена производить установку.
8. Как проверить какая версия PHP установлена на сервере?
a) Создайте в корневой папке файл phpinfo.php, в который поместите следующую строку: <?php phpinfo(); ?>.
b) Наберите в окне адреса вашего браузера: http://www.ваш-сайт/phpinfo.php

Если в самом верху страницы будет написано PHP 5.3.1 и выше, значит UMI.CMS будет работать (при соблюдении остальных системных требований).
Если же будет написано PHP 4, то система работать не будет. В таком случае, вам следует обратиться в техническую поддержку вашего хостинг-провайдера с вопросом о включении или установки PHP5.


UMI.CMS позиционируется как «система управления сайтами нового поколения». Официальный сайт приветствует нас радостным сообщением, что выдано более 86 000 лицензий, но стоит отметить что тут считаются все виды лицензий, не только платные, но и бесплатные. Так, например мне, потребовалось получить уже не один десяток бесплатных лицензий, а поскольку все лицензии привязаны к домену, то при переносе сайтов на рабочие домены лицензию нужно получать заново.

На главной странице официального сайта написано, что UMI.CMS используют более 10 000 сайтов и приведен список крупных сайтов, которые используют данную систему. Первый сайт в этом списке — сайт Сколково, который уже ушел от UMI.CMS на ASP (об этом на хабре уже писали). Вторым сайтом в этом списке идет сайт Связного, непонятно какой именно сайт имеется ввиду, но официальный сайт www.svyaznoy.ru работает на Битриксе, а не на UMI.CMS. Тоже самое и с сайтом правительства Москвы, хотя на официальном сайте UMI.CMS указано, что они работают именно на данной CMS.

Исходный код главной страницы официального сайта UMI.CMS радует нас такой вот версткой:

<h2 class="h2_style_main_page" style="margin-bottom: 0; display: inline-block; *width: 281px; margin-left: -21px; float: left;">Отзывы от владельцев сайтов</h2>
<a style="margin-bottom: 0; position: relative; bottom: 0; text-decoration: none; display: inline-block; float: right; right: 64px; top: 3px; font-weight: bold;" href="/product/reviews/">Все</a>
<h2 class="h2_style_main_page" style="margin-bottom: 0; display: inline-block; float: right; margin-right: 162px;">Отзывы от разработчиков сайтов</h2>
<div class="clear" style="height: 1px; margin: 0; padding: 0;"> </div>
</div>
<div class="clear" style="height: 1px; margin: 0; padding: 0;"> </div>
<div id="respones" class="respones" style="width: 920px !important; *height: 420px !important;">
<div id="responesContainer" style="width: 920px !important;">

Хорошо хоть, что сайт не сверстан таблицам, как, например, у официального сайта CMS DLE.

Сайт «Документация разработчика сайтов» и «Документация разработчика UMI.CMS» сделаны не на UMI.CMS, а на основе простых HTML страничках с использованием фреймов (кстати, на всех страницах не прописан заголовок документа в верстке).
Сайт вики также сделан не на UMI.CMS, а на open source движке MediaWiki.

Чтобы установить UMI.CMS себе на хостинг необходимо скачать файлик install.php, который сам скачает все файлы CMS из интернета. Соответственно не получится иметь у себя в резервных копий UMI разных версий, поскольку скачивается всегда последняя версия. Следует заметить, что UMI.CMS необходимо наличие на сервере расширения php xsl, которое установлено не на всех хостингах. Полная пробная версия UMI.CMS без установленных демо сайтов занимает 180 мб (4 985 файлов и 1 277 папок), база данных состоит из 80 таблиц размером 3,5 мб.

Проверка валидатором админской части UMI.CMS выдает 36 ошибок и 3 предупреждения (не объявлен тип документа, отсутствую теги alt у изображений, нестандартные атрибуты).

При редактировании материалов в UMI.CMS нет простой кнопки «Предпросмотр», зато есть три кнопки «Сохранить»:

Добавление изображений (известная проблема CMS) превращается в сущий ад, если количество изображений становится больше 20-50, поскольку после загрузки изображения его надо сначала найти (по имени или превьюшке), выбрать и только потом вставить. Т.е. нет простого режима — выбрал файл, загрузил, вставил.

Верстка

Одно из главных преимуществ по мнению создателей UMI.CMS — это режим редактирование edit-in-place, который позволяет редактировать сайт в визуальном режиме сразу на странице без захода в админку. Обратная сторона этой возможности — применение нестандартных атрибутов у html тегов (например: umi:element-id=«44» umi:region=«row» umi:field-name=«name» umi:empty=«Название раздела» umi:delete=«delete»), в результате чего получается не валидная верстка.

В UMI.CMS используются макросы, которые вызывают определенные действия (например показ элемента каталога, фотогалереи и т.д.). При вставки этих макросов в визуальный редактор (используется Tinymce) они оборачиваются тегами p. В результате при срабатывании большинства макросов внутри тега p появляются теги div, что приводит к не валидной верстке.

Помимо этого в шаблонах повсеместно используются устаревшие теги

<b> и <i>

вместо семантически более правильных

<strong> и <em>

а стили прописаны не в CSS, а в коде HTML. Tоже самое и с Javascript.

До версии 2.8.5 файлы тем к UMI.CMS располагались в разных папках:
css в /css
js в /js
tpl в /tpl/content, /tpl/news, /tpl/catalog и т.д.
xslt в /xsltTpls

Т.е. структура была не удобной и большое количество времени в создании темы занимало постоянные переходы между папками. Перенос шаблонов между проектами также усложнялся. К счастью в версии 2.8.5 разработчики предложили новый вариант — помещение всех шаблонов в папку templates.

SEO

У UMI.CMS есть сертификаты «Оптимальная для SEO» и «UMI.CMS отвечает требованиям SEO» www.umi-cms.ru/product/system/seo.

В настройках SEO можно указать префикс для тега Title, хотя целесообразнее указывать суффикс, а не префикс. Автоматическое генерировании тегов description и keywords также не поддерживается. По умолчанию нельзя создавать ЧПУ с использованием адресов как у модулей системы (например news, catalog и т.д.), в результате на сайте появляются страницы с именами news1, catalog 1 (хотя возможность включить поддержку таких ЧПУ есть, но в документации настоятельно рекомендуют этого не делать). ЧПУ в UMI.CMS генерируется автоматически, но по умолчанию в качестве разделителей между словами используется знак подчеркивания «_», хотя рекомендованный знак это знак дефиса «-» (возможность включения использования дефиса есть, но она спрятана очень глубоко и настраивается в config.ini).

В последние версии UMI.CMS встроена поддержка сервиса MegaIndex и в настройках модуля SEO можно указать свои данные от аккаунта к этому сервису. По умолчанию там стоят данные от UMI — логин и пароль, скрытый за звездочками. Этот пароль можно легко подсмотреть (например через расширение Web Developer для Firefox). В результате можно попасть в аккаунт UMI на сайте MegaIndex, где находится список сайтов, воспользовавшихся этой функцией у себя на сайте. В данных отчетов видны ключевые слова, позиции сайтов и другая информация.

Безопасность

UMI.CMS имеет сертификат «безопасное веб-приложение» www.umi-cms.ru/product/system/safe, хотя, например, при использовании tpl шаблонов (которые все еще очень популярны и используются на многих сайтах) при вставке html кода (в том числе и iframe) в поля «Название», «Поле H1», «Поле meta DESCRIPTIONS», «Поле TITLE», «Поле meta KEYWORDS» он никак не обрабатывается и отображается на странице как есть, т.е. очень легко можно сломать весь сайт, имея доступ только к редактированию материалов. Помимо этого явакод также никак не обрабатывается, т.е.

<script>alert('XSS');</script>

прекрасно работает.

При использовании xslt шаблона яваскрипты работают только если их вставить в текстовый редактор (чего тоже достаточно, чтобы натворить бед).

Обновления

Обновления больная тема многих CMS. В UMI.CMS, например, при обновлении старой версии на новую могут пропасть некоторые модули, которые были в раньше данной редакции системы, т.е. помимо платных обновлений (а обновления платные) потребуется доплатить за пропавший при обновлении модули.
Также были случаи, что в новой версии появляются новые ошибки, которых не было в прошлых версиях, и сама техподдержка рекомендует восстанавливать сайт из бекапа, сделанного перед обновлением.

Разработка

Файлы системы находят в папке classes, большинство функций и классов в них никак не документированы (комментарии есть только в 82 файлах из 786), т.е. глубоко разобраться в UMI.CMS без затраты большого количества времени не удастся.

Все свои дополнительные функции в UMI.CMS следует писать в файлах custom.php, которые следует размещать в системных папках. Со временем файл custom.php разрастается своими функциями, соответственно возникают проблемы с включением/отключением отдельных функций, переносом их между проектами.

Дополнительного функционала (платного или бесплатного) для UMI.CMS доступно очень мало. Из дополнительных платных модулей есть только модуль «GeoIP», часть проектов есть на UMI HUB, весь недостающий функционал придется писать самостоятельно.

Ошибки

Ошибки и глюки бывают разные, одна из самых забавных — меняешь теги b на strong — получаешь не работающие макросы после того места, где сменены теги.

Одна из последних ошибок, с которой столкнулся сегодня. Устанавливаем UMI.CMS или используем демо версию, ставим в админке использованием одного любого шаблона (xslt или tpl), потом заходим в редактирование этого шаблона и удаляем всю информацию о нем (название, адрес файла и т.д.). В результате получаем ошибку:
Неперехваченное исключение
Ошибка (coreException): Undefined templater

Несмотря на то, что был изменен шаблон для пользовательской части сайта, админка сайта также перестала работать.

Если вам хочется иметь данную систему в качестве «сердца вашего сайта», то напомню, что самая полная редакция UMI.CMS стоит 29 900 руб.

UPD Наибольшее обсуждение в комментариях вызвали вопросы безопасности, в частности отсутствие обработки вывода стандартных полей материалов в tpl шаблонах. Представитель UMI.CMS наотрез отказывается признавать это уязвимостью или потенциальной уязвимостью, называя это «недочетом». Также он недвусмысленно сваливает вину за подобные «недочеты» UMI.CMS на разработчиков сайта. Выводы каждый для себя сделает сам.

Recently, a layout field was set in umi. As a result, the menu bar on the left appeared. It’s amazing. Decided to find out about this library.

I am a person who likes to look at the underlying libraries. All the startup methods on the Internet are yarn or npm start to start the service. Then run the debugging in the browser. This debugging is the front end.

What I want to debug is the backend. Through tracking, we found that

yarn start calls umi dev

umi is a file softly connected to umi.js

#!/usr/bin/env node

const resolveCwd = require('resolve-cwd');

const { name, bin } = require('../package.json');
const localCLI = resolveCwd.silent(`${name}/${bin['umi']}`);
const b = !process.env.USE_GLOBAL_UMI && localCLI && localCLI !== __filename;
if (b) {
  const debug = require('@umijs/utils').createDebug('umi:cli');
  debug('Using local install of umi');
  console.log(`localCLI:${localCLI}`);
  require(localCLI);
} else {
  require('../lib/cli');
}

That is, the umi/lib/cli.js file that is actually executed, the key part of the code

_asyncToGenerator(function* () {
  try {
    switch (args._[0]) {
      case 'dev':
        const child = (0, _fork.default)({
          scriptPath: require.resolve('./forkedDev')
        }); // ref:
        // http://nodejs.cn/api/process/signal_events.html

        process.on('SIGINT', () => {
          child.kill('SIGINT');
        });
        process.on('SIGTERM', () => {
          child.kill('SIGTERM');
        });
        break;

That is the forkedDev file of fork

So there is a debug configuration file for vscode. launch.json

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "type": "node",
            "request": "launch",
            "name": "Launch Program",
            "skipFiles": [
                "<node_internals>/**"
            ],
            "program": "${workspaceFolder}/node_modules/umi/lib/forkedDev.js",
            "args": [
                "dev"
            ],
            "cwd": "${workspaceFolder}",
            "outFiles": [
                "${workspaceFolder}/**/*.js"
            ]
        }
    ]
}

  You can debug the umi server.

Понравилась статья? Поделить с друзьями:
  • Ultra iso ошибка 121
  • Unable to resolve host ошибка
  • Ubisoft connect ошибка при проверке файлов
  • Ultraiso пишет устройство занято ошибка 5
  • Unable to rename delphi32 to delphi32 dro ошибка