FormIt — это мощный и гибкий компонент для MODX, который позволяет обрабатывать формы на вашем сайте. С его помощью можно собирать данные от пользователей, обрабатывать их и сохранять в базу данных или отправлять на email. FormIt предоставляет гибкие настройки, встроенную валидацию и множество других полезных функций, таких как:
- Обработка данных из форм.
- Поддержка файловых вложений.
- Сохранение данных в базе данных.
- Отправка уведомлений на почту и т.д..
- Зачем использовать FormIt?
- Установка
- Разработка и ошибки
- Как использовать
- Доступные свойства (параметры)
- Проверка данных (Валидация)
- Полный перечень встроенных валидаторов
- Пользовательские валидаторы
- Пользовательские сообщения об ошибках
- Хуки
- Использование preHooks
- Использование параметра renderHooks
- Использование хуков
- Встроенные хуки
- Хук email
- Хук redirect
- Хук spam
- Хук math
- Хук recaptcha
- Хук FormItAutoResponder
- Хук FormItSaveForm
- Вспомогательные сниппеты
- FormItRetriever
- Использование
- Свойства FormItRetriever
- Пример
- FormItCountryOptions
- Использование
- Свойства FormItCountryOptions
- Приоритетные страны
- FormItStateOptions
- Использование
- Свойства FormItStateOptions
- Дополнительно
- Обработка выпадающих списков, чекбоксов и радио кнопок
- Обработка выпадающих списков
- Обработка чекбоксов и радио кнопок
- Использование пустого поля для защиты от спама
- Заключение
Зачем использовать FormIt?
- Легко создавать формы: добавьте необходимые поля, настройте их и получите рабочую форму за несколько минут.
- Встроенная валидация: убедитесь, что пользователи вводят корректные данные.
- Обработка данных: сохраняйте данные в базу, отправляйте на email или обрабатывайте их как вам нужно.
- Безопасность: защита от спама и атак с помощью встроенных механизмов.
- Гибкость: интегрируется с другими компонентами MODX для расширения функционала.
Установка
FormIt можно загрузить через менеджер пакетов из основного репозитория. Для этого:
- Перейдите в панель управления MODX.
- Откройте раздел «Установщик».
- Найдите компонент FormIt в разделе «Дополнения».
- Установите и активируйте компонент.
Также вы можете скачать транспортный пакет из репозитория MODX здесь: https://modx.com/extras/package/formit.
Разработка и ошибки
FormIt хранится и разрабатывается в GitHub, и его можно найти здесь: https://github.com/Sterc/FormIt
Здесь можно писать об ошибках: https://github.com/Sterc/FormIt/issues.
Документацию по API также можно найти здесь: https://api.modx.com/formit/.
Как использовать
Просто разметьте форму которую вы хотите использовать и поместите над ней вызов сниппета FormIt. Укажите «hooks» (или сценарии обработки после проверки) в вызове Сниппета. Затем добавьте проверку с помощью параметров &validate
и &customValidators
.
Пример, у нас есть простенькая HTML разметка формы:
<form action="#" method="post">
<label for="name">Имя:</label>
<input type="text" id="name" required>
<label for="email">Email:</label>
<input type="email" id="email" required>
<label for="message">Сообщение:</label>
<textarea id="message" required></textarea>
<button>Отправить</button>
</form>
Для того чтобы FormIt смог ее в дальнейшем обрабатывать, нам необходимо добавить к отправляемым полям (в данном случае к input
и textarea
) атрибуты name
и добавить к кнопке отправки type="submit"
.
<form action="[[~[[*id]]]]" method="post">
<label for="name">Имя:</label>
<input type="text" name="name" id="name" required>
<label for="email">Email:</label>
<input type="email" name="email" id="email" required>
<label for="message">Сообщение:</label>
<textarea name="message" id="message" required></textarea>
<button type="submit">Отправить</button>
</form>
Далее помещаем над формой вызов сниппета FormIt
с необходимыми параметрами, пример:
[[!FormIt?
&hooks=`email`
&emailTo=`admin@example.com`
]]
<form action="[[~[[*id]]]]" method="post">
<label for="name">Имя:</label>
<input type="text" name="name" id="name" required>
<label for="email">Email:</label>
<input type="email" name="email" id="email" required>
<label for="message">Сообщение:</label>
<textarea name="message" id="message" required></textarea>
<button type="submit">Отправить</button>
</form>
Если у вас есть несколько форм на странице, установите для свойства &submitVar
в вызове сниппета имя элемента формы (например, &submitVar = form1-submit
). Это указывает FormIt обрабатывать запросы формы только, если в переданных полях формы (POST) есть эта переменная. Если у вас на одной странице несколько форм, обрабатываемых Formit, следует использовать теги с INPUT type = «submit» name = «form1-submit», элементы button работать не будут.
Смотрите также: Практика создания контактных форм.
Доступные свойства (параметры)
FormIt поддерживает множество параметров, которые можно настроить в зависимости от ваших потребностей. Самые ходовые из них:
- &hooks — цепочка действий, выполняемых после отправки формы (например,
email
,spam
). - &emailTo — адрес электронной почты, на который будет отправлено сообщение.
- &validate — правила проверки полей формы.
- &successMessage — сообщение об успешной отправке формы.
- &errorMessage — сообщение об ошибке.
Пример использования параметров:
[[!FormIt?
&hooks=`email`
&emailTo=`admin@example.com`
&validate=`name:required,email:email`
&successMessage=`Ваше сообщение успешно отправлено.`
&errorMessage=`Произошла ошибка. Проверьте введённые данные.`
]]
В таблице ниже прописаны все доступные общие свойства для вызова FormIt (не включая свойства, специфичные для хуков):
Имя | Описание | Значение по умолчанию |
---|---|---|
preHooks | Какие скрипты запускать, если они есть, после загрузки формы. Это может быть список хуков, разделенных запятыми, и если первый не сработает, последующие также не будут использованы. Хук также может быть именем другого Сниппета, который будет выполнять этот Сниппет. | |
renderHooks | Какие скрипты запускать, если они есть, после загрузки формы, завершения preHooks и установки всех полей и ошибок. Это может быть разделенный запятыми список Хуков, используемых для управления всеми полями формы до того, как все будет установлено на основе данных из других пакетов или предварительных хуков. Хук также может быть именем Сниппета, который будет выполнять этот Сниппет. |
|
hooks | Какие скрипты запускать, если они есть, после того, как форма прошла проверку. Это может быть список хуков, разделенных запятыми, и если первый не сработает, последующие не сработают также. Хук также может быть именем Сниппета, который будет выполнять этот Сниппет. | |
submitVar | Если установлено, обработка формы не начнется, если эта переменная POST не передана. Примечание: этот параметр необходим, если вы используете свойство &store (+ установить submit переменную в input=»submit»!). |
|
validate | Список полей для проверки, разделенных запятыми, для каждого поля в виде имя:валидатор (например: username: required, email: required ). Валидаторы также могут быть связаны цепочкой, например, email:email:required . Это свойство также можно указать в нескольких строках. |
|
validationErrorMessage | Общее сообщение об ошибке, которое следует установить в качестве Плейсхолдера [[!+fi.validation_error_message]] в случае сбоя проверки. Может содержать [[+errors]] , если вы хотите вывести список всех ошибок. |
Произошла ошибка проверки формы. Пожалуйста, проверьте введенные вами значения . |
validationErrorBulkTpl | HTML tpl, который используется для каждой отдельной ошибки в общем сообщении об ошибках валидации. | [[+error]] |
errTpl | HTML-обёртка для сообщений об ошибках. Примечание: не чанк, а простой HTML. | [[+error]] |
customValidators | Список имен настраиваемых валидаторов(сниппетов), разделенных запятыми, которые вы планируете использовать в этой форме. Они должны быть явно указаны здесь, иначе они не будут запущены. | |
clearFieldsOnSuccess | Если указано, очистит поля при успешной отправке формы без перенаправления. | 1 |
store | Если указано, данные будут храниться в кэше для извлечения с помощью сниппета FormItRetriever. | 0 |
storeTime | В секундах, если указано, задает количество секунд для хранения данных после отправки формы. По умолчанию — пять минут. | 300 |
storeLocation | При использовании store это свойство определяет, где форма будет храниться после отправки. Возможные варианты: cache и session . |
cache |
placeholderPrefix | Префикс, используемый для всех Плейсхолдеров, установленных FormIt для полей. Не забудьте добавить «.» разделитель в вашем префиксе. | fi. |
successMessage | Если redirect хук не используется, отобразите это сообщение после успешной отправки. |
|
successMessagePlaceholder | Имя Плейсхолдера, для которого нужно установить сообщение об успешном завершении. | fi.successMessage |
redirectTo | Идентификатор страницы а-ля «Ваша форма успешно отправлена», куда посетитель может быть отправлен после успешной отправки формы, но этот параметр читается ТОЛЬКО, если вы включили redirect в список хуков(параметр &hooks ). |
|
allowFiles | Укажите, разрешена ли передача файлов. Отправленные файлы хранятся во временном каталоге, чтобы файлы не терялись, если у вас форма состоит из нескольких шагов. | 1 |
attachFilesToEmail | Прикрепляет загруженные файлы к электронному письму, форма должна иметь атрибут enctype="multipart/form-data" |
1 |
Проверка данных (Валидация)
FormIt поддерживает различные типы проверки полей формы через параметр &validate
. Основные правила:
- required — поле обязательно для заполнения.
- email — проверка корректности email-адреса.
- minLength:X — минимальная длина строки (X — число).
- maxLength:X — максимальная длина строки.
- isNumber — проверка на число.
Пример, чтобы сделать поле имени пользователя обязательным, вы можете сделать так:
&validate=`name: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`]]
Все такие произвольные валидаторы должны быть указаны в свойстве 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. Они всегда выполняются в том порядке, в котором они указаны в свойстве. Если, например, у вас есть хук для электронной почты, за которой следует хук валидации, электронное письмо будет отправлено до того, как произойдет проверка.
Если какой-либо хук завершится с ошибкой, последующие за ним не будут выполняться.
Есть три типа хуков:
- preHook, указанный в свойстве
preHooks
в сниппете FormIt, который выполняется при загрузке формы. Полезны для предварительной загрузки значений. - renderHook, указанный в свойстве
renderHooks
в сниппете FormIt, который выполняется, когда форма загружается и предварительныеpreHooks
хуки уже завершены. Полезно для обработки полей и ошибок перед отрисовкой формы, как это используется в Formalicious. - Обычный хук, указанный в свойстве
hooks
в сниппете FormIt, который выполняется после проверки формы. Полезно для пользовательской пост-обработки.
Использование preHooks
Просто укажите preHook в свойстве preHooks
в вызове сниппета FormIt. Встроенных preHooks хуков нет, но если у вас есть например preHook под названием loadCustomValues
, то вызов будет таким:
Formit перед загрузкой формы запустит сниппет loadCustomValues
. Вы можете установить поля в форме следующим образом:
Или альтернативно использовать ->setValues
:
<?php
$hook->setValues(array(
'name' => 'Иван Петров',
'email' => 'ivan.petrov@fake-emails.com',
));
return true;
Обратите внимание, что использование здесь метода setValues()
сделает соответствующие Плейсхолдеры доступными для вашего блока электронной почты; эффект ручной установки значений аналогичен добавлению скрытых полей в вашу форму.
Вы также можете делать все, что хотите, в preHook. Не забудьте вернуть true, если ваш preHook или hook успешны. Если вы хотите добавить в поле сообщение об ошибке:
$hook->addError('user','Пользователь не найден.');
return $hook->hasErrors();
Использование параметра renderHooks
Просто укажите renderHook в свойстве renderHooks
в вашем вызове сниппета FormIt. Встроенных хуков для renderHooks
нет, но если у вас например есть renderHook с именем buildSessionFields
, то можно сделать вот так:
// Получить конфигурацию Formit и возможные заданные значения
$formit =& $hook->formit;
$values = $hook->getValues();
// Получить данные сеансов
$values = array_merge($_SESSION['preset_fields_from_session'], $values);
$fields = array();
foreach ($values as $value) {
// $value = array('label' => '', 'name' => '')
$fields[] = $modx->getChunk('fieldChunk', $value);
}
$modx->toPlaceholder('extraFields', implode(PHP_EOL, $fields));
С новой системой хуков стало проще создавать пользовательские формы из сессий, базы данных или данных API.
Использование хуков
Просто укажите хук в свойстве hooks
при вызове сниппета FormIt. Например, следующий вызов загружает хук-перехватчик спама и хук отправки электронной почты:
Встроенные хуки
Хук email
Хук email отправляет содержимое вашей HTML формы на любой адрес электронной почты.
Поддерживаемые параметры
Имя | Описание |
---|---|
emailTpl | Обязательный. Чанк tpl для сообщения электронной почты. Если он не указан, будет отправлен список полей с их значениями. |
emailSubject | Тема письма. |
emailUseFieldForSubject | Если указано «1» и передано поле «тема», то значение этого поля будет использоваться в качестве строки темы электронного письма. |
emailTo | Список адресов получателей электронной почты, разделенных запятыми. |
emailToName | Необязательный. Список имен, разделенных запятыми, для попарного сопряжения со значениями emailTo . |
emailFrom | Необязательный. Если установлено, будет указан адрес отправителя «From:» для электронного письма. Если не установлен, сначала будет осуществлен поиск поля формы «email». Если ничего не найдено, по умолчанию будет установлена системная настройка emailsender . ПРИМЕЧАНИЕ. Всегда устанавливайте для системной настройки emailFrom действительный адрес электронной почты (который разрешен для отправки с вашего сервера), чтобы избежать отклонения писем из-за нарушений SPF/DMARC. |
emailFromName | Необязательный. Если установлено, будет указано имя отправителя «From:» для электронного письма. |
emailHtml | Необязательный. Должно ли электронное письмо быть в формате HTML. По умолчанию 1. |
emailConvertNewlines | Необязательный. Если установлено значение 1, все символы новой строки будут преобразованы в теги <br> . |
emailReplyTo | Электронное письмо, на которое нужно ответить. Если не установлен, сначала будет искать поле формы «email». Если ничего не найдено, по умолчанию будет установлено значение, установленное в emailFrom . ПРИМЕЧАНИЕ. Установите для emailReplyTo действительный адрес электронной почты из того же домена, что и emailFrom , чтобы избежать отклонения электронной почты из-за нарушений SPF/DMARC. |
emailReplyToName | Необязательный. Имя поля для ответа через «Reply-To:» |
emailCC | Список писем, разделенных запятыми, для отправки через «CC:». |
emailCCName | Необязательный. Список имен, разделенных запятыми, для попарного сопряжения со значениями emailCC . |
emailBCC | Список email адресов, разделенных запятыми, для отправки через скрытую копию («BCC»). |
emailBCCName | Необязательный. Список имен, разделенных запятыми, для сопряжения со значениями emailBCC . |
emailMultiWrapper | Оборачивает значения, переданные через чекбоксы/списки множественного выбора этим значением. По умолчанию используется только значение. (1.6.0+) |
emailMultiSeparator | Разделяет чекбоксы/списки множественного выбора этим значением. По умолчанию используется новая строка. (1.6.0+) |
emailSelectField | Имя поля формы, которое выбирает адреса электронной почты для отправки. (4.2.5+) |
emailSelectTo | Разделенный точкой с запятой список адресов электронной почты, разделенных запятыми, для отправки туда писем. (4.2.5+) |
emailSelectToName | Список разделенных точкой с запятой имен электронной почты для отправки туда писем. (4.2.5+) |
Любое из свойств email хука может содержать плейсхолдеры имен полей из вашей формы, которые будут обрабатываться.
Использование
Просто укажите его как хук в вызове FormIt, а затем укажите свойства электронной почты в вызове FormIt.
[[!FormIt?
...
&hooks=`email`
&emailTpl=`CentralizedDebtObligationEmailTpl`
&emailSubject=`Кто-то еще купил пакет CDO`
&emailTo=`sales@mortgagemoney.com`
&emailCC=`boss@mortgagemoney.com`
&emailBCC=`fbi@gov.com`
&emailBCCName=`CDO информатор о мошенничестве`
]]
Обратите внимание, что свойство &emailTpl
указывает на имя чанка. В этом блоке у вас будут плейсхолдеры для каждого поля в вашей форме. Наш чанк может выглядеть так:
<p>Привет,</p>
<p>[[+name]] только что приобрел CDO пакет: [[+cdo_package]].</p>
<p>Его адрес: [[+email]]</p>
<p>Спасибо!</p>
Это конечно предполагает, что у вас есть поля «name», «cdo_package» и «email» в вашей форме.
Добавление динамики в адресацию
FormIt, начиная с версии 4.2.5+, мог выбирать получателя почты по числовому значению поля, то есть по значению параметра ‘select’. Таким образом можно избежать создания поддельного поля формы, в котором пользователь может легко отправить любой почтовый адрес. Пользователь будет видеть только нумерованный список получателей, которые будут перенаправлены на адреса электронной почты с помощью свойств FormIt.
Для этого вы можете использовать следующие свойства FormIt:
&emailSelectTo=`mail1@my.domain,mail2@my.domain;different@my.domain`
&emailSelectToName=`Mail1,Mail2;Different`
&emailSelectField=`emailselect`
и следующее поле формы
<select name="emailselect">
<option value="1" [[!+fi.emailselect:default=`1`:FormItIsSelected=`1`]]>Адрес 1</option>
<option value="2" [[!+fi.emailselect:default=`1`:FormItIsSelected=`2`]]>Адрес 2</option>
</select>
Если выбран Адрес 1, почта будет отправляться на mail1@my.domain,mail2@my.domain
, если же выбран Адрес 2, почта будет отправлена наdifferent@my.domain
.
Использование поля Темы в качестве строки Темы электронного письма
Предположим, у вас есть поле темы в вашей форме. Вы хотите, чтобы это было темой отправляемого электронного письма. Хук электронной почты может делать следующее:
[[!FormIt?
...
&emailUseFieldForSubject=`1`
]]
Будет выполнен поиск поля с именем «тема», которое будет использоваться в электронном письме. Если он не будет найден или окажется пуст, по умолчанию будет использовано значение &emailSubject
.
Работа с чекбоксами и множественным выбором в электронном письме
FormIt, начиная с версии 1.6.0+, автоматически обрабатывает чекбоксы и объединяет их в одно поле. Вы можете использовать свойства &emailMultiSeparator
и &emailMultiWrapper
, чтобы указать, как они соединяются. Например, чтобы обернуть флажки в теги <li>
:
[[!FormIt?
...
&emailMultiWrapper=`<li>[[+value]]</li>`
]]
Или просто разделить при помощи BR тегов:
[[!FormIt?
...
&emailMultiSeparator=`<br />`
]]
Хук redirect
Хук перенаправит пользователя на указанный ресурс, когда его HTML форма завершит отправку. Для этого требуется один параметр redirectTo
, который должен быть идентификатором ресурса, на который вы хотите выполнить перенаправление. Значения полей формы не пересылаются.
Поддерживаемые параметры
Имя | Описание |
---|---|
redirectTo | Обязательный. Идентификатор ресурса, на который следует перенаправить пользователя при успешной отправке HTML формы. |
redirectParams | Объект JSON с параметрами для передачи в URL-адресе перенаправления. |
Обратите внимание, что это также можно использовать со свойством &store
для отправки значений формы на перенаправленную страницу с помощью сниппета FormItRetriever.
Использование
Просто включите redirect хук в свойство &hooks
при вызове FormIt. Затем укажите идентификатор ресурса для перенаправления с помощью свойства &redirectTo
.
Перенаправление с параметрами
Вы можете указать параметры для перенаправления при использовании этого хука. Просто используйте свойство &redirectParams
:
[[!FormIt?
&hooks=`redirect`
&redirectTo=`212`
&redirectParams=`{"user":"123","success":"1"}`
]]
Это создаст URL-адрес с этими параметрами. Скажем, идентификатор ресурса 212 находится в books.html
, тогда URL-адрес перенаправления будет:
- books.html?user=123&success=1
Хук spam
Хук проверяет все поля, указанные в свойстве spamEmailFields
, на соответствие фильтру спама через StopForumSpam. Если пользователь отмечен как спамер, будет показано сообщение об ошибке для этого отмеченного поля.
Для хука требуется поддержка cURL
или Sockets
в вашей установке PHP (те же требования для [Управление пакетами](development-in-modx/advanced-development/package-management «Управление пакетами»)).
Возможные параметры
имя | описание |
---|---|
spamEmailFields | Опциональный. Список полей,где указана адреса электронной почты, разделенных запятыми, для проверки. По умолчанию «email». |
spamCheckIp | Если ‘true’, также будет проверяться IP отправителя. По умолчанию ‘false’. |
Использование
Просто укажите хук «spam» в вызове FormIt, остальное сниппет сделает сам.
[[!FormIt? &hooks=`spam`]]
Проверка IP адреса на спам
Хотя настоятельно не рекомендуется использовать IP адрес для проверки на спам (поскольку спамеры могут легко изменить IP адреса, а проверка IP адресов часто дает ложные срабатывания), FormIt предоставляет вам такую возможность. Просто установите для параметра &spamCheckIp
значение 1 при вызове FormIt.
Хук math
Хук math позволит вам иметь математический вопрос в вашей форме, чтобы предотвратить спам. Он отобразит математическое выражение, которое необходимо сосчитать, чтобы ответить правильно, а именно:
12 + 23?
Поддерживаемые параметры
Имя | Описание | По умолчанию |
---|---|---|
mathMinRange | Минимальное значение для каждого числа в уравнении. | 10 |
mathMaxRange | Максимальное значение для каждого числа в уравнении. | 100 |
mathField | Имя поля ввода для ответа. | math |
mathOp1Field | Имя поля/плейсхолдера для 1-го числа в уравнении. | op1 |
mathOp2Field | Имя поля/плейсхолдера для 1-го числа в уравнении. | op2 |
mathOperatorField | Имя поля/плейсхолдера для оператора в уравнении. | operator |
Использование
Включите его как хук в вызове FormIt:
[[!FormIt? &hooks=`math`]]
Чтобы сделать вычисление математического выражения обязательным, используйте вызов следующим образом:
[[!FormIt? &hooks=`math` &validate=`math:required`]]
Вставьте этот образец HTML-кода в ту часть формы, в которую вы хотите включить математический вопрос:
<label>[[!+fi.op1]] [[!+fi.operator]] [[!+fi.op2]]?</label>
[[!+fi.error.math]]
<input type="text" name="math" value="[[!+fi.math]]" />
<input type="hidden" name="op1" value="[[!+fi.op1]]" />
<input type="hidden" name="op2" value="[[!+fi.op2]]" />
<input type="hidden" name="operator" value="[[!+fi.operator]]" />
Математический вопрос в месте поля ввода с именем «math».
ПРИМЕЧАНИЕ. Поля формы «op1», «op2» и «operator» больше не используются, начиная с версии FormIt 2.2.11 и выше.
Настройка описания операции
Если вы не хотите использовать только «-» или «+» в качестве оператора и хотите еще больше скрыть его от спам-ботов, вы можете использовать выходные фильтры, чтобы еще больше добавить неоднозначности в математическое уравнение. Измените строку с текстом уравнения на:
<label>[[!+fi.op1]] [[!+fi.operator:is=`-`:then=`минус`:else=`плюс`]] [[!+fi.op2]]?</label>
В результате уравнение будет выглядеть как «23 плюс 41?» или «50 минус 12?» вместо символа -/+, что усложняет работу спам-ботов.
Хук recaptcha
The recaptcha хук включит поддержку reCaptcha для форм FormIt.
Использование
Во-первых, добавьте recaptcha в параметр &hooks
в вызове FormIt. Затем вам нужно будет включить в форму следующие плейсхолдеры:
[[+formit.recaptcha_html]]
[[!+fi.error.recaptcha]]
Первый плейсхолдер — это место, где будет отображаться форма reCaptcha; 2-е — сообщение об ошибке (если есть) для reCaptcha.
Наконец, вам необходимо настроить закрытый и открытый ключи reCaptcha в системных настройках. Для reCaptcha доступны следующие настройки:
Имя | Описание |
---|---|
formit.recaptcha_public_key | Ваш публичный ключ reCaptcha. |
formit.recaptcha_private_key | Ваш приватный ключ reCaptcha. |
formit.recaptcha_use_ssl | Следует ли использовать SSL для запросов reCaptcha. По умолчанию — «нет». |
Поддерживаемые параметры
Хук reCaptcha имеет несколько дополнительных параметров конфигурации:
Имя | Описание | По умолчанию |
---|---|---|
recaptchaJs | Объект JSON для передачи в переменную RecaptchaOptions , которая настраивает виджет reCaptcha. См. Официальную документацию по reCaptcha для получения дополнительной информации. |
{} |
recaptchaTheme | Используемая тема reСaptcha. | clean |
Хук FormItAutoResponder
Хук отправляет авто-ответ отправителю по электронной почте.
Поддерживаемые параметры
Хук имеет следующие параметры, которые нужно передать в вызов сниппета FormIt:
имя | описание |
---|---|
fiarTpl | Обязательный. Имя чанка для авто-ответа. |
fiarSubject | Тема письма. |
fiarToField | Имя поля формы, которое будет использоваться в качестве адреса электронной почты отправителя. По умолчанию «email». |
fiarFrom | Необязательный. Если установлен, будет указан адрес «От:»(«From:») для электронного письма. По умолчанию используется системная настройка emailsender . |
fiarFromName | Необязательный. Если установлен, будет указано имя отправителя для «От:»(«From:»). |
fiarSender | Необязательный. Укажите заголовок отправителя электронной почты. По умолчанию используется системная настройка emailsender . |
fiarHtml | Необязательный. Должно ли электронное письмо быть в формате HTML. По умолчанию 1. |
fiarReplyTo | Обязательный. Адрес электронной почты, на который можно дать ответ («Reply-To:»). |
fiarReplyToName | Необязательный. Имя поля для ответа через «Reply-To:» |
fiarCC | Список писем, разделенных запятыми, для отправки через «CC:». |
fiarCCName | Необязательный. Список имен, разделенных запятыми, для попарного сопряжения со значениями fiarCC . |
fiarBCC | Список email адресов, разделенных запятыми, для отправки через скрытую копию («BCC»). |
fiarBCCName | Необязательный. Список имен, разделенных запятыми, для сопряжения со значениями fiarBCC . |
fiarMultiWrapper | Оборачивает значения, переданные через чекбоксы/списки множественного выбора этим значением. По умолчанию используется только значение. |
fiarMultiSeparator | Разделяет чекбоксы/списки множественного выбора этим значением. По умолчанию используется новая строка. («\n») |
fiarFiles | Необязательный. Список файлов, разделенных запятыми, для добавления в качестве вложения к электронному письму. Вы не можете использовать здесь URL-адрес, только путь к локальной файловой системе. |
fiarRequired | Необязательный. Если установлено значение false, обработчик FormItAutoResponder не останавливается, когда поле, определенное в fiarToField , остается пустым. По умолчанию true. |
Хук FormItSaveForm
Этот хук сохранит отправленные формы внутри Formit CMP.
Поддерживаемые параметры
Хук имеет следующие параметры, которые нужно передать в вызов сниппета FormIt:
Имя | Описание | Пример |
---|---|---|
formName | Название формы. По умолчанию «form-{resourceid}». | |
formEncrypt | Если установлено значение «1» (true), отправленная форма будет зашифрована перед сохранением в БД. | |
formFields | Список полей, разделенных запятыми, которые будут сохранены. По умолчанию будут сохранены все поля, включая кнопку отправки. | |
fieldNames | Измените имя поля внутри CMP. Например, если имя поля — «email2», вы можете изменить имя на «дополнительный адрес электронной почты». | &fieldnames=`fieldname==Название поля,anotherone==Другое название поля` |
Вспомогательные сниппеты
FormItRetriever
FormItRetriever — это вспомогательный Сниппет для FormIt, который будет получать пользовательские данные последней отправки формы через FormIt. Это полезно для страниц, куда пользователь перенаправляется после отправки формы.
Использование
Просто добавьте этот Сниппет на любую страницу, с которой вы перенаправляете (используя свойство FormIt &redirectTo
), и установите &store=1
в вызове FormIt:
[[!FormItRetriever]]
А затем отобразите данные формы с плейсхолдерами, относящимися к именам полей, например:
<p><Благодарим [[!+fi.name]] за сообщение. Письмо будет отправлено вам на ящик [[!+fi.email]].</p>
Не забудьте установить &store=1
в вызове FormIt, чтобы сниппет понимал, что нужно хранить значение.
Обязательно вызывайте Плейсхолдеры некэшированными. Эти данные изменяются при каждом запросе, поэтому Плейсхолдеры также должны изменять каждый запрос.
Свойства FormItRetriever
FormItRetriever имеет некоторые свойства по умолчанию, которые вы можете переопределить. Вот что там есть:
Имя | Описание | По умолчанию |
---|---|---|
placeholderPrefix | Строка для префикса всех плейсхолдеров для полей формы, которые будут установлены этим Сниппетом. | fi. |
redirectToOnNotFound | Если данные не найдены и если это свойство установлено, перенаправить на Ресурс с этим идентификатором. | |
eraseOnLoad | Если указано, при загрузке будут удалены сохраненные данные формы. Настоятельно рекомендуется оставить значение 0 , если вы не хотите, чтобы данные загружались только один раз. |
|
storeLocation | Откуда взять данные формы. Должно быть равно свойству storeLocation вашего вызова Сниппета FormIt. Возможные значения: ‘cache’ и ‘session’. |
cache |
Пример
Отправим форму с автоматическим ответом и защитой от спама, затем перенаправим на страницу с благодарностью, где загружается последняя отправленная форма, и, если она не найдена, перенаправим на Ресурс с идентификатором 444.
На вашей странице с формой:
[[!FormIt?
&submitVar=`go`
&hooks=`spam,FormItAutoResponder,redirect`
&emailTo=`my@email.com`
&store=`1`
&redirectTo=`123`
]]
<form action="[[~[[*id]]]]" method="post">
<input type="hidden" name="nospam" value="" />
<label for="name">Имя: [[!+fi.error.name]]</label>
<input type="text" name="name:required" id="name" value="[[!+fi.name]]" />
<label for="email">Email: [[!+fi.error.email]]</label>
<input type="text" name="email:email:required" id="email" value="[[!+fi.email]]" />
<label for="message">Сообщение: [[!+fi.error.message]]</label>
<textarea name="message:stripTags" id="message" cols="55" rows="7">[[!+fi.message]]</textarea>
<br />
<input type="submit" name="go" value="Отправить" />
</form>
На вашей странице подтверждения (Resource ID 123):
[[!FormItRetriever? &redirectToOnNotFound=`444`]]
<p>Спасибо [[!+fi.name]] за ваше обращение. Вам будет отправлен автоматически электронное письмо на адрес [[!+fi.email]]. Текст вашего обращения:</p>
[[!+fi.message]]
FormItCountryOptions
FormItCountryOptions это вспомогательный Сниппет для FormIt, начиная с версии 1.7.0, для вывода список стран мира. Это полезно для форм, которым нужен, например, раскрывающийся список стран.
В настоящий момент доступны переводные списки стран для следующих языков — английский, французский, голландский, немецкий, бельгийский и шведский.
Замечание: В ближайшее время появится список стран по-русски.
Какой язык для списка стран выбрать — решается на основании значения системной переменной cultureKey
, по умолчанию — английский (значение ключа us
).
Использование
Просто добавьте Сниппет в вашу форму внутрь <select>
элемента:
<select name="country">
[[!FormItCountryOptions? &selected=`[[!+fi.country]]`]]
</select>
Обратите внимание, как мы передаем значение плейсхолдера «fi.country» (в котором хранится значение поля страны) в выбранный параметр. Это сообщает FormItCountryOptions выбрать последний выбранный параметр в форме.
Свойства FormItCountryOptions
FormItCountryOptions имеет некоторые свойства по умолчанию, которые вы можете переопределить. Вот что там есть:
Имя | Описание | По умолчанию |
---|---|---|
selected | Код страны для отметки, что она выбрана | |
selectedAttribute | Необязательный. Атрибут HTML, добавляемый в выбранную страну. | selected=»selected» |
tpl | Необязательный. Код, используемый для каждого варианта раскрывающегося списка стран | |
useIsoCode | If 1, для значения будет использоваться аббревиатура (код страны)). Если 0, будет использоваться полное имя | 1 |
prioritized | Необязательный. Разделенный запятыми список кодов ISO для стран, которые можно поместить в приоритетную optiongroup вверху раскрывающегося списка. Это можно использовать для часто выбираемых стран. | |
prioritizedGroupText | Необязательный. Если установлено и используется &prioritized , будет добавлена текстовая метка для группы опций с приоритетом. |
|
allGroupText | Необязательный. Если установлено и используется &prioritized , будет добавлена текстовая метка для группы опций для всех остальных стран. |
|
optGroupTpl | Необязательный. Если установлено и используется &prioritized , будет использован этот фрагмент для разметки группы параметров. |
optgroup |
toPlaceholder | Необязательный. Используйте это, чтобы установить вывод в качестве плейсхолдера вместо вывода напрямую. |
Приоритетные страны
Иногда вы хотите, чтобы определенные страны отображались вверху списка в блоке optiongroup
. FormItCountryOptions поддерживает это с помощью параметра &prioritized
. Например:
[[!FormItCountryOptions?
&selected=`[[+fi.country]]`
&prioritized=`US,GB,DE,RU,JP,FR,NL,CA,AU,UA`
]]
Будет выведен список, который выглядит так:
Вы просто передаете коды ISO стран, которым вы хотите присвоить приоритет, в параметре &prioritized
. Вы также можете настроить текст optiogroup
с помощью свойств &prioritizedGroupText
и &allGroupText
.
FormItStateOptions
FormItStateOptions это вспомогательный Сниппет для FormIt, с версии 1.7.0+, который возвращает список регионов. Это полезно для форм, которым нужен такой список.
В настоящий момент доступен переводные списки регионов для следующих стран — США, Франция, Нидерланды, Германия, Бельгия, Швеция и Канада.
Замечание: В ближайшее время появится список регионов РФ.
Какой список регионов выбрать — решается на основании значения системной переменной cultureKey
, по умолчанию — регионы США (значение ключа us
).
Использование
Просто добавьте Сниппет в вашу форму внутрь <select>
элемента:
<select name="state">
[[!FormItStateOptions? &selected=`[[!+fi.state]]`]]
</select>
Обратите внимание, как мы передаем значение плейсхолдера «fi.state» (в котором хранится значение поля штата) в выбранный параметр. Это сообщает FormItStateOptions выбрать последний выбранный параметр в форме.
Свойства FormItStateOptions
FormItStateOptions имеет некоторые свойства по умолчанию, которые вы можете переопределить. Вот что там есть:
Имя | Описание | По умолчанию |
---|---|---|
selected | Код штата/региона для отметки, что он выбран | |
selectedAttribute | Необязательный. Атрибут HTML, добавляемый в выбранный штат. | selected=»selected» |
tpl | Необязательный. Код, используемый для каждого варианта раскрывающегося списка регионов. | |
useAbbr | Если указано ‘1’, для значения будет использоваться аббревиатура(код региона)). Если 0, будет использоваться полное имя | 1 |
toPlaceholder | Необязательный. Используйте это, чтобы установить вывод в качестве плейсхолдера вместо вывода напрямую. |
Дополнительно
Обработка выпадающих списков, чекбоксов и радио кнопок
Хотя FormIt может обрабатывать поля любого типа, для выпадающих селекторов, радио-кнопок и флажков (чекбоксов) требуются специальные указания из-за их особенностей их значения.
Обработка выпадающих списков
FormIt предоставляет служебный Сниппет под названием FormItIsSelected, который можно использовать как Выходной фильтр для обработки выбранных значений (selected="selected"
). Например:
<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>
<!-- Это также могло бы работать -->
<option value="yellow" [[!+fi.color:is=`yellow`:then=`selected`]]>Желтый</option>
</select>
Это автоматически обработает выбранное поле, запоминая его во время проверки и обработки ошибок.
Обработка чекбоксов и радио кнопок
Обработка флажков и радио кнопок очень похожа на обработку селекторов, с той лишь разницей, что вы проверяете здесь «обязательность». FormIt предоставляет вспомогательный выходной фильтр FormItIsChecked
, аналогичный FormItIsSelected
, для обработки сохраняемости значений.
В этом примере будут обрабатываться флажки, c сохранением их выбранных значений:
<label>Цвет: [[!+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`]] > Зеленый
Обратите внимание, что []
удаляется при установке плейсхолдера «fi.error.color».
Обработка атрибута required для чекбокса
Поскольку HTML не отправляет значение, если флажок не установлен, проверки «обязательности» (required) флажка может быть затруднительной. Перед этим вам нужно будет добавить скрытое (type = hidden
) поле, чтобы отправлялось хотя бы пустое значение:
[[!FormIt? &validate=`color:required`]] ...
<label>Цвет: [[!+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`]]"
/>
Зеленый
Это успешно проверит, чтобы при отправке формы был установлен хотя бы один флажок.
Обработка чекбоксов и мульти-селектора в пользовательском хуке
Если вы хотите установить поле массива (т.е. группу флажков с тем же именем или мульти-селектор) в preHook, вам нужно применить json_encode
для значения массива.
$hook->setValue('hobbies',json_encode(array('music','films','books')));
Использование пустого поля для защиты от спама
Часто спам-боты заполняют все поля формы, чтобы пройти проверку. Таким образом, хороший способ предотвратить спам — это добавить поле в вашу форму и потребовать, чтобы оно было пустым для успешной отправки. Для этого можно использовать валидатор blank
, который можно использовать для добавления поля nospam
. Пример:
<input type="hidden" name="workemail" value="" />
Затем в вызове FormIt добавьте проверку на пустоту:
[[!FormIt? &validate=`workemail:blank`]]
Если вы хотите отобразить сообщение об ошибке, вы можете сделать это в обычном синтаксисе FormIt (в этом примере будет [[+fi.error.workemail]]
).
Убедитесь, что вы не используете существующее имя поля в вашей форме для поля nospam
! Это может прервать обработку вашей формы FormIt.
Заключение
FormIt — это универсальный инструмент для работы с формами в MODX. Он легко настраивается, поддерживает расширения и подходит для большинства задач, связанных с обработкой форм. Используя эту документацию, вы сможете создать и настроить формы любой сложности.