xPDO::log¶
Регистрирует сообщение с подробной информацией о том, где и когда произошло событие.
Синтаксис¶
API Docs: https://api.modx.com/revolution/2.2/db_core_xpdo_xpdo.class.html#xPDO::log()
$xpdo->log($level, $msg, $target= '', $def= '', $file= '', $line= '');
-
$level
— (целое число) Уровень детализации зарегистрированного сообщения. Смотрите константы многословия ниже -
$msg
— (строка) Сообщение для входа. -
$target
— (mixed) Цель регистрации. Если это строка, это должно бытьFILE
,HTML
илиECHO
. Если массив, см. Примеры ниже. -
$def
— (строка) Имя определяющей структуры (например, класса), помогающей определить источник событий журнала. -
$file
— (строка) Имя файла, в котором произошло событие журнала. Обычно вы используете константу__FILE__
. -
$line
— (строка) Номер строки, помогающей определить источник события. Обычно вы используете константу__FILE__
void log (integer $level, string $msg, [string $target = ''], [string $def = ''], [string $file = ''], [string $line = ''])
Уровни журнала¶
Во многих случаях вы можете использовать эквивалентные константы MODX для уровней журнала.
То, что печатается, контролируется настройкой системы log_level
. Вы можете переопределить это во время выполнения, используя метод setLogLevel
.
Примеры¶
Просто¶
Простое сообщение журнала, записывает в файл журнала по умолчанию (например, core/cache/logs/error.log
):
$xpdo->log(xPDO::LOG_LEVEL_ERROR, '[Mobile Detect] An error occurred.');
В журналах это будет выглядеть так:
[2013-09-15 14:21:25] (ERROR @ /index.php) [Mobile Detect] An error occurred.
Укажите Сниппет¶
Поскольку приложение MODX в конечном итоге запускается через файл index.php, полезно добавить дополнительную информацию:
$xpdo->log(xPDO::LOG_LEVEL_ERROR, 'An error occurred.', '', 'MySnippet');
[2013-09-15 14:22:48] (ERROR in MySnippet @ /index.php) An error occurred
Указать файл и строку¶
Помните, что в конечном итоге все сниппеты и плагины MODX запускаются из кэшированных файлов, поэтому в качестве исходного файла будет указан кэшированный файл.
$xpdo->log(xPDO::LOG_LEVEL_ERROR, 'This is my error message...', '', 'MySnippet', __FILE__, __LINE__);
[2013-09-15 14:48:02] (ERROR in MySnippet @ /path/to/core/cache/includes/elements/modsnippet/28.include.cache.php : 7) This is my error message...
Пользовательский файл журнала¶
Вы можете отправить ошибки в пункт назначения, отличный от журнала ошибок MODX по умолчанию. Для этого вы должны передать массив в аргумент $target
. Вы должны подробно указать FILE
в качестве цели, в противном случае сообщение будет возвращено на страницу.
$xpdo->log(xPDO::LOG_LEVEL_ERROR, 'Error for my custom log file', array(
'target' => 'FILE',
'options' => array(
'filename' => 'custom.log'
)
));
По умолчанию путь к файлам журнала — это core/cache/logs/
, поэтому в этом примере мы находим наше сообщение журнала внутри файла custom.log
:
[2013-09-15 15:01:07] (ERROR @ /index.php) Error for my custom log file
При желании вы также можете указать путь через аргумент filepath
.
Поскольку это немного многословно, вы можете найти более понятным определение цели регистрации, а затем ссылаться на массив:
$log_target = array(
'target'=>'FILE',
'options' => array(
'filename'=>'my_custom.log'
)
);
$xpdo->log(xPDO::LOG_LEVEL_ERROR, 'My Error...',$log_target);
$xpdo->log(xPDO::LOG_LEVEL_ERROR, 'Some other error...',$log_target);
Отладка¶
Вы можете изменить уровень зарегистрированного сообщения, регулируя первый параметр. Например. для записи отладочного сообщения:
$xpdo->log(xPDO::LOG_LEVEL_DEBUG,'This is a debugging statement.');
Пользовательское использование в сниппетах¶
Это может быть очень удобно для увеличения подробности регистрации для отдельного сниппета или плагина. Для этого используйте функцию setLogLevel()
. Вы можете использовать это, чтобы переопределить глобальное значение системного параметра log_level:
// Вызови свой сниппет так: [[mySnippet? &log_level=`4`]]
// Переопределить глобальное значение log_level
$log_level = $modx->getOption('log_level', $scriptProperties, $modx->getOption('log_level'));
$modx->setLogLevel($log_level);
Константы многословия¶
xPDO константа | MODX константа | Значение |
---|---|---|
xPDO::LOG_LEVEL_FATAL |
MODX_LOG_LEVEL_FATAL |
0 |
xPDO::LOG_LEVEL_ERROR |
MODX_LOG_LEVEL_ERROR |
1 |
xPDO::LOG_LEVEL_WARN |
MODX_LOG_LEVEL_WARN |
2 |
xPDO::LOG_LEVEL_INFO |
MODX_LOG_LEVEL_INFO |
3 |
xPDO::LOG_LEVEL_DEBUG |
MODX_LOG_LEVEL_DEBUG |
4 |
Смотрите также¶
- Системная настройка log_level
- Системная настройка log_target
- xPDO
xPDO::log¶
Регистрирует сообщение с подробной информацией о том, где и когда произошло событие.
Синтаксис¶
API Docs: https://api.modx.com/revolution/2.2/db_core_xpdo_xpdo.class.html#xPDO::log()
$xpdo->log($level, $msg, $target= '', $def= '', $file= '', $line= '');
-
$level
— (целое число) Уровень детализации зарегистрированного сообщения. Смотрите константы многословия ниже -
$msg
— (строка) Сообщение для входа. -
$target
— (mixed) Цель регистрации. Если это строка, это должно бытьFILE
,HTML
илиECHO
. Если массив, см. Примеры ниже. -
$def
— (строка) Имя определяющей структуры (например, класса), помогающей определить источник событий журнала. -
$file
— (строка) Имя файла, в котором произошло событие журнала. Обычно вы используете константу__FILE__
. -
$line
— (строка) Номер строки, помогающей определить источник события. Обычно вы используете константу__FILE__
void log (integer $level, string $msg, [string $target = ''], [string $def = ''], [string $file = ''], [string $line = ''])
Уровни журнала¶
Во многих случаях вы можете использовать эквивалентные константы MODX для уровней журнала.
То, что печатается, контролируется настройкой системы log_level
. Вы можете переопределить это во время выполнения, используя метод setLogLevel
.
Примеры¶
Просто¶
Простое сообщение журнала, записывает в файл журнала по умолчанию (например, core/cache/logs/error.log
):
$xpdo->log(xPDO::LOG_LEVEL_ERROR, '[Mobile Detect] An error occurred.');
В журналах это будет выглядеть так:
[2013-09-15 14:21:25] (ERROR @ /index.php) [Mobile Detect] An error occurred.
Укажите Сниппет¶
Поскольку приложение MODX в конечном итоге запускается через файл index.php, полезно добавить дополнительную информацию:
$xpdo->log(xPDO::LOG_LEVEL_ERROR, 'An error occurred.', '', 'MySnippet');
[2013-09-15 14:22:48] (ERROR in MySnippet @ /index.php) An error occurred
Указать файл и строку¶
Помните, что в конечном итоге все сниппеты и плагины MODX запускаются из кэшированных файлов, поэтому в качестве исходного файла будет указан кэшированный файл.
$xpdo->log(xPDO::LOG_LEVEL_ERROR, 'This is my error message...', '', 'MySnippet', __FILE__, __LINE__);
[2013-09-15 14:48:02] (ERROR in MySnippet @ /path/to/core/cache/includes/elements/modsnippet/28.include.cache.php : 7) This is my error message...
Пользовательский файл журнала¶
Вы можете отправить ошибки в пункт назначения, отличный от журнала ошибок MODX по умолчанию. Для этого вы должны передать массив в аргумент $target
. Вы должны подробно указать FILE
в качестве цели, в противном случае сообщение будет возвращено на страницу.
$xpdo->log(xPDO::LOG_LEVEL_ERROR, 'Error for my custom log file', array(
'target' => 'FILE',
'options' => array(
'filename' => 'custom.log'
)
));
По умолчанию путь к файлам журнала — это core/cache/logs/
, поэтому в этом примере мы находим наше сообщение журнала внутри файла custom.log
:
[2013-09-15 15:01:07] (ERROR @ /index.php) Error for my custom log file
При желании вы также можете указать путь через аргумент filepath
.
Поскольку это немного многословно, вы можете найти более понятным определение цели регистрации, а затем ссылаться на массив:
$log_target = array(
'target'=>'FILE',
'options' => array(
'filename'=>'my_custom.log'
)
);
$xpdo->log(xPDO::LOG_LEVEL_ERROR, 'My Error...',$log_target);
$xpdo->log(xPDO::LOG_LEVEL_ERROR, 'Some other error...',$log_target);
Отладка¶
Вы можете изменить уровень зарегистрированного сообщения, регулируя первый параметр. Например. для записи отладочного сообщения:
$xpdo->log(xPDO::LOG_LEVEL_DEBUG,'This is a debugging statement.');
Пользовательское использование в сниппетах¶
Это может быть очень удобно для увеличения подробности регистрации для отдельного сниппета или плагина. Для этого используйте функцию setLogLevel()
. Вы можете использовать это, чтобы переопределить глобальное значение системного параметра log_level:
// Вызови свой сниппет так: [[mySnippet? &log_level=`4`]]
// Переопределить глобальное значение log_level
$log_level = $modx->getOption('log_level', $scriptProperties, $modx->getOption('log_level'));
$modx->setLogLevel($log_level);
Константы многословия¶
xPDO константа | MODX константа | Значение |
---|---|---|
xPDO::LOG_LEVEL_FATAL |
MODX_LOG_LEVEL_FATAL |
0 |
xPDO::LOG_LEVEL_ERROR |
MODX_LOG_LEVEL_ERROR |
1 |
xPDO::LOG_LEVEL_WARN |
MODX_LOG_LEVEL_WARN |
2 |
xPDO::LOG_LEVEL_INFO |
MODX_LOG_LEVEL_INFO |
3 |
xPDO::LOG_LEVEL_DEBUG |
MODX_LOG_LEVEL_DEBUG |
4 |
Смотрите также¶
- Системная настройка log_level
- Системная настройка log_target
- xPDO
FormIt 3.0 представляет обновление методов шифрования, используемых для шифрования отправленных форм. До версии 3.0 использовался mcrypt
, который в версии 3.0 заменен на openssl
из-за того, что mcrypt
устарел с версии PHP 7.2. FormIt 3.0 поставляется со страницей миграции, доступной из Менеджера.
Начиная с FormIt 2.2.9, ко всем полям автоматически применяется html_entities
. Чтобы разрешить сохранение HTML-тегов, вам нужно будет использовать валидатор allowSpecialChars
для каждого поля, который должен сохранять необработанные html-теги.
Начиная с FormIt 1.1.4, ко всем полям будут автоматически применяться stripTags
. Чтобы разрешить сохранение HTML-тегов, вам нужно будет использовать валидатор allowTags
для каждого поля, определяя, какие теги разрешены.
Валидацию можно просто выполнить, добавив поля для проверки в свойство &validate
при вызове Сниппета. Например, чтобы сделать поле имени пользователя обязательным, вы можете сделать так:
[[!FormIt? &validate=`username:required`]]
Валидаторы также могут быть «связаны» или выполняться последовательно. В следующем примере сначала проверяется, передано ли значение поля text
, а затем удаляются все теги из сообщения:
[[!FormIt? &validate=`text:required:stripTags`
Несколько полей и валидаторов разделяются запятыми:
[[!FormIt?
&validate=`date:required:isDate=^%m/%d/%Y^,
name:required:testFormItValidator,
email:email:required,
colors:required,
subject:required,
username:required:islowercase,
message:stripTags,
numbers:required`
]]
FormIt допускает разделение валидаторов на несколько строк, если вам так будет удобнее.
Примечание: не используйте обратные кавычки внутри проверочного вызова (это сломает синтаксическую разметку). Вместо этого используйте символы
^`:
[[!FormIt? &validate=`date:required:isDate=^%m/%d/%Y^`]]
Это исправит вызов и заставит валидацию работать правильно.
Общее сообщение об ошибке для валидаторов, полезное, если ошибки не отображаются, но проверка не проходит, используется со следующим плейсхолдером:
[[!+fi.validation_error_message]]
Он будет содержать сообщение об ошибке валидации, которое можно установить с помощью свойства &validationErrorMessage
и используя [[+errors]]
в значении свойства, которое будет заменено всеми ошибками поля.
Также существует «Да/нет» плейсхолдер:
[[!+fi.validation_error]]
Встроенные валидаторы¶
Имя | Функция | Параметр | Пример |
---|---|---|---|
blank | Поле пустое? | nospam:blank | |
required | Поле не пустое? | username:required | |
password_confirm | Соответствует ли поле значению другого поля? | Имя поля пароля | password2:password_confirm=^password^ |
Это корректный адрес электронной почты? | emailaddr:email | ||
minLength | Длина поля не менее X символов? | Минимальная длина | password:minLength=^6^ |
maxLength | Длина поля не превышает X символов? | Максимальная длина | password:maxLength=^12^ |
minValue | Значение поля не меньше X? | Минимальное значение | donation:minValue=^1^ |
maxValue | Значение поля не больше X? | Максимальное значение | cost:maxValue=^1200^ |
contains | Содержит ли поле строку X? | Строка X. | title:contains=^Hello^ |
strip | Удалите определенную строку из поля. | Строка, которую нужно удалить | message:strip=^badword^ |
stripTags | Удалите все HTML-теги из поля. Обратите внимание, что по умолчанию это включено. | Необязательный список разрешенных тегов | message:stripTags |
allowTags | Не удаляйте HTML-теги в поле. Обратите внимание, что по умолчанию это отключено. | content:allowTags | |
isNumber | Поле имеет числовое значение? | cost:isNumber | |
allowSpecialChars | Не заменяйте специальные символы HTML их сущностями. По умолчанию это отключено. | message:allowSpecialChars | |
isDate | Поле — это дата? | Необязательный формат для форматирования даты | startDate:isDate=^%Y-%m-%d^ |
regexp | Соответствует ли поле ожидаемому формату? | Действительное регулярное выражение для сравнения | secretPin:regexp=^/[0-9]{4}/^ |
Пользовательские валидаторы¶
Валидаторами также могут быть любые пользовательские сниппеты. Вы можете сделать это, просто указав имя сниппета в свойстве customValidators
:
[[!FormIt? &customValidators=`isBigEnough`]]
Начиная с FormIt 1.2.0, все такие произвольные валидаторы должны быть указаны в свойстве customValidators
, иначе они не будут запускаться.
И кроме того в качестве валидатора для свойства &validate
:
[[!FormIt? &validate=`cost:isBigEnough`]]
Ну и сам сниппет, «isBigEnough»:
<?php
$value = (float)$value;
$success = $value > 1000;
if (!$success) {
// Обратите внимание, как мы можем добавить здесь ошибку в поле.
$validator->addError($key,'Маловато будет!');
}
return $success;
Валидатор отправит в сниппет следующие свойства в массиве $scriptProperties
:
Имя | Функция |
---|---|
key | Ключ проверяемого поля. |
value | Значение поля, которое было передано в массиве $_POST. |
param | Если для валидатора был указан параметр, то он будет также передан. |
type | Имя валидатора(сниппета) |
validator | Ссылка на экземпляр класса fiValidator . |
Пользовательские сообщения об ошибках¶
Начиная с FormIt 2.0-pl, вы можете переопределить сообщения об ошибках, отображаемые валидаторами, отправив соответствующее свойство:
Валидатор | Свойство |
---|---|
blank | vTextBlank |
required | vTextRequired |
password_confirm | vTextPasswordConfirm |
vTextEmailInvalid, vTextEmailInvalidDomain | |
minLength | vTextMinLength |
maxLength | vTextMaxLength |
minValue | vTextMinValue |
maxValue | vTextMaxValue |
contains | vTextContains |
isNumber | vTextIsNumber |
isDate | vTextIsDate |
regexp | vTextRegexp |
Вы также можете указать сообщение для каждого поля, поставив префикс ключа поля в свойстве. Например, чтобы переопределить обязательное («required») сообщение валидатора, просто передайте в свой вызов FormIt:
[[!FormIt?
&vTextRequired=`Пожалуйста, укажите значение для этого поля.`
&subject.vTextRequired=`Пожалуйста введите тему.`
]]
Это будет использовать &subject.vTextRequired
для поля темы, а затем вернуться к сообщению &vTextRequired
для всех других полей.
Посмотрите также¶
-
Хуки
- FormIt.Hooks.email
- FormIt.Hooks.FormItAutoResponder
- FormIt.Hooks.math
- FormIt.Hooks.recaptcha
- FormIt.Hooks.redirect
- FormIt.Hooks.spam
- FormIt.Hooks.FormItSaveForm
- Валидаторы
- FormItRetriever
-
Руководства и примеры
- Пользовательский произвольный хук
- Пример простой формы
- Обработка выпадающих списков, чекбоксов и радио кнопок
- Использование пустого поля для защиты от спама
- FormItCountryOptions
- FormItStateOptions
- $_POST
Open COllective
Support the team building MODX with a monthly donation.
The budget raised through OpenCollective is transparent, including payouts, and any contributor can apply to be paid for their work on MODX.
Backers
Budget
$307 per month—let’s make that $500!
Learn more
Подскажите пожалуйста как можно получать сообщения об ошибках в консоли(есть такой пакет, который позволяет выполнять php-скрипты). например есть код:
error_reporting(E_ALL | E_STRICT);
ini_set('display_errors', 1);
if(!$parent_resources = $modx->getCollection('modResource', array(
'parent' => 3,
'published' => 1
))){ return; };
$output = '';
foreach ($parent_resources as $parent_resource) {
$parent_resource_id = $parent_resource->get('id');
$output .= $parent_resource_id;
$child_resources = $modx->getCollection('modResource', array(
'parent' => $parent_resource_id,
'published' => 1
));
};
в нём ошибка потому что в результате на экран ничего не выводится. но мне хотелось бы получить хоть какие-то сообщения
Как видите, я в начале скрипта включил error_reporting и ini_set. Так же в .htaccess я прописал:
php_flag display_errors On
php_value error_reporting "E_ALL & ~E_NOTICE"
Но это не помогает
ps:
Пожалуйста не подсказывайте как исправить приведённый скрипт. Вопрос не в том как исправить, вопрос в том как в принципе получать сообщения об ошибках
На чтение 5 мин Просмотров 5.3к. Опубликовано 25.07.2020
Обновлено 15.01.2023
Содержание
- Создание документов и категорий
- Создание страницы 404 ошибки в modx
- Создание страниц ошибок 401 и 503
Сегодня мы создадим основные сервисные страницы MODX Revo, а именно — для ошибок 404, 403, 503
Создание документов и категорий
Щелкаем правой кнопкой мыши (ПКМ) по Website (находиться в дереве Ресурсы) и выбираем Создать документ (либо просто щелкаем на +)
На открывшейся странице прописываем заголовок system, выбираем пустой шаблон, убираем галку с опубликован, ставим галку напротив — не показывать в меню и переходим во вкладку настроек.
В настройках ставим галки на контейнер и очистить кэш (остальные снимаем) и сохраняем.
Это мы создали пустой не опубликованный контейнер, а в него уже поместим все наши сервисные страницы.
Создание страницы 404 ошибки в modx
Щелкаем ПКМ по нашему пустому контейнеру и выбираем создать документ.
Заполняем:
- Заголовок — error404;
- Шаблон — (пустой шаблон);
- Псевдоним — error404;
- Опубликован;
- Не показывать в меню.
На вкладке Настройки: снимаем все галки, после чего на против пункта «Заморозить URL» ставим галку и устанавливаем значение: error404 (при условии что вы убрали расширение html и настроили ЧПУ, в противном случае прописываем error404.html) и сохраняем.
В поле содержимое помещаем следующий код (взят из бесплатного шаблона и немного переработан):
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="robots" content="noindex" />
<meta name="description" content="Ошибка 404 - скорее всего страница была удалена или у нее сменился URL адрес!">
<title>Ошибка 404 - данной страницы не существует</title>
<!-- Bootstrap CDN CSS -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" />
<!-- Custom CSS -->
<style>
@import url(https://fonts.googleapis.com/css?family=Rubik:300,400,500,700,900);
body{font-family:Rubik,sans-serif;margin:0;overflow-x:hidden;font-weight:300}
#wrapper{width:100%}error-box{height:100%;position:fixed;top:20%;width:100%}
.error-box .footer{width:100%;left:0;right:0}
.error-body{padding-top:5%}
.error-body h1{font-size:210px;font-weight:900;line-height:210px}
.text-center{text-align:center}
.text-danger{color:#f33155}
.text-muted{color:#8d9ea7}
.m-b-40{margin-bottom:40px!important}
.m-t-30{margin-top:30px!important}
.m-b-30{margin-bottom:30px!important}
@media only screen and (max-width: 520px){.error-body h1{font-size:110px;font-weight:700;line-height:110px}}
</style>
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
<script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
<![endif]-->
</head>
<body>
<!-- Preloader -->
<section id="wrapper" class="container-fluid">
<div class="error-box">
<div class="error-body text-center">
<h1 class="text-danger">404</h1>
<h3>Страница не существует !</h3>
<p class="text-muted m-t-30 m-b-30">Скорее всего страница была удалена или у нее сменился URL адрес!</p>
<a href="/" class="btn btn-danger btn-rounded m-b-40">Перейти на главную страницу</a>
</div>
</div>
</section>
</body>
</html>
и снова сохраняем.
Далее идем в Системные настройки — сайт — и указываем ID созданной страницы с 404 ошибкой (Страница ошибки 404 «Документ не найден» — error_page = id страницы).
Теперь можно проверить как она отрабатывает. Для этого введем несуществующий адрес в браузере (например: site.ru/adresa-net), перейдем по нему — должна открыться страница с нашей ошибкой.
Создание страниц ошибок 401 и 503
Для создания страниц для ошибок 401 и 503 просто сделайте копию страницы 404, введите новый заголовок (так сделать дважды).
После чего открываем эти копии системных страниц и правим в их коде следующие значения.
Для 401 ошибки:
<meta name="description" content="Ошибка 401 - доступ к данной странице запрещен">
<title>Ошибка 401 - доступ запрещен</title>
и в контенте:
<h1 class="text-danger">401</h1>
<h3>Доступ запрещен !</h3>
<p class="text-muted m-t-30 m-b-30">У вас недостаточно прав для просмотра данной страницы.</p>
После чего переходим во вкладку «настройки» замораживаем URL (error401) и сохраняем.
Для 503 ошибки:
<meta name="description" content="Ошибка 503 - сайт временно недоступен, зайдите немного позже">
<title>Ошибка 503 - сайт недоступен</title>
<h1 class="text-danger">503</h1>
<h3>сайт недоступен !</h3>
<p class="text-muted m-t-30 m-b-30">Сайт временно недоступен, зайдите немного позже!</p>
и из кода можно удалить строки:
<meta name="robots" content="noindex" />
<a href="/" class="btn btn-danger btn-rounded m-b-40">Перейти на главную страницу</a>
Не забудьте заморозить URL и сохранить изменения.
После этого возвращаемся в системные настройки (вкладка сайт) и указываем id созданных страниц ошибок.
- Страница ошибки 401 «Доступ запрещен» — unauthorized_page = id созданной страницы;
- Страница ошибки 503 «Сайт недоступен» — site_unavailable_page = id созданной страницы.
Далее начнем заниматься непосредственно разработкой сайта: разберем что такое MODX шаблоны, где их достать (скачать, заказать, купить), выберем шаблон, затем перенесем html шаблон, разобьем его на чанки и т.д.
Отредактировано: 20 Февраля 2019
FormIt — компонент который обрабатывает поля формы после нажатия кнопки «Отправить». Не стоит расценивать его как компонент которым можно создавать форму, это лишь помощник в настройке уже подготовленной формы, избавляющий от написания своих PHP скриптов.
У FormIt есть Хуки (Hooks) — скрипты, которые выполняются во время обработки. Хуки могут быть линейными, т.е. выполняются по очереди, а могут быть последовательными, т.е. если выполнено условие первого хука, то начнется выполнение следующего хука.
Существуют также Прехуки (Pre-Hooks), скрипты, которые выполняются до загрузки формы. К примеру скрипт который устанавливает значение по умолчанию для полей форм в старых браузерах, которые не поддерживают соответствующие html плейсхолдеры.
Можно создавать собственные хуки и прехуки указывая их в параметрах preHook и hook FormIt. Стоит учитывать, что они будут выполняться в порядке указанном при вызове, поэтому, если один из скриптов выдал ошибку, сломаются и последующие.
Код полностью
[<!--code-->[!FormIt?
&hooks=`email`
&emailFrom=`donotreply[@]yourdomain.com`
&emailTpl=`mailtpl.feedback`
&emailTo=`donotreply@yourdomain.com, admin@yourdomain.com`
&emailSubject=`Письмо с сайта yourdomain.com`
&successMessage=`Сообщение отправлено`
&validate=`name:required,
email:email:required,
comment:required,
antispam:blank`
]]
<form action="" method="post">
<label for="name">Name:</label>
<input type="text" name="name" id="name" value="[<!--code-->[!+fi.name]]">
<label for="email">Email</label>
<input type="text" name="email" id="email" value="[<!--code-->[!+fi.email]]">
<label for="comment">Comment</label>
<textarea name="comment" id="comment" cols="30" rows="10" value="[<!--code-->[!+fi.comment]]"></textarea>
<input type="text" name="antispam" id="antispam" value="">
<input type="submit" value="Submit">
</form>
[[!+fi.validation_error_message:!empty=`
<div class="alert">
<h3>Пожалуйста, исправьте следующие ошибки:</h3>
<ul>
[[!+fi.error.name:!empty=`<li><a href="blog/web/back-end/modx/formit/#name">Поле «Имя» не заполнено</a></li>`]]
[[!+fi.error.email:!empty=`<li><a href="blog/web/back-end/modx/formit/#email">Поле «Email» не заполнено</a></li>`]]
[[!+fi.error.comment:!empty=`<li><a href="blog/web/back-end/modx/formit/#comment">Поле «Комментарий» не заполнено</a></li>`]]
</ul>
</div>`]]
- В нужном месте шаблона, или на отдельной странице создадим html код формы
-
<form action="" method="post"> <label for="name">Имя:</label> <input type="text" name="name" id="name" > <label for="email">Email</label> <input type="text" name="email" id="email" > <label for="comment">Комментарий</label> <textarea name="comment" id="comment" cols="30" rows="10"></textarea> <input type="submit" value="Submit"> </form>
Добавим некешируемые плейсхолдеры FormIt ([[!+fi.код_поля]])
<form action="" method="post"> <label for="name">Name:</label> <input type="text" name="name" id="name" value="[[!+fi.name]]"> <label for="email">Email</label> <input type="text" name="email" id="email" value="[[!+fi.email]]"> <label for="comment">Comment</label> <textarea name="comment" id="comment" cols="30" rows="10" value="[[!+fi.comment]]"></textarea> <input type="submit" value="Submit"> </form>
(префикс fi при желании можно изменить свойством placeholderPrefix при вызове сниппета)
-
Создаем чанк письма, которое будет приходить на почту после отправки результатов формы. К примеру mailtpl.feedback:
/* В качестве плейсхолдеров указывается код поля, который был записан в форме после префикса fi*/ <p>Имя: [[+name]]</p> <p>Email: [[+email]]</p> <p>Комментарий: [[+comment]]</p>
-
Вызываем сниппет FormIt
[[!FormIt? &hooks=`email` &emailFrom=`donotreply@yourdomain.com` &emailTpl=`mailtpl.feedback` &emailTo=`donotreply@yourdomain.com, admin@yourdomain.com` &emailSubject=`Письмо с сайта yourdomain.com` &successMessage=`Сообщение отправлено` ]]
-
К коду выше добавляем параметры для проверки заполненности обязательных полей и другие параметры проверки:
&validate=`name:required, email:email:required, comment:required` /* К полю email добавлен параметр :email, он проверяет правильность написания адреса электронной почты */
-
Добавим оповещение пользователя, о неправильно заполненном поле. В специально отведенное для сообщения об ошибке место (к примеру в тег <label>) вставляем код:
[[!+fi.error.placeholder_code:notempty=`<span>Обязательное поле не заполнено</span>`]]
Вместо оповещения об ошибках рядом с полями, можно создать специальный блок, в котором будут указаны все ошибки разом. Для этого надо обернуть код выше в специальный плейсхолдер, примерно так:
[[!+fi.validation_error_message:!empty=` <div class="alert"> <h3>Пожалуйста, исправьте следующие ошибки:</h3> <ul> [[!+fi.error.name:!empty=`<li><a href="[[*uri]]#name">Поле «Имя» не заполнено</a></li>`]] [[!+fi.error.email:!empty=`<li><a href="[[*uri]]#email">Поле «Email» не заполнено</a></li>`]] [[!+fi.error.comment:!empty=`<li><a href="[[*uri]]#comment">Поле «Комментарий» не заполнено</a></li>`]] </ul> </div>`]]
Анти-спам
- Капча (captcha) — распространенный метод. Некоторые виды этой защиты боты научились распознавать и обходить. Самой эффективной на данный момент является reCAPTCHA от Google. Минусы — дополнительное поле, которое надо заполнить пользователю.
Для FormIt есть специальные хуки с капчами math и reCaptcha (смотрите в резделе Хуки); - Скрытые поля ввода
/* Скрытое поле. Не эффективный метод, т.к. боты научились не заполнять скрытые поля */ <input type="hidden" name="antispam" value=""> /* Обычное поле, скрытое за счет css */ <input type="text" id="antispam" value=""> /* Такие поля можно добавлять с использованием JS, это усилит защиту, т.к. большинство ботов не использует js */ /* При использовании скрытых полей в FormIT надо добавить проверку*/ [[!FormIt? &validate=`antispam:blank`]]
- Для FormIt есть специальный хук; проверяющий указанный email в спам-листе. Данный метод помогает далеко не всегда.
[[!FormIt? &hooks=`spam` &spamCheckIp=`true`]]
-
Метод от Ильи Уткина, добавить замаскированное поле, которое будет отвечать на спам успешной отправкой, благодаря чему спам-бот и его хозяин сочтут что сообщение отправлено:
/* Создаём сниппет checkSpam */
<?php
if ($_POST['surname']) { // проверяем наше поле на пустоту
echo $AjaxForm->success('Ваше сообщение отправлено');
die();
} else {
return true;
}
/* Добавляем в форму поле, по которому будем фильтровать */
<input type="text" name="surname" class="form-input" placeholder="Фамилия">
/* Маскируем поле */
input[name="surname"] {
display: block;
width: 2px;
height: 3px;
margin-bottom: -3px;
opacity: 0.01;
}
/* Добавляем сниппет checkSpam в качестве хука перед email */
`hooks` => `checkSpam,email...`
AjaxForm
Сниппет ajaxForm представляет из себя надстройку над FormIt реализующую Ajax вызов. Вызов сниппета
[[!AjaxForm?
&snippet=`FormIt`
&form=`tpl.AjaxForm.example`
&emailTpl=`mailtpl.feedback`
&hooks=`email`
&emailSubject=`Письмо с сайта yourdomain.com`
&emailFrom=`donotreply[@]yourdomain.com`
&emailTo=`donotreply@yourdomain.com, admin@yourdomain.com`
&validate=`name:required,
email:email:required,
comment:required,
antispam:blank`
&successMessage=`Сообщение отправлено`
]]
Подробнее на странице об AjaxForm
Параметры FormIt
По умолчанию | Описание | |
hooks | Скрипты, которые запускаются после того как нажимается кнопка отправки. Сюда также можно записать имя сниппета, который должен воспроизводиться после отправки формы. | |
preHooks | Скрипты, которые запускаются после загрузки формы. Сюда также можно записать имя сниппета, который должен воспроизводиться после отправки формы. | |
submitVar |
Если параметр установлен, не будет начинаться обработка формы, если эта переменная POST не передается. Может применяться при конфликте нескольких форм на странице.
|
|
validate | Разделенный запятыми, список полей, для проверки. Формат записи name:validator (например: username:required, email:email:required). Валидаторов у поля может быть несколько. | |
validationErrorMessage | A form validation error occurred. Please check the values you have entered. | Текст сообщения об ошибке. Может содержать , если надо отобразить список всех ошибок. |
validationErrorBulkTpl | [[+error]] | Шаблон сообщения об ошибке валидации |
errTpl | [[+error]] | Оболочка html для сообщений об ошибках. Примечание: не чанк, только HTML. |
customValidators | Разделенный запятыми, список имен пользовательских валидаторов (для параметра validate), которые будут использоваться в этой форме. Они должны быть явно указаны здесь, иначе не будут запущены. | |
clearFieldsOnSuccess | 1 | Если true, очистит поля после успешной отправки формы, которая не будет перенаправлена. |
store | 0 | Если true, сохранит данные в кэше для извлечения, с использованием компонента FormItRetriever. |
storeTime | 300 (5 минут) | Если для параметра store установлено значение true, этот параметр указывает количество секунд для хранения данных из представления формы. |
storeLocation | cache | При использовании хранилища это определяет, где форма сохраняется после отправки. Возможными параметрами являются «cache» и «session» |
placeholderPrefix |
fi. |
Префикс для плейсхолдеров полей формы, которые должен обрабатывать FormIt. Разделитель в виде точки ‘.’ обязателен. |
successMessage | Если не используется переадресация, отобразите это сообщение об успешном завершении после успешной отправки. | |
successMessagePlaceholder | fi.successMessage | Имя плейсхолдера, для размещения сообщения об успешной отправке. |
redirectTo | ID страницы, с сообщением отображающимся после отправки формы. Является частью хука redirect, работает только с его подключением. | |
allowFiles | true | Разрешены ли файлы для публикации. Отправленные файлы хранятся во временном каталоге, для предотвращения потери файлов в многоэтапных формах. |
Хуки (hooks)
Хуки — специальные скрипты, которые запускаются во время обработки FormIt. Хуки могут быть связаны, к примеру, второй хук начнет выполняться только если первый отработан успешно.
Список предустановленных хуков
Email — отправляет результат формы на почту (активирует функцию mail()).
Доступные настройки:
- emailTpl — обязательный параметр. Шаблон письма который должен приходить на почту.
- emailSubject — тема письма
- emailUseFieldForSubject — если установлен параметр 1, и поле emailSubject не установлено, то в качестве темы письма будет использоваться поле.
- emailTo — разделенный запятыми список почтовых адресов, на который отправлять письма.
- emailToName — необязательный параметр. Разделенный запятыми список пар Имя/Адрес, на который отправлять письма.
- emailFrom — необязательный параметр. Адрес электронной почты который будет указан в качестве отправителя. Если не установлен, будет указан первый найденный адрес по следующему списку: поле email из формы, параметр emailsender из настроек системы. Стоит учесть, что в качестве отправителя следует указывать существующий адрес электронной почты, во избежании проблем с попаданием писем в спам, из-за нарушений правил SPF / DMARC.
- emailFromName — необязательный параметр. Имя которое должно быть указано в поле From.
- emailHtml — необязательный параметр. Разрешена ли отправка письма в html формате. По умолчанию — 1, разрешена.
- emailConvertNewlines — необязательный параметр. Если установлено 1, все символы новой строки преобразуются в теги br.
- emailReplyTo — электронная почта для отправки ответа. Если не задано, отправляется на адрес указанные в поле email, если таковой отсутствует, используется параметр emailFrom.
- emailReplyToName — необязательный параметр. Имя для параметра emailReplyTo.
- emailCC — разделенный запятыми список адресов для отправки копий сообщения (CC).
- emailCCName — необязательный параметр. Разделенный запятыми список пар Имя/Адрес, для отправки копий сообщения (СС)
- emailBCC — разделенный запятыми список адресов для отправки скрытых копий сообщения (BCC).
- emailBCCName — необязательный параметр. Разделенный запятыми список пар Имя/Адрес, для отправки скрытых копий сообщения (BСС)
- emailMultiWrapper — обертка для отправленных значений параметров типа чекбокс / мультивыбор. По умолчанию отправляются только значения.
- emailMultiSeparator — разделитель для отправленных значений параметров типа чекбокс / мультивыбор. По умолчанию новая строка.
FormItAutoResponder — отправляет автоответ автору сообщения.
- fiarTpl — обязательный. Шаблон для сообщения автоответчика;
- fiarSubject — тема письма;
- fiarToField — имя поля формы для использования в качестве электронной почты подателя. По умолчанию «электронная почта».
- fiarFrom — необязательный. Если установлено, укажите адрес From: для электронной почты. По умолчанию используется настройка системы электронной почты.
- fiarFromName — необязательный. Значение From: для электронной почты.
- fiarSender — необязательный. Заголовок отправителя электронной почты. По умолчанию используется настройка системы электронной почты.
- fiarHtml — необязательный. Должно ли электронное письмо должно быть в формате HTML. Значение по умолчанию равно true.
- fiarReplyTo — обязательный. Адрес электронной почты для ответа.
- fiarReplyToName — необязательный. Имя поля Reply-to.
- fiarCC — список электронных писем для отправки через cc.
- fiarCCName — необязательный. Список имен, разделенных запятыми, для сопряжения с значениями fiarCC.
- fiarBCC — список писем с разделителями-запятыми для отправки через ОЦК.
- fiarBCCName — необязательный. Список имен, разделенных запятыми, для сопряжения с значениями fiarBCC.
- fiarMultiWrapper — обнуляет значения, представленные флажками / мультивыбираемыми с этим значением. По умолчанию используется только значение.
- fiarMultiSeparator — отделяет флажки / мультивыборы с этим значением. По умолчанию используется новая строка. ( » П»)
- fiarFiles — необязательный. Список файлов, разделенных запятыми, для добавления в качестве вложения в электронное письмо. Вы не можете использовать URL-адрес здесь, а только локальный путь к файловой системе.
- fiarRequired — необязательный. Если установлено значение false, крюк FormItAutoResponder не останавливается, когда поле, определенное в ‘fiarToField’, остается пустым. Значение по умолчанию равно true.
math — добавляет математическую капчу к форме.
Подобная капча выглядит как вопрос формата: 12 + 23?
Для ее интеграции надо добавить math к параметру &hooks и валидацию к соответствующему полю
&hooks=`math,email`
&validate=`math:required`
В нужное место формы вставить вызов
<label>[[!+fi.op1]] [[!+fi.operator]] [[!+fi.op2]]?</label>
[[!+fi.error.math]]
<input type="text" name="math" value="[[!+fi.math]]" />
<input type="hidden" name="operator" value="[[!+fi.operator]]" />
Дополнительные параметры хука math
По умолчанию | ||
mathMinRange | Минимальное допустимое число | 10 |
mathMaxRange | Максимальное допустимое число | 100 |
mathField | Имя поля с ответом | math |
mathOp1Field | Устаревший параметр. Имя поля для первого числа в уравнении. | op1 |
mathOp2Field | Устаревший параметр. Имя поля для второго числа в уравнении. | op2 |
mathOperatorField | Имя поля определяющего оператор уравнения | operator |
Кастомизация хука math
<label>[[!+fi.op1]] [[!+fi.operator:is=`-`:then=`minus`:else=`plus`]] [[!+fi.op2]]?</label>
Подобная запись выведет уравнение формата «23 plus 41?» или «50 minus 12?» вместо операторов -/+. Подобная запись немного усложнит задачу ботам.
recaptcha — добавляет рекапчу к форме.
Хук recaptcha предназначен для вставки в форму устаревшей версии рекапчи от гугл. На момент написания статьи лучше установить и использовать хук recaptchav2.
Для использования recaptcha надо добавить подключение в параметр hooks
&hooks=`recaptcha,email`
и вставить следующие теги в нужное место формы
[[+formit.recaptcha_html]]
[[!+fi.error.recaptcha]]
затем прописать ключи google в системные настройки:
- formit.recaptcha_private_key — секретный ключ;
- formit.recaptcha_public_key — ключ сайта;
- formit.recaptcha_use_ssl — использовать ssl для запросов рекапчи. По умолчанию false.
Дополнительные настройки хука recapture
- recaptchaJs — обьект JSON для вставки в параметры рекапчи, который будет генерировать соответствующий виджет. По умолчанию {}.
- recaptchaTheme — шаблон рекапчи который должен использоваться. По умолчанию не указан.
Ключи можно получить на странице google recapture
redirect — перенаправляет пользователя на специальный ресурс, при завершении отправки.
- RedirectTo — обязательный параметр. Идентификатор ресурса на который надо перенаправить пользователя после успешной отправки формы.
- redirectParams — объект параметров JSON для передачи URL-адреса переадресации.
Пример:
[[!FormIt?
&hooks=`redirect`
&redirectTo=`212`
&redirectParams=`{"user":"123","success":"1"}`
]]
<!--
С redirectParam формат полученного адреса будет таким
test.html?user=123&success=1
-->
При переадресации, значения полей формы не будут доступны на конечном ресурсе. Если необходимо передать значения полей формы, можно использовать свойство &store компонента FormItRetriever.
spam — проверяет все поля формы, указанные в свойстве spamEmailFields, на фильтр спама через StopForumSpam. Если пользователь помечен как спамер, форма покажет сообщение об ошибке.
- spamEmailFields — необязательный. Список полей электронной почты с разделителями-запятыми для проверки. По умолчанию «электронная почта».
- spamCheckIp — если true, будет также проверяться IP-адрес пользователя. По умолчанию false.
[[!FormIt? &hooks=`spam`]]
Не рекомендуется использовать IP для проверки спама, поскольку спамеры могут легко изменять IP-адреса, а проверка IP-адресов может выдать ложное срабатывание.
FormItSaveForm — хук для сохранения результатов формы внутри панели менеджера.
Список расположен в Приложения (Extras) => FormIt. Доступные настройки:
- formName: имя формы. По умолчанию «form-{resourceid}».
- formEncrypt: если установлено ’1′ (true) — отправленная форма будет зашифрована перед сохранением в базе.
- formFields: разделенный запятыми список полей, которые будут сохранены. По умолчанию сохраняются все поля, включая кнопку отправки.
- fieldNames: изменение имени полей внутри панели менеджера. Если поле называется email2 вы можете изменить имя на «второй email». Пример: &fieldnames=`fieldname==newfieldname, anotherone==anothernewname`.
Дополнительные хуки
Помимо предустановленных хуков можно писать свои или скачивать их с репозиториев. Для написания своего хука можно использовать сниппет, указав в параметре hooks его название.
Список полезных хуков которые можно скачать:
recaptchav2 — хук для интеграции с рекапчей от гугл второй и третьей версии.
Для интеграции надо добавить подключение в параметр hooks:
&hooks=`recaptchav2,email`
// для 3 версии
&hooks=`recaptchav3,email`
и вставить следующие теги в нужное место формы:
[[!recaptchav2_render]]
[[!+fi.error.recaptchav2_error]]
// для 3 версии
[[!recaptchav3_render]]
[[!+fi.error.recaptchav3_error]]
затем прописать ключи google в системные настройки:
- recaptchav2.secret_key — секретный ключ;
- recaptchav2.site_key — ключ сайта.
для рекапси 3 версии используйте соответствующие настройки:
- recaptchav3.secret_key — секретный ключ;
- recaptchav3.site_key — ключ сайта.
Ключи можно получить на странице google recapture
Селекты, чекбоксы, переключатели
(selects, checkboxes, radio buttons)
Для множественных полей формы, таких как селекты, чекбоксы и переключатели, стандартный способ подключения не сработает. Для таких случаев в FormIt предусмотрены сниппеты FormItIsSelected и FormItIsChecked.
Оформление select поля
<select name="color">
<option value="blue" [[!+fi.color:FormItIsSelected=`blue`]] >Синий</option>
<option value="red" [[!+fi.color:FormItIsSelected=`red`]] >Красный</option>
<option value="green" [[!+fi.color:FormItIsSelected=`green`]] >Зеленый</option>
<!-- Способ заполнения с использованием phx фильтров -->
<option value="yellow" [[!+fi.color:is=`yellow`:then=`selected`]]>Желтый</option>
</select>
Оформление checkbox и radio поля
<label>Color: [[!+fi.error.color]]</label>
<input type="checkbox" name="color[]" value="blue" [[!+fi.color:FormItIsChecked=`blue`]] > Синий
<input type="checkbox" name="color[]" value="red" [[!+fi.color:FormItIsChecked=`red`]] > Красный
<input type="checkbox" name="color[]" value="green" [[!+fi.color:FormItIsChecked=`green`]] > Зеленый
У html чекбоксов есть особенность — если значение отсутствует, параметр не передаётся, это так же влияет на проверку заполненности поля. Для того, чтобы отправить пустое значение, необходимо добавить скрытое input поле
[[!FormIt? &validate=`color:required`]]
...
<label>Color: [[!+fi.error.color]]</label>
<input type="hidden" name="color[]" value="" />
<input type="checkbox" name="color[]" value="blue" [[!+fi.color:FormItIsChecked=`blue`]] > Синий
<input type="checkbox" name="color[]" value="red" [[!+fi.color:FormItIsChecked=`red`]] > Красный
<input type="checkbox" name="color[]" value="green" [[!+fi.color:FormItIsChecked=`green`]] > Зеленый
Таким образом можно проверить, выбран ли хотябы 1 флажок.
Если надо установить поле с массивом значений (группу флажков, с одинаковым именем, или множественный селект) в преХук, надо сперва раскодировать данные из json формата
$hook->setValue('цвет',json_encode(array('синий','красный','зеленый')));
Настройка целей для счетчиков
Самый простой способ отслеживать успешную отправку формы, без изменения кода компонента — добавить перехватчик в сообщение об успешной отправке:
&successMessage=`Ваше письмо успешно отправлено <script>yaCounterXXXXXXXX.reachGoal('form');</script>`
Возможные ошибки
— Если FormIt говорит об успешной отправке формы, но письмо на почту не приходит, стоит проверить
- правильную настройку mx записи на сервере;
- в вызове formIt указан ли адрес исходящей почты: &emailFrom=`mail@site.ru`
— Если FormIt или AjaxForm выдают 500 ошибку при отправке, причин может быть несколько, и все они связаны с проблемами на сервере. К примеру, если на сервере используется php ниже 5.4 (не рекомендуется для новых версий modx), то проблему можно решить установкой в файле .htaccess следующего параметра:
php_flag register_globals off
Если же на сервере стоит версия php 5.4 и выше, то искать проблему стоит в логах Modx (core/cache/logs/error.log) и сервера. Если записей в логах нет, попробуйте переустановить компоненты FormIt и AjaxForm, и посмотрите, не вылезают ли ошибки во время установки. Если компонент ругается на ошибки, проставьте соответствующим папкам на сервере права доступа 700. И попробуйте переустановить снова (кнопка reinstall может не помочь, иногда эффективнее воспользоваться uninstall). Подробнее об ошибке 500.
— Если в списке отправленных форм, на странице FormIt в админ панели, вместо нормального списка отображается массив символов — вероятно вы раньше времени перешли на php 7.1, спуститесь на 7.0, либо ждите фикса компонента.
Документация FormIt
Документация AjaxForm
Cниппет для отправки любых форм через ajax. По умолчанию рассчитан на работу с FormIt, но можно использовать и собственный сниппет.
- Регистрирует нужные скрипты на фронтенде: jQuery.Form и jQuery.jGrowl.
- Сохраняет в сессию
$scriptProperties
при вызове сниппета. - Выводит указанную форму, прописывая класс ajax_form и скрытый input для получения
$scriptProperties
. - Вешает обработчик на форму, чтобы она отправлялась через ajax.
- При отправке запускает указанный сниппет для обработки и возвращает ответ от него.
- Выводит сообщение об успехе, или ошибки, если есть.
Параметры сниппета
Имя | По умолчанию | Плейсхолдеры |
---|---|---|
&form | tpl.AjaxForm.example | Образец чанка с формой, которую нужно обработать. |
&snippet | FormIt | Сниппет для обработки формы. |
&frontend_css | [[+assetsUrl]]css/default.css | Стили оформления формы и полей с ошибками |
&frontend_js | [[+assetsUrl]]js/default.js | Javascript для отправки формы через ajax |
&actionUrl | [[+assetsUrl]]action.php | Адрес коннектора, на который отправляется форма |
Всё, что вы указываете AjaxForm, будет передано в вызываемый сниппет.
Обработка своим сниппетом
Вы можете использовать собственный сниппет, вместо FormIt, который будет делать что угодно (хоть создавать страницы на сайте).
Единственное требование — он обязательно должен возвращать JSON массив с ключами:
- status — 1 или 0, то есть успех или ошибка.
- message — сообщение о работе сниппета, выводится если status = 0.
- data — массив для полей с ошибками, в котором ключами является имя поля, а значением — сообщение об ошибке.
Для удобства работы в параметры сниппета передаётся переменная $AjaxForm
с классом компонента, чтобы вы могли вызывать из него методы error и success при выдаче ответа.
Простейший пример своего сниппета:
<?php
if (empty($_POST['name'])) {
return $AjaxForm->error('Ошибки в форме', array(
'name' => 'Вы не заполнили имя'
));
}
else {
return $AjaxForm->success('Форма прошла проверку');
}
Вызываем так:
[[!AjaxForm?
&snippet=`MySnippet`
&form=`tpl.AjaxForm.example`
]]
Этот сниппет ничего не делает, просто возвращает результат проверки имени.
Валидация формы
Сервер может вернуть ошибку отправки формы и массив полей, не прошедших проверку.
Этим полям автоматически будет добавлен CSS класс error
, который убирается при последующей отправке.
Так же вы можете запретить отправку формы, используя javascript переменную afValidated — если она объявлена и равна false
, то форма не будет отправлена.
Обратите внимание, что все проверки на javascript можно обойти, так что эту переменную стоит использовать только для удобства пользователей, а не для реальной проверки данных.
<script type="text/javascript">
$(document).on('submit', '.ajax_form', function() {
// Здесь любой код для проверки формы при отправке
// Я просто печатаю её в консоли бразуреа
console.log(this);
// Результатом работы будет выставление глобальной переменной
afValidated = false; // Или true, если валидация пройдена
});
</script>
[[!AjaxForm]]
Событие af_complete
При получении ответа от сервера вызывается событие af_complete, которое вы можете использовать для обновления содержимого страницы или другой операции javascript.
Вам просто нужно указать функцию, в которую будет передано событие javascript и объект с ответом от сервера. Обратите внимание, что внутри этого объекта есть и отправляющая форма.
$(document).on('af_complete', function(event, response) {
var form = response.form;
// Если у формы определённый id
if (form.attr('id') == 'my_form_3') {
// Скрываем её!
form.hide();
}
// Иначе печатаем в консоль весь ответ
else {
console.log(response)
}
});
redirect на другую страницу сайта, после успешной отправки формы?
Добавляем id к форме, если его нет и затем в js файл прописать вот такие строки
$(document).on('af_complete', function(event, response) {
var form = response.form;
if (form.attr('id') == 'значение id формы') {
window.location.href = "[[~id страницы]]"
}
});
Можно просто обернуть в <script>
выше приведенный код</script>
и подключить в шаблон с формой ближе к закрытию body.
Всплывающие сообщения
По умолчанию AjaxForm выводит сообщения об успешной отправке формы или о наличии ошибок.
Вы можете самостоятельно вызывать их для своих целей:
AjaxForm.Message.success('Зеленый popup');
AjaxForm.Message.error('Красный popup', 1);
AjaxForm.Message.info('Черный popup');
Вторым параметром можно указать «прилипающий» popup — его нужно будет закрыть вручную, бывает полезно для показа серьёзных ошибок.
То есть, просто вызвав сниппет на странице, вы получаете подключенный jQuery.jGrowl и можете показывать приятные всплывающие уведомления на javascript.
Примеры
Отправка email сообщения при помощи FormIt с требованием некоторых полей:
[[!AjaxForm?
&snippet=`FormIt`
&form=`tpl.AjaxForm.example`
&hooks=`email`
&emailSubject=`Тестовое сообщение`
&emailTo=`info@domain.com`
&validate=`name:required,email:required,message:required`
&validationErrorMessage=`В форме содержатся ошибки!`
&successMessage=`Сообщение успешно отправлено`
]]
Отладка
При возникновении любых проблем, в первую очередь проверяйте, отправляется ли форма без AjaxForm.
Помните, что AjaxForm — сниппет-обёртка, он не отправляет письма и не проводит проверку формы. Это делает ваш сниппет или FormIt.
Так же не забывайте заглядывать в консоль браузера на предмет ошибок javascript.
Если сервер выдаёт ошибку 500 при отправке, проверьте параметр register_globals у вашего PHP — он должен быть отключен.
Оглавление
Общие проблемы
Прежде всего, убедитесь:
- Что у вас отключен eAccelerator во время установки. eAccelerator может вызвать проблемы при обработке сложных процессов в момент установки системы.
- Вы ознакомились и прочитали все требования, которые приведёны здесь.
- Вы используете версию PHP не ниже 5.5 и ознакомились с главой Требования к серверу.
- Вы используете MySQL версии выше 4.1.20. Но не используете MySQL 5.0.51 (включая 5.0.51a).
- Полностью очистите каталог
/core/cache/
перед началом установки. Иногда неправильные права доступа к файлам могут вызвать проблемы. - Очистите кеш вашего браузера и файлы cookie.
Сообщения об ошибках PDO
Если вы получаете сообщения об ошибках, связанных с PDO, во время установки, прежде чем переходить к конкретным сообщениям об ошибках, как показано ниже, убедитесь, что ваша конфигурация PDO настроена правильно. Вы можете это сделать, запустив следующий код (замените user / password / database / host ващими данными):
/* Connect to an ODBC database using driver invocation */
$dsn = 'mysql:dbname=testdb;host=localhost';
$user = 'dbuser';
$password = 'dbpass';
try {
$dbh = new PDO($dsn, $user, $password);
} catch (PDOException $e) {
echo 'Connection failed: ' . $e->getMessage();
}
Если это не удается, значит, ваша установка PDO настроена неправильно.
Распространенные ошибки
Вот некоторые распространенные проблемы, которые могут возникнуть во время установки, и способы их решения:
Я получаю пустой белый экран вместо страницы настроек
Вы, вероятно, скопировали config.inc.tpl в config.inc.php, что неверно. Сделайте файл config.inc.php пустым, доступным для записи файлом.
Если вы переименовали config.inc.tpl в config.inc.php, переименуйте его обратно в config.inc.tpl и создайте пустой файл с именем config.inc.php, который доступен для записи.
Я нажал установить и получил пустой белый экран
Убедитесь, что в вашей настройке ‘memory_limit’ в php.ini установлено значение не менее 32МБ. Для более медленных серверов вам может потребоваться увеличение до 64МБ.
Не удается подключиться к базе данных, на странице настроек базы данных
Одной из распространенных причин этой проблемы является то, что вы используете нестандартный порт для MySQL. Попробуйте подставить этот синтаксис в поле имени хоста (заменив данные хостом и портом вашего сервера mysql):
my.database.com;port=3307
Warning: PDO::__construct() [pdo.—construct]: [2002] Argument invalid (trying to connect via unix://) OR «Checking database: Could not connect to the mysql server.»
Это означает, что ваш сокет MySQL неправильно настроен. Обычно это можно исправить, добавив (или обновив) ваш php.ini:
mysql.default_socket=/path/to/my/mysql.sock
mysqli.default_socket=/path/to/my/mysql.sock
pdo_mysql.default_socket=/path/to/my/mysql.sock
Страница входа продолжает перенаправлять меня обратно на экран входа без показа ошибки
Это может произойти при установке старой бета-версии Revolution. Чтобы это исправить, удалите следующие 3 системных параметра из таблицы БД [prefix]_system_settings (где prefix — ваш префикс таблицы):
- session_name
- session_cookie_path
- session_cookie_domain
Затем удалите файл core/cache/config.cache.php.
Если, конечно, вы не изменили их специально для какой-то своей цели.
Иногда что-то не загружается, страница вылетает и т.д. (eAccelerator)
Вы используете eAccelerator? В некоторых конфигурациях сервера это может вызвать проблемы. Возможно, вам придется отключить его. Вы можете сделать это через ваш php.ini:
eaccelerator.enable = 0;
eaccelerator.optimizer = 0;
eaccelerator.debug = 0;
или в вашем .htaccess в корневом каталоге MODx, если ваш сервер поддерживает серверные директивы php_flag:
php_flag eaccelerator.enable 0
php_flag eaccelerator.optimizer 0
php_flag eaccelerator.debug 0
Необъяснимые неполадки в Панели управления (не eAccelerator)
В некоторых системах, особенно с общим хостингом, могут возникнуть проблемы с Системными настройками compress_js и / или compress_css. Перейдите в Система -> Системные настройки и наберите ‘compress’ (без кавычек) в поле поиска в правом верхнем углу. Выключите эти две настройки, затем выйдите из Панели управления, удалите все файлы в каталоге core/cache, очистите кеш браузера и файлы cookie и снова войдите в систему.
Если Панель управления испорчена настолько, что вы не можете изменить настройки, см. примечание ниже об изменении двух системных настроек в таблице modx_system_settings в базе данных с помощью PhpMyAdmin.
Ресурсы / Элементы / Файлы не отображаются в дереве
Кроме того, неполный вывод страницы может быть вызван данными, сохранёнными в кэше вашего браузера. Старые версии javascript и других файлов, используемые на стороне клиента, могут привести к неправильному отображению дерева ресурсов / элементов / файлов. Это можно проверить, зайдя в Панель управления с помощью браузера, ранее не использовавшегося при этом.
Простое решение: очистить кеш вашего браузера и снова войти в Панель управления.
Более полное решение:
- Выберите раздел меню Управление, далее Очистить Кэш
- В разделе Управление, выберите Перезагрузить права доступа и затем Завершить все сеансы
- Эти действия приведут к общему сбросу и выходу из Панели управления
- Последний шаг очистите кеш браузера
Я не могу войти в Панель управления после установки
Если вас каждый раз перенаправляет обратно на экран входа в систему, попробуйте добавить эту настройку в файле .htaccess в корне вашей установки MODx:
php_value session.auto_start 0
Не удалось подключиться к серверу базы данных. Проверьте свойства подключения и попробуйте снова. Доступ запрещён…
Часто на виртуальном хостинге, если вы создаете имя пользователя для вашей базы данных с подчеркиванием (_), это вызывает проблемы. Убедитесь, что имя пользователя вашей базы данных не содержит подчеркивания, и повторите попытку.
Панель управления отображается в виде обычного текста, отдельные элементы отсутствуют или выводятся ошибки JavaScript 400
Если Панель управления MODx не загружается должным образом из-за 400 ошибок при попытке загрузить код JavaScript, сжатый Google Minify, это, вероятно, связано с неправильной настройкой вашего сервера. Если это невозможно исправить на стороне сервера, вы можете вручную отключить сжатие JS и CSS следующим образом:
- Зайдите в БД с помощью PhpMyAdmin и найдите таблицу [table_prefix]_system_settings (table_prefix обычно modx)
- Найдите строки с ключами «compress_js» и «compress_css», установите для них значение 0 и сохраните.
- Очистите каталог /core/cache/.
- Очистите кеш браузера и cookies.
- Войдите в Панель управления.
Это позволит вам использовать Панель управления без сжатия JS и CSS.
Отсутствуют элементы Панели управления, неопределенные языковые строки или выводятся ошибки JavaScript в консоли
Убедитесь, что для папки connectors/ установлены права доступа 0755
Время работы: 0,1280 s
Время запросов: 0,1280 s
Количество запросов: 24
Источник: cache
Проверка конфигурации
Обычно при первом заходе в панель управления MODX можно увидеть целый ряд сообщений об ошибках и предупреждений. По большей части это напоминание о вещах, которые вы еще не смогли сделать. Ниже список возможных сообщений и советы, как с ними бороться. MODX отображает сообщение об ошибке только в случае ее наличия, поэтому обращайте внимание только на отображаемые у вас сообщения.
«Конфигурационный файл открыт для записи»
Конфигурационный файл MODX находится здесь :
/core/config/config.inc.php
Он содержит ваше имя пользователя, пароль и другую важную информацию о вашем сайте, поэтому важно, чтобы для сайта, расположенного на удаленном сервере, он имел атрибут только для чтения, чтобы его нельзя было изменить.
Используя программу FTP-клиент измените атрибуты конфигурационного файла на 444. Очистите кэш MODX, (верхнее меню Сайт-> Обновить сайт) и перегрузите страницу в браузере. Если сообщение еще присутствует, перепроверьте, что атрибуты файла действительно изменены.
![]() |
В случае, если вам потребуется вновь запустить Setup для завершения вашей установки или обновления MODX в будущем, вам нужно будет вновь сделать конфигурационный файл доступным для записи. |
«register_globals is on»
Когда register_globals включено (on), PHP позволяет внедрять в ваши скрипты различные виды переменных, включая переменные из любой формы на сайте. В сочетании с фактом, что PHP не требует инициализации переменных, это означает, что весь ваш сайт становится менее безопасным. К сожалению многие хостинги до сих пор имеют register_globals включенным по умолчанию.
Если вам повезло и у вас хороший хостинг, register_globals будет выключено по умолчанию и вы не увидите этого сообщения. Если нет, имеется несколько методов выключения register_globals, лучшим из которых является обращение в службу поддержки хостинга с просьбой отключить register_globals.
«Установочный файл все еще существует»
Данное сообщение напоминает вам, что вы не удалили папку setup/. Это представляет собой большую опасность. Немедленно удалите эту папку. Имеется ряд автоматических хакеров-ботов, выполняющих поиск установок MODX и пытающихся запустить Setup, поэтому важно удалить эту папку до того, как они вас найдут.
One of the common tools available for troubleshooting issues for a website is the error log. It is important to understand that Modx shows an error log for problems or flags that are set by developers of Modx. Additionally, you can see an error log generated by PHP when there are problems with PHP code within the Modx CMS. This log is not the same as the one generated by Modx. The following article describes both types of error logs and demonstrates how you can view both types of logs within the Modx Administrator Dashboard interface.
Accessing the Error Logs within Modx
Understanding the Different Error Logs
Modx-generated Error log | PHP Error log | |
---|---|---|
File locaton | The actual log file is a text file named error.log and can be found in the /core/cache/logs/ directory of your Modx installation. | This is a generic error log created due to PHP errors such as syntax errors. The error_log file can be found in multiple directories as it will be written in each directory where the error occurs. |
Viewable | This log is viewable through the Modx Reports>Error Log menu option. | This log is viewable through the Modx Resource Tree as a text file. |
Generated when | Errors in this log can be used to intentionally flag an event in Modx code for troubleshooting or development purposes. | This is an automatically generated error log whose sole purpose is to log PHP errors. |
Viewing the Modx Error Log
- Login to the Modx Administrator Dashboard.
- Hover over the menu bar where it says REPORTS. When the drop-down menu appears, click on ERROR LOG.
- When the ERROR LOG screen appears, it will show the most recent errors, if there are any to report. The screen will appear as follows:
The screenshot above shows no present errors. If Modx errors do occur, it will display the errors written into the ERROR.LOG file. For example, a Modx error may be shown when you improperly set a Modx tag. If you click on the CLEAR button, the ERROR.LOG will be reset to a blank text file.
Viewing a PHP error log in the Modx Resource Tree
- Login to the Modx Administrator Dashboard.
- Click on the FILES tab of the Resource Tree on the left side of the screen.
- In order to view the ERROR_LOG file you will need to select the file by clicking on it in the files of the resource tree at left. If a PHP error has occurred, then an ERROR_LOG file willl be written and saved in the corresponding directory where the PHP script generating the error is located. This file can sometimes be seen in multiple locations as it is written into the location where the corresponding error occurs. The example below shows the ERROR_LOG file in the tree-view of the files and folders at left. In order to DELETE this log, you would need to right-click on the file in the resource tree and then select DELETE FILE from the drop-down menu that appears.
- Click on CLOSE in the top right-hand corner in order to close the log file.
The use of the Modx ERROR.LOG and the ERROR_LOG (generated by PHP) can be invaluable when trying to determine a problem within the Modx application. If you have any problems with any portion of Modx, you can create a snippet to write a dummy error in the ERROR.LOG file to help determine the location of a problem in your code. Or, you can use the recorded errors in the PHP ERROR_LOG to troubleshoot the issue and provide valuable information for your developers.
Для получения отладочных сообщений в журнале отчетов MODX следует использовать $modx->log(). Объявление функции имеет вид:
public function log($level, $msg, $target = '', $def = '', $file = '', $line = '')
Первый параметр
Первый параметр указывает уровень/тип сообщения — ошибка, предупреждение, информационное сообщение или отладочная информация. Для каждого уровня константы:
- MODX_LOG_LEVEL_FATAL = 0
- MODX_LOG_LEVEL_ERROR = 1
- MODX_LOG_LEVEL_WARN = 2
- MODX_LOG_LEVEL_INFO = 3
- MODX_LOG_LEVEL_DEBUG = 4
Второй параметр
Второй параметр содержит информацию, которая будет записана в журнал ошибок.
Обычно ограничиваются указанием только первых двух параметров
Третий параметр
В него передается «назначение», куда будет выводится информация. Возможные значения:
- FILE — сообщение сохраняется в файл core/cache/logs/error.log (по умочанию)
- ECHO — информация выводится на экран
- HTML — информация выводится на экран обёрнутая в тег <pre>
Четвертый параметр
В нём можно передать название скрипта или метода класса, в котором вызван метод log(). Особенно это удобно, когда таких вызовов несколько.
- «MySnippet» — выведется именно эта строка
- __METHOD__ — выведется название метода, где производится логирование
Пятый и шестой параметры
Они отвечают за вывод информации о скрипте и номере строки. Если их не указать, то они определятся автоматически как:
- __FILE__
- __LINE__
Системные настройки
Есть две системные настройки, влияющие на работу метода log() — это log_target и log_level. По умолчанию они имеют значение FILE и 1, соответственно.
Первая (log_target) указывает куда выводить информацию (см. «третий параметр»).
Вторая (log_level) указывает текущий уровень логирования MODX. Возможные значения:
- 0 — для фатальных сообщений (fatal)
- 1 — для ошибок (error)
- 2 — для предупреждений (warn)
- 3 — для информационных сообщений (info)
- 4 — для отладочных сообщений (debug)
Эта настройка ограничивает логирование сообщений указанным уровнем. Таким образом log() с уровнем выше, чем в настройке, будет отклонён. Например, если в настройке указано log_level = 1 (т.е. логируются только ошибки), то все вызовы метода log() с уровнем WARN, INFO и DEBUG в журнал записаны не будут. Как правило, при отладке на эти уровни не обращают внимание и используют текущий уровень логирования для ошибок.
Примеры
$modx->log(MODX_LOG_LEVEL_ERROR, 'Сообщение');
// или так
$modx->log(modX::LOG_LEVEL_ERROR, 'Сообщение');
// или ещё короче
$modx->log(1, 'Сообщение');
В режиме разработки полезно работать с уровнем DEBUG. Это полезно тем, что даже если вы забудете потом удалить этот вызов, то он не будет забивать журнал ошибок, так как на продакшн сайте уровень логирования всегда выставляется в 1 (записывать в журнал только ошибки).
Если нужно вывести только отладочную информацию на странице без контента, то указываем вывод в HTML и добавляем die() или exit(), например:
$modx->log(MODX_LOG_LEVEL_ERROR, print_r($modx->config, 1),'HTML'); die();
Copyright © Majestio, 2006-2023
Знакомясь с любой системой управления сайтом, в первую я стараюсь понять, что делать, если что-то идет не так. И конечно в данном случае большую роль играют средства самой системы управления, которые либо помогают понять, в чем проблема, либо совершенно не информативны. Поговорим о MODX Revolution.
Система логирования MODX Revolution мне нравится, так как чем-то мне напоминает логирование в Linux и некоторых других open-source проектах. То есть позволяет выводить информацию в разные источники и позволяет группировать информацию по уровню важности, знакомыми всем системным администраторам log levels, что для меня очень важно. При этом система логирования задействуется уже на этапе установки, что упрощает решение проблем, происходящих в момент установки MODX, а они бывают.
Управление системой логирования производится через системные настройки log_target и log_level, которые расположены в блоке System and Server системных настроек MODX Revolution. На выводе в разные источники останавливаться не буду, скажу лишь, что источник задается системной настройкой log_target и по умолчанию логирование производится в файл (опция FILE). Сам файл с логами будет находиться по адресу: /core/cache/logs/error.log. Он же будет показываться, если выбрать пункт Error log (Журнал системы управления) в меню в админке.
На уровнях остановлюсь поподробнее, всего их 5: 0 (FATAL), 1 (ERROR), 2 (WARN), 3 (INFO), 4 (DEBUG). Использование данной группировки позволяет нам не только понимать уровень важности возникшей проблемы, но и задавать уровень, от которого информация будет в этот лог попадать (логироваться). Логика работы очень похожа на syslog. Например, если мы зададим уровень 1 (ERROR), то логироваться будут ошибки (1) и фатальные ошибки (0). Если же мы зададим 3 (INFO), то логироваться будут уровни 3 информация,2 предупреждения, 1 ошибки, 0 фатальные ошибки.
Кстати, как и любой лог в *nix системах за данным логом можно так же следить в режиме реального времени через tail:
tail -f /полный_путь_к_MODX/core/cache/logs/error.log
А еще мы можем сами добавлять информацию в лог через вызов метода MODX:
$modx->log(xPDO::LOG_LEVEL_ERROR,'Сообщение которое хотим отправить в лог');
, где LOG_LEVEL_ERROR означает уровень 1 (ERROR) и соответствует уровням логирования (FATAL, ERROR, WARN, INFO, DEBUG). Заменив последнее слово мы изменим и лог уровень, которому будет соответствовать важность сгенерированного нами сообщения.
xPDO::log¶
Регистрирует сообщение с подробной информацией о том, где и когда произошло событие.
Синтаксис¶
API Docs: https://api.modx.com/revolution/2.2/db_core_xpdo_xpdo.class.html#xPDO::log()
$xpdo->log($level, $msg, $target= '', $def= '', $file= '', $line= '');
-
$level
— (целое число) Уровень детализации зарегистрированного сообщения. Смотрите константы многословия ниже -
$msg
— (строка) Сообщение для входа. -
$target
— (mixed) Цель регистрации. Если это строка, это должно бытьFILE
,HTML
илиECHO
. Если массив, см. Примеры ниже. -
$def
— (строка) Имя определяющей структуры (например, класса), помогающей определить источник событий журнала. -
$file
— (строка) Имя файла, в котором произошло событие журнала. Обычно вы используете константу__FILE__
. -
$line
— (строка) Номер строки, помогающей определить источник события. Обычно вы используете константу__FILE__
void log (integer $level, string $msg, [string $target = ''], [string $def = ''], [string $file = ''], [string $line = ''])
Уровни журнала¶
Во многих случаях вы можете использовать эквивалентные константы MODX для уровней журнала.
То, что печатается, контролируется настройкой системы log_level
. Вы можете переопределить это во время выполнения, используя метод setLogLevel
.
Примеры¶
Просто¶
Простое сообщение журнала, записывает в файл журнала по умолчанию (например, core/cache/logs/error.log
):
$xpdo->log(xPDO::LOG_LEVEL_ERROR, '[Mobile Detect] An error occurred.');
В журналах это будет выглядеть так:
[2013-09-15 14:21:25] (ERROR @ /index.php) [Mobile Detect] An error occurred.
Укажите Сниппет¶
Поскольку приложение MODX в конечном итоге запускается через файл index.php, полезно добавить дополнительную информацию:
$xpdo->log(xPDO::LOG_LEVEL_ERROR, 'An error occurred.', '', 'MySnippet');
[2013-09-15 14:22:48] (ERROR in MySnippet @ /index.php) An error occurred
Указать файл и строку¶
Помните, что в конечном итоге все сниппеты и плагины MODX запускаются из кэшированных файлов, поэтому в качестве исходного файла будет указан кэшированный файл.
$xpdo->log(xPDO::LOG_LEVEL_ERROR, 'This is my error message...', '', 'MySnippet', __FILE__, __LINE__);
[2013-09-15 14:48:02] (ERROR in MySnippet @ /path/to/core/cache/includes/elements/modsnippet/28.include.cache.php : 7) This is my error message...
Пользовательский файл журнала¶
Вы можете отправить ошибки в пункт назначения, отличный от журнала ошибок MODX по умолчанию. Для этого вы должны передать массив в аргумент $target
. Вы должны подробно указать FILE
в качестве цели, в противном случае сообщение будет возвращено на страницу.
$xpdo->log(xPDO::LOG_LEVEL_ERROR, 'Error for my custom log file', array(
'target' => 'FILE',
'options' => array(
'filename' => 'custom.log'
)
));
По умолчанию путь к файлам журнала — это core/cache/logs/
, поэтому в этом примере мы находим наше сообщение журнала внутри файла custom.log
:
[2013-09-15 15:01:07] (ERROR @ /index.php) Error for my custom log file
При желании вы также можете указать путь через аргумент filepath
.
Поскольку это немного многословно, вы можете найти более понятным определение цели регистрации, а затем ссылаться на массив:
$log_target = array(
'target'=>'FILE',
'options' => array(
'filename'=>'my_custom.log'
)
);
$xpdo->log(xPDO::LOG_LEVEL_ERROR, 'My Error...',$log_target);
$xpdo->log(xPDO::LOG_LEVEL_ERROR, 'Some other error...',$log_target);
Отладка¶
Вы можете изменить уровень зарегистрированного сообщения, регулируя первый параметр. Например. для записи отладочного сообщения:
$xpdo->log(xPDO::LOG_LEVEL_DEBUG,'This is a debugging statement.');
Пользовательское использование в сниппетах¶
Это может быть очень удобно для увеличения подробности регистрации для отдельного сниппета или плагина. Для этого используйте функцию setLogLevel()
. Вы можете использовать это, чтобы переопределить глобальное значение системного параметра log_level:
// Вызови свой сниппет так: [[mySnippet? &log_level=`4`]]
// Переопределить глобальное значение log_level
$log_level = $modx->getOption('log_level', $scriptProperties, $modx->getOption('log_level'));
$modx->setLogLevel($log_level);
Константы многословия¶
xPDO константа | MODX константа | Значение |
---|---|---|
xPDO::LOG_LEVEL_FATAL |
MODX_LOG_LEVEL_FATAL |
0 |
xPDO::LOG_LEVEL_ERROR |
MODX_LOG_LEVEL_ERROR |
1 |
xPDO::LOG_LEVEL_WARN |
MODX_LOG_LEVEL_WARN |
2 |
xPDO::LOG_LEVEL_INFO |
MODX_LOG_LEVEL_INFO |
3 |
xPDO::LOG_LEVEL_DEBUG |
MODX_LOG_LEVEL_DEBUG |
4 |
Смотрите также¶
- Системная настройка log_level
- Системная настройка log_target
- xPDO
One of the common tools available for troubleshooting issues for a website is the error log. It is important to understand that Modx shows an error log for problems or flags that are set by developers of Modx. Additionally, you can see an error log generated by PHP when there are problems with PHP code within the Modx CMS. This log is not the same as the one generated by Modx. The following article describes both types of error logs and demonstrates how you can view both types of logs within the Modx Administrator Dashboard interface.
Accessing the Error Logs within Modx
Understanding the Different Error Logs
Modx-generated Error log | PHP Error log | |
---|---|---|
File locaton | The actual log file is a text file named error.log and can be found in the /core/cache/logs/ directory of your Modx installation. | This is a generic error log created due to PHP errors such as syntax errors. The error_log file can be found in multiple directories as it will be written in each directory where the error occurs. |
Viewable | This log is viewable through the Modx Reports>Error Log menu option. | This log is viewable through the Modx Resource Tree as a text file. |
Generated when | Errors in this log can be used to intentionally flag an event in Modx code for troubleshooting or development purposes. | This is an automatically generated error log whose sole purpose is to log PHP errors. |
Viewing the Modx Error Log
- Login to the Modx Administrator Dashboard.
- Hover over the menu bar where it says REPORTS. When the drop-down menu appears, click on ERROR LOG.
- When the ERROR LOG screen appears, it will show the most recent errors, if there are any to report. The screen will appear as follows:
The screenshot above shows no present errors. If Modx errors do occur, it will display the errors written into the ERROR.LOG file. For example, a Modx error may be shown when you improperly set a Modx tag. If you click on the CLEAR button, the ERROR.LOG will be reset to a blank text file.
Viewing a PHP error log in the Modx Resource Tree
- Login to the Modx Administrator Dashboard.
- Click on the FILES tab of the Resource Tree on the left side of the screen.
- In order to view the ERROR_LOG file you will need to select the file by clicking on it in the files of the resource tree at left. If a PHP error has occurred, then an ERROR_LOG file willl be written and saved in the corresponding directory where the PHP script generating the error is located. This file can sometimes be seen in multiple locations as it is written into the location where the corresponding error occurs. The example below shows the ERROR_LOG file in the tree-view of the files and folders at left. In order to DELETE this log, you would need to right-click on the file in the resource tree and then select DELETE FILE from the drop-down menu that appears.
- Click on CLOSE in the top right-hand corner in order to close the log file.
The use of the Modx ERROR.LOG and the ERROR_LOG (generated by PHP) can be invaluable when trying to determine a problem within the Modx application. If you have any problems with any portion of Modx, you can create a snippet to write a dummy error in the ERROR.LOG file to help determine the location of a problem in your code. Or, you can use the recorded errors in the PHP ERROR_LOG to troubleshoot the issue and provide valuable information for your developers.
май
19
, 2015
Рассмотрим примеры использования логов для отладки веб-приложения.
Используем логи Modx
По умолчанию логи Modx находятся в файле /core/cache/logs/error.log.
Это обычный текстовый документ, можете открывать его в любом редакторе.
Также он доступен в админке Modx, пункт Управление — Отчеты — Журнал ошибок
(в разных версиях меню может отличаться).
Но самый удобный способ при работе в командной строке Linux, это набрать
tail -f /path_to_modx_site/core/cache/logs/error.log
Команда будет выводить последние несколько строк из файла в режиме «онлайн»
Часто логи нужны нам не только для того, чтобы посмотреть ошибки, генерируемые Modx.
Иногда мы хотим записать туда свои данные в целях отладки.
Старый добрый вывод в браузер тоже работает, но не всегда это удобно, например,
при отладке скриптов, вызываемых аяксом. В Modx Revo записать в логи данные можно так:
$modx->log(1, 'message: '.$phone);
Вторым параметром передается сама строка для вывода. Вначале добавляется пояснения для удобства,
чтобы не запутаться, когда в логи выводим много данных.
Если мы работаем не с Modx или не хотим использовать его логи, то можем работать с логами веб-сервера.
Где они находятся, нужно смотреть в настройках веб-сервера.
Это тот же самый текстовый файл, который можем открывать, как угодно.
А записывать в него можем командой
error_log('ARRAY: '.var_export($array, true));
Обратите внимание, что можно использовать команду var_export со вторым параметром true.
Функция var_export выведет содержимое любого типа, например, массивов.
Капсом пояснение пишем, чтобы было легче ориентироваться в логах.
Можно даже записать отдельную функцию для записи в логи, например:
// Функция записи в логи function errorLog($caption, $param) { error_log(strtoupper($caption).': '.var_export($param, true)); } // Вызов функции errorLog('список телефонов', $phones);
Как видим, запись стала читаться получше
Анонсы статей, обсуждения интернет-магазинов, vue, фронтенда, php, гита.
Истории из жизни айти и обсуждение кода.
Для получения отладочных сообщений в журнале отчетов MODX следует использовать $modx->log(). Объявление функции имеет вид:
public function log($level, $msg, $target = '', $def = '', $file = '', $line = '')
Первый параметр
Первый параметр указывает уровень/тип сообщения — ошибка, предупреждение, информационное сообщение или отладочная информация. Для каждого уровня константы:
- MODX_LOG_LEVEL_FATAL = 0
- MODX_LOG_LEVEL_ERROR = 1
- MODX_LOG_LEVEL_WARN = 2
- MODX_LOG_LEVEL_INFO = 3
- MODX_LOG_LEVEL_DEBUG = 4
Второй параметр
Второй параметр содержит информацию, которая будет записана в журнал ошибок.
Обычно ограничиваются указанием только первых двух параметров
Третий параметр
В него передается «назначение», куда будет выводится информация. Возможные значения:
- FILE — сообщение сохраняется в файл core/cache/logs/error.log (по умочанию)
- ECHO — информация выводится на экран
- HTML — информация выводится на экран обёрнутая в тег <pre>
Четвертый параметр
В нём можно передать название скрипта или метода класса, в котором вызван метод log(). Особенно это удобно, когда таких вызовов несколько.
- «MySnippet» — выведется именно эта строка
- __METHOD__ — выведется название метода, где производится логирование
Пятый и шестой параметры
Они отвечают за вывод информации о скрипте и номере строки. Если их не указать, то они определятся автоматически как:
- __FILE__
- __LINE__
Системные настройки
Есть две системные настройки, влияющие на работу метода log() — это log_target и log_level. По умолчанию они имеют значение FILE и 1, соответственно.
Первая (log_target) указывает куда выводить информацию (см. «третий параметр»).
Вторая (log_level) указывает текущий уровень логирования MODX. Возможные значения:
- 0 — для фатальных сообщений (fatal)
- 1 — для ошибок (error)
- 2 — для предупреждений (warn)
- 3 — для информационных сообщений (info)
- 4 — для отладочных сообщений (debug)
Эта настройка ограничивает логирование сообщений указанным уровнем. Таким образом log() с уровнем выше, чем в настройке, будет отклонён. Например, если в настройке указано log_level = 1 (т.е. логируются только ошибки), то все вызовы метода log() с уровнем WARN, INFO и DEBUG в журнал записаны не будут. Как правило, при отладке на эти уровни не обращают внимание и используют текущий уровень логирования для ошибок.
Примеры
$modx->log(MODX_LOG_LEVEL_ERROR, 'Сообщение');
// или так
$modx->log(modX::LOG_LEVEL_ERROR, 'Сообщение');
// или ещё короче
$modx->log(1, 'Сообщение');
В режиме разработки полезно работать с уровнем DEBUG. Это полезно тем, что даже если вы забудете потом удалить этот вызов, то он не будет забивать журнал ошибок, так как на продакшн сайте уровень логирования всегда выставляется в 1 (записывать в журнал только ошибки).
Если нужно вывести только отладочную информацию на странице без контента, то указываем вывод в HTML и добавляем die() или exit(), например:
$modx->log(MODX_LOG_LEVEL_ERROR, print_r($modx->config, 1),'HTML'); die();
Copyright © Majestio, 2006-2023