FormIt - создание формы обратной связи в Revo
Этот сниппет предназначен для реализации формы обратной связи, ближайший его аналог в Modx Evo - это eForm.
Основные параметры
| Параметр (значение по умолчанию) | Применение |
|---|---|
|
&hooks=`` |
Скрипты, которые запускаются в том случае, если форма прошла валидацию. Хуков может быть несколько и они могут перечисляться через запятую (соответственно и выполняться в этом порядке). В качестве значений может принимать как путь к файлу, так и имя сниппета. Если один из хуков вернёт отрицательный результат, то остальные выполнены не будут. Примечание. Чтобы отправлялось письмо на почту, должен присутствовать хук email, совместно с которым используются следующие параметры. |
|
&preHooks=`` |
Скрипты, которые будут выполнены при загрузке формы. Хуков может быть несколько и они могут перечисляться через запятую (соответственно и выполняться в этом порядке). В качестве значений может принимать как путь к файлу, так и имя сниппета. Если один из хуков вернёт отрицательный результат, то остальные выполнены не будут. |
|
&submitVar=`` |
В качестве параметра указывается имя POST переменной, в случае отсутствия которой форма не будет отправлена. Используется в том случае, если на сайте несколько форм. В самой разметке, переменная задаётся в тэге input типа submit. |
|
&validate=`` |
В качестве параметра задаются правила валидации полей перед отправкой. Соответственно, пользователь не сможет отправить форму без прохождения этих проверок. Подробнее. |
|
&validationErrorMessage=`A form validation error occurred. Please check the values you have entered.` |
Сообщение, которое будет выводиться пользователю в случае если данные, заполненные в форме, не прошли валидацию. |
|
&validationErrorBulkTpl=`<li>[[+error]]</li>` |
HTML шаблон для каждого сообщения об ошибке. |
|
&errTpl=`[[+error]]` |
HTML шаблон-обёртка для всех сообщений об ошибке. |
|
&customValidators=`` |
Перечень сниппетов через запятую, которые будут использованы при кастомной валидации отдельных полей. Подробнее. |
|
&clearFieldsOnSuccess=`1` |
Очищать ли поля, после успешной отправки формы? 1 - очищать |
|
&store=`0` |
Если стоит 1, то данные будут храниться в кэше для последующего использования сниппетом FormItRetriever |
|
&storeTime=`300` |
Время (в секундах), в течении которого будут храниться данные после отправки формы. Используется, если параметр &store равен 1. |
|
&storeLocation=`cache` |
Определяет хранилище, которое будет использовано при хранении данных после отправки формы. В качестве доступных значений могут быть использованы: cache, session. |
|
&placeholderPrefix=`fi.` |
Префикс для плэйсхолдеров, устанавливаемых для полей. Необходимо удостовериться, что в префиксе используется разделитель в виде точки. |
|
&successMessage=`` |
Сообщение, которое будет выведено в случае успешной отправки формы. |
|
&successMessagePlaceholder=`fi.successMessage` |
Имя плэйсхолдера, в котором находится сообщение об успешной отправке. |
|
&redirectTo |
В качестве параметра указывается ID страницы, на которую будет перенаправлять в случае успешной отправки сообщения. Обычно используется редирект на страницу с благодарственным сообщением. |
Хук email
Параметры, которые используются совместно с данным хуком:
| Параметр (значение по умолчанию) | Применение |
|---|---|
|
&emailTo |
Список email адресов через запятую, на которые будут отправлены заполненные пользователем данные. |
|
&emailTpl |
Чанк письма, которое будет приходить на почту. Подробнее. |
|
&emailSubject |
Тема письма |
|
&emailUseFieldForSubject |
Если стоит 1, и значение параметра &emailSubject пропущено, то значение поля можно будет использовать в качестве подстановки для темы письма. |
|
&emailToName |
Заголовок письма "Кому" (опционально). В качестве значения выступает имя получателя. |
|
&emailFrom |
Заголовок письма "От" (опционально). В качестве значения выступает email отправителя. |
|
&emailFromName |
Заголовок письма "От" (опционально). В качестве значения выступает имя отправителя. |
|
&emailHtml=`1` |
Если стоит 1, то формат письма, которое приходит на почту - HTML (опционально) |
|
&emailConvertNewlines |
Если стоит 1, то все переносы строки будут сконвертированы в тэг <br /> |
|
&emailReplyTo |
Email, который будет указан в качестве ответного сообщения. По умолчанию данные берутся из поля с именем email. Если такого поля нет, то из значения параметра emailFrom |
|
&emailReplyToName |
Имя, которое будет указано в ответном сообщении пользователя (опционально). |
|
&emailCC |
Email адреса через запятую, которым так же будет отправлена копия. Все остальные адресаты будут в курсе того, кому ещё были отправлены копии. |
|
&emailCCName |
Имена тех, кому так же будет отправлена копия. Все остальные адресаты будут в курсе того, кому ещё были отправлены копии (опционально). |
|
&emailBCC |
Email адреса через запятую, которым так же будет отправлена копия. Все остальные адресаты не будут в курсе того, кому ещё были отправлены копии (скрытая копия). |
|
&emailBCCName |
Имена через запятую, которым так же будет отправлена скрытая копия (опционально). |
|
&emailMultiWrapper |
Обёртка для значений множественного типа. |
|
&emailMultiSeparator |
Разделитель для значений множественного типа. |
Валидаторы
Частенько бывает необходимо перед отправкой самой формы, произвести необходимые проверки: было ли заполнено поле, является вводимый пользователем e-mail на самом деле электронным адресом и так далее. В FormIt для этих целей используются валидаторы, которые записываются следующим образом:
[[!FormIt? &validate=`username:required,message:required`]]
То есть в параметре validate мы перечисляем имена полей, которые будем проверять, а через двоеточие метод проверки. В данном случае используется валидатор "required", который проверяет заполнено ли определённое поле или нет. Полей можно указывать несколько, через запятую.
Встроенные валидаторы FormIt:
| Имя | Назначение |
|---|---|
|
blank |
Поле должно быть пустым. Данный трюк используется, если нужно например обмануть спам-роботов, которые заполняют все поля. |
|
required |
Поле является обязательным для заполнения. |
|
password_confirm |
Значение данного поля должно совпадать со значением другого поля. |
|
|
Поле должно быть типа email. |
|
minLength |
Значение поля должно быть не меньше указанной длины. |
|
maxLength |
Значение поля должно быть не больше указанной длины. |
|
minValue |
Минимальное значение. |
|
maxValue |
Максимальное значение. |
|
contains |
Значение, которое должно содержать поле. |
|
strip |
Подстрока, которая будет вырезана из поля. |
|
stripTags |
Из поля будут вырезаны все HTML тэги. По умолчанию включено. |
|
allowTags |
Разрешать в поле HTML тэги. По умолчанию выключено. |
|
isNumber |
Значение поля должно быть числом. |
|
allowSpecialChars |
Не заменять HTML символы их сущностями. По умолчанию выключено. |
|
isDate |
Поле должно являться датой. |
|
regexp |
Значение поля должно подпадать под регулярное выражение. |
Кастомные валидаторы
На тот случай, если по какой-то причине стандартных валидаторов будет не хватать, можно написать свои, которые будут являться ничем иным как сниппетами:
[[!FormIt? &customValidators=`isBigEnough` &validate=`cost:isBigEnough`]]
Чтобы данный пример заработал, необходимо будет создать одноимённый сниппет isBigEnough, который будет проверять, превышает ли введённое число значение 1000. И если да, то выводить ошибку.
При этом доступны будут следующие переменные:
$key - название самого поля;
$value - значение самого поля;
$param - параметр валидатора, если таковой присутствует;
$type - имя валидатора или сниппета;
$validator - связь с экземпляром класса fiValidator.
То есть содержимое сниппета будет примерно таким:
<?php
$value = (float)$value;
$success = $value > 1000;
if (!$success) {
// Note how we can add an error to the field here.
$validator->addError($key,'Not big enough!');
}
return $success;
?>
Кастомные сообщения об ошибках
Если пользователь при заполнении формы введёт какую-либо неверную информацию или не введёт её вовсе, то ему будет показано стандартное сообщение об ошибке. Но мы и этот момент можем кастомизировать, для этого воспользуемся следующей таблицей:
| Валидатор | Свойство |
| 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 |
В первой колонке указан валидатор, который отвечает за проверку поля (их описание можно найти чуть выше), а вторая колонка - это параметр снипета FormIt, указав который, можно кастомизировать сообщение об ошибке для валидатора из первой колонки. Чтобы было понятно, о чём речь, вот пример:
[[!FormIt? &vTextRequired=`Пожалуйста, заполните поле, чтобы продолжить дальше` &name.vTextRequired=`Заполните ваше имя. Мы должны знать его, чтобы знать как к вам обращаться` ]]
Шаблон формы обратной связи
Форма должна размещаться на той же странице, где и сам сниппет. Вот простейший пример с двумя полями:
[[!+fi.validation_error_message:notempty=`<p>[[!+fi.validation_error_message]]</p>`]]
<form id="our-form" method="post" action="[[~[[*id]]]]">
<div>
<label for="name">Имя пользователя: </label><br />
<input id="name" name="name" value="[[!+fi.name]]" />
<span class="error">[[!+fi.error.name]]</span>
</div>
<div>
<label for="email">E-Mail </label><br />
<input id="email" name="email" value="[[!+fi.email]]" />
<span class="error">[[!+fi.error.email]]</span>
</div>
<div>
<input name="submit" type="submit" value="Отправить"/>
</div>
</form>
Тут собственно всё просто:
[[!+fi.validation_error_message]] - выводится в том случае, если у нас в форме есть какие-либо ошибки.
[[!+fi.error.name]] - в этом месте будут выводиться ошибки, связанные с каким-то одним полем. В данном случае это поле name.
Так же, в самой форме указан аттрибут action="[[~[[*id]]]]". Но прописывать его вовсе необязательно, поскольку форма и так по умолчанию будет указывать на текущий ресурс.
Однако, всего этого пока ещё недостаточно. Нам нужно создать чанк, в котором будет находиться шаблон письма, которое будет к нам приходить на почту. И вот собственно, следующая тема:
Шаблон письма, приходящий на почту
Шаблон, напомню, находится в чанке, имя которого прописано в параметре emailTpl снипета FormIt. Выглядеть он будет следующим образом:
Вам пришло письмо от пользователя с именем [[+name]] А вот и его email:
[[+email]]
Как вы могли уже догадаться, здесь всё просто:
в плэйсхолдерах [[+name]] и [[+email]] находятся значения, которые пользователь ввёл в поля с атрибутами name="name" и соответственно name="email".
Пример вызова сниппета
Итак, подводя итоги, чтобы сделать форму обратной связи будет достаточно:
1. Разместить HTML код самой формы. Пример есть выше.
2. Создать чанк отправки на почту. Опять же, как это сделать, рассказывал ранее.
3. Ну и собственно сам вызов сниппета.
[[!FormIt?
&hooks=`email`
&emailTpl=`form_feed`
&emailTo=`user@example.com`
&validate=`
name:required,
email:email:required,
message:required:stripTags,
]]
Вы должны авторизоваться, чтобы оставлять комментарии.
Комментарии ()