Ссылка: действия формы⚓︎
Действия формы⚓︎
Мы видели некоторые примеры действий формы в приведенном выше примере простой формы. Давайте подробно рассмотрим действия, которые вы можете использовать.
Имейл⚓︎
Отправляет электронное письмо с указанными опциями.
Пример:
process:
- email:
from: "{{ config.plugins.email.from }}"
to: "{{ config.plugins.email.to }}"
subject: "Contact by {{ form.value.name|e }}"
body: "{% include 'forms/data.html.twig' %}"
Отправляет электронное письмо с адреса электронной почты, указанного в конфигурации плагина электронной почты, отправляет его на тот же адрес электронной почты (это контактная форма, мы отправляем её себе). Если вы не хотите использовать другие значения, вы можете свободно опускать from и to, поскольку они уже настроены по умолчанию для использования этих значений. Письмо имеет заданную тему и тело. В этом случае тело создается файлом forms/data.html.twig
, который находится в активном шаблоне (он есть в Antimatter и других основных темах, но не гарантируется, что каждая тема включает его).
Antimatter устанавливает его в
{% for field in form.fields %}
<div><strong>{{ field.label }}</strong>: {{ string(form.value(field.name)|e) }}</div>
{% endfor %}
Короче говоря, он просто зацикливает значения и печатает их в теле письма.
Дополнительные важные параметры электронной почты для формы см. в документации к модулю электронной почты включая составные тела сообщения (хорошо для оценки защиты от спама), reply_to
и вложения.
Атрибут динамической электронной почты⚓︎
Если вы хотите, например, установить поле email.from
из ввода формы, вы можете получить его содержимое и использовать его следующим образом:
from: "{{ form.value.email }}"
В этом случае мы получаем поле «электронная почта» из формы и используем его в качестве атрибута «от». Таким образом, владелец сайта получит электронное письмо и сможет напрямую ответить на электронное письмо, указанное в форме.
Перенаправление⚓︎
Перенаправляет пользователя на другую страницу. Действие выполняется немедленно, поэтому, если вы его используете, вам, вероятно, нужно поместить его в конец списка действий.
Вы также можете установить некоторые или все поля redirect
из поля ввода формы или скрытого поля формы. Вы можете получить его содержимое и использовать его следующим образом:
redirect: "/path to/location/{{ form.value.hiddenfield }}"
В этом случае мы получаем поле "hiddenfield" из формы и используем его для последней части местоположения перенаправления. Это может быть полезно при создании форм, которые, например, перенаправляют на загрузку после завершения.
Сообщение⚓︎
Устанавливает сообщение, которое будет показано при отправке формы.
По умолчанию сообщение будет выводиться в начале элемента form
.
Однако вы можете по желанию изменить представление либо через display
, либо через redirect
.
Сообщение о проверке⚓︎
Вы можете использовать сообщение о непройденной валидации. Например:
username:
type: text
label: Имя пользователя
validate:
required: true
message: Пользовательское сообщение при неудачной валидации!
Это позволит вам написать собственное сообщение, которое пользователи увидят в случае неудачной проверки.
Display⚓︎
После отправки формы её представление будет обновлено, чтобы встроить подстраницу. Так, например, если ваша форма находится в /form
, вы можете встроить подстраницу /form/thankyou
с помощью следующего кода:
Если вы предпочитаете вставлять абсолютный путь к странице, например site.com/thankyou
, добавьте к нему /
: display: /thankyou/
.
Плагин Form предоставляет шаблон formdata
, который подходит для указания целевой страницы, поскольку он выводит результат отправки формы. В приведенном выше примере вы можете создать страницу pages/form/thankyou/formdata.md
.
Antimatter и совместимые темы предоставляют шаблон Twig formdata.html.twig
, который выглядит следующим образом:
{% extends 'partials/base.html.twig' %}
{% block content %}
{{ content }}
<div class="alert">{{ form.message }}</div>
<p>Here is the summary of what you wrote to us:</p>
{% include "forms/data.html.twig" %}
{% endblock %}
Если страница thankyou/formdata.md
---
title: Электронное письмо отправлено!
cache_enable: false
process:
twig: true
---
## Электронное письмо отправлено!
Результатом будет страница с надписью «Электронное письмо отправлено!», за которой следует подтверждающее сообщение и данные формы, введенные на предыдущей странице.
Вы можете использовать любой тип страницы в качестве целевой. Просто создайте свою и установите соответствующий тип целевой страницы.
Сохранение⚓︎
Сохраняет данные формы в файл. Файл сохраняется в папке user/data
во вложенной папке, названной параметром form.name
. Форма должна иметь имя для успешного выполнения этого действия, а подпапка должна быть создана с соответствующими разрешениями, прежде чем данные могут быть сохранены в ней, поскольку новый каталог не будет создан, если он не существует. Например:
fileprefix
иbody
могут содержать разметку Twig.
process:
- save:
fileprefix: feedback-
dateformat: Ymd-His-u
extension: txt
body: "{% include 'forms/data.txt.twig' %}"
operation: create
Тело берется из файла темы templates/forms/data.html.twig
, предоставленного Antimatter и обновленными темами.
«Операция» может быть либо create
(по умолчанию) для создания нового файла для отправки формы, либо add
для добавления в отдельный файл.
Обратите внимание, что для операции add
теперь требуется статическое имя файла: для определения см. пример ниже.
Капча⚓︎
Чтобы также проверить правильность ввода капчи на стороне сервера, добавьте действие процесса ввода капчи.
recaptcha_secret
не является обязательным и будет использовать значения конфигурации плагина формы, если вы предоставили их там.
IP-адрес пользователя⚓︎
Отображение IP-адреса пользователя на выходе. Поместите его над процессами электронной почты/сохранения в form.md
, чтобы убедиться, что он используется процессами вывода.
Timestamp⚓︎
Добавьте к выходным данным отметку времени отправки формы. Поместите его над процессами электронной почты/сохранения в form.md
, чтобы убедиться, что он используется процессами вывода.
Сброс формы после отправки⚓︎
По умолчанию форма не очищается после отправки. Таким образом, если у вас нет действия display
и пользователь отправляется обратно на страницу формы, она все равно заполнена введенными данными. Если вы хотите избежать этого, добавьте действие reset
:
Запоминание значений полей⚓︎
Используя действие remember
, вы можете позволить своим пользователям «вспоминать» значения некоторых полей. с момента последней отправки формы. Это особенно полезно для форм, которые отправляются многократно, например, анонимная отправка, требующая информации об отправителе.
HTML5 и плагин Form уже предоставляют такую возможность в ограниченном объеме через браузер, так что пользуйтесь этим. Однако вы можете обнаружить, что автозаполнение не работает надежно для некоторых пользователей и полей.
Действие remember
использует куки для хранения последнего значения, поэтому оно будет работать только на том же устройстве и в том же браузере, где браузер настроен на разрешение их использования на вашем сайте.
Чтобы воспользоваться этим действием, просто перечислите имена полей, которые вы хотели бы запомнить.
Например, хорошим вариантом использования является онлайн-форма направления к врачу. Как правило, они заполняются с одного и того же компьютера с некоторыми значениями полей, которые редко меняются, и их скучно заполнять многократно.
process:
- remember:
- referrer-name
- referrer-address
- referrer-specialty
- preferred-practitioner
Настраиваемые действия⚓︎
Вы можете «зацепиться» за обработку формы и выполнять любые операции. Выполняйте индивидуальную обработку, добавляйте данные для онлайн-веб-приложения и даже сохраняйте в базе данных.
Для этого в поле процесса формы добавьте собственное имя обработки, например yourAction
.
Затем создайте простой плагин.
В своем основном файле PHP зарегистрируйтесь для события onFormProcessed
<?php
namespace Grav\Plugin;
use Grav\Common\Plugin;
use RocketTheme\Toolbox\Event\Event;
class EmailPlugin extends Plugin
{
public static function getSubscribedEvents()
{
return [
'onFormProcessed' => ['onFormProcessed', 0]
];
}
}
Затем укажите обработчик для действия saveToDatabase
:
<?php
public function onFormProcessed(Event $event)
{
$form = $event['form'];
$action = $event['action'];
$params = $event['params'];
switch ($action) {
case 'yourAction':
//do what you want
}
}
Если ваша обработка может пойти не так, и вы хотите остановить следующие действия формы, которые выполняются последовательно, вы можете остановить обработку, вызвав stopPropagation
для объекта $event:
Пример кода с обработкой формы доступен в подключаемом модуле формы и в репозиториях подключаемого модуля электронной почты.
Пример обработки нестандартной формы⚓︎
Плагин Form предлагает возможность отправлять электронные письма, сохранять файлы, устанавливать статусные сообщения, и это действительно удобно. Однако иногда вам нужен полный контроль. Это, например, то, что делает плагин входа в систему (Login).
Он определяет внешний вид страницы login.md
:
title: Login
template: form
form:
name: login
fields:
- name: username
type: text
placeholder: Username
autofocus: true
- name: password
type: password
placeholder: Password
Плагин Forms правильно генерирует и отображает форму. Обратите внимание, что нет определения «процесса».
Также отсутствуют формы buttons
, так как они вручную добавляются в templates/login.html.twig
. Здесь также определяются формы «действие» и «задача».
В этом случае задача
- это login.login
, а действие
устанавливается на адрес страницы.
Когда пользователь нажимает "Войти" в форме, Grav вызывает событие onTask.login.login
.
user/plugins/login/login.php
подключается к onTask.login.login
к своему файлу classes/controller.php
, и там происходит аутентификация.