Получение обратной связи с помощью форм (Symfony 6.2 Docs)

Пришло время добавить возможность получения обратной связи от наших посетителей. Они смогут оставлять комментарии с помощью HTML-формы.

Используйте бандл Maker для создания класса формы:

Класс App\Form\CommentType определяет форму для сущности App\Entity\Comment:

src/Form/CommentType.php

Тип формы задаёт поля формы, связанные с моделью. Он выполняет преобразование между отправленными данными и свойствами класса модели. По умолчанию для определения конфигурации каждого поля, Symfony использует метаданные (например, метаданные Doctrine) сущности Comment. К примеру, поле text будет отрисовано как textarea, так как в базе данных используется столбец для хранения текста, а не строки.

Для отображения формы, создайте её в контроллере и передайте в шаблон:

Никогда не следует инициализировать класс формы напрямую. Для упрощения создания форм, используйте метод createForm() класса AbstractController.

Отобразить форму в шаблоне можно с помощь Twig-функции form:

После обновления страницы конференции в браузере, обратите внимание, что каждое поле формы использует HTML-элемент, соответствующий типу модели:

Функция form() создаёт HTML-форму, используя всю информацию, определённую в типе формы. В том числе эта функция добавляет обязательный для поля загрузки файла атрибут

enctype=multipart/form-data к тегу <form>. Более того, эта функция также берёт на себя отображение сообщений об ошибках после отправки формы. Переписав шаблоны по умолчанию можно изменить абсолютно всё, однако для нашего проекта это не понадобится.

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

Обратите внимание, что мы добавили кнопку отправки. Это позволит нам продолжить использовать простое выражение

{{ form(comment_form) }} в шаблоне.

Некоторые поля не могут быть автоматически сконфигурированы, например, photoFilename — одно из них. Сущность Comment должна только сохранять имя файла с фотографией, форма в свою очередь берёт на себя обработку загрузки файла. Для этого мы добавили поле photo с отключённой опцией mapped, таким образом это поле не будет связано ни с одним свойством в сущности Comment. Мы будем управлять этим полем вручную, чтобы реализовать определённую логику (например, сохранять загруженную фотографию на диск).

В качестве примера настройки, у некоторых полей мы также изменили метки по умолчанию.

Тип формы определяет её внешний вид (используя валидацию HTML5). Пример сгенерированной HTML-формы:

Наша форма содержит поле для электронного адреса (атрибут типа со значением email). Кроме этого, большинство полей обязательны для заполнения (имеют атрибут required). Обратите внимание, что форма также включает в себя скрытое поле

_token, используемое для защиты от CSRF-атак.

Если при отправке формы HTML-валидация не срабатывает, то на сервер могут попасть некорректные данные. Например, это может случиться при использовании HTTP-клиентов, таких как cURL, игнорирующих правила валидации.

Нам также необходимо добавить некоторые правила валидации для модели Comment:

Мы написали достаточно кода, чтобы отобразить форму.

Теперь в контроллере нам необходимо обработать отправку формы и сохранить данные из неё в базе данных:

После отправки формы объект Comment будет обновлён в соответствии с полученными данными.

Конференция должна быть такой же, как указано в URL-адресе (мы удалили его из формы).

В случае, если данные заполненной формы некорректные, мы по-прежнему перенаправляем пользователя на страницу конференции, однако теперь форма будет заполнена введёнными ранее значениями, а также отобразит, какие ошибки были допущены при её заполнении.

Теперь попробуйте заполнить и отправить форму. Всё должно отработать правильно и данные сохраниться в базе данных (проверьте в административной панели). Тем не менее, есть одна проблема — фотографии. Они не сохраняются, так как мы ещё не реализовали обработку их в контроллере.

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

public/uploads/photos.

Поскольку мы не хотим жёстко указывать путь к каталогу в коде, нам нужен способ глобально хранить его в конфигурации. Symfony Container способен хранить параметры в дополнение к сервисам, которые являются скалярами, помогающими конфигурировать сервисы:

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

Autowire.

Теперь у нас есть всё для имплементации логики, необходимой для сохранения загруженного файла:

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

Попробуйте загрузить PDF-файл вместо фотографии. Вы увидите сообщения об ошибках в действии. Сейчас они выглядят ужасно, но пока не обращайте внимание на это — мы сделаем всё красиво в последующих шагах, когда будем работать над дизайном сайта. Для стилизации элементов форм нам достаточно поменять одну строчку в конфигурации.

После отправки формы, если что-то не работает как нужно, используйте панель «Form» в профилировщике Symfony. На данной странице вы сможете увидеть информацию о форме, всех её параметрах, отправленные данные, включая то, как они были преобразованы. Если форма содержит ошибки, они так же будут показаны.

Порядок взаимодействия с формой, как правило, выглядит следующим образом:

  • Форма отображается на странице;
  • Пользователь отправляет форму через POST-запрос;
  • Сервер перенаправляет пользователя на другую или ту же самую страницу, на которой находится форма.

Но как нам использовать профилировщик в случае успешной отправки формы? Из-за перенаправления мы никогда не увидим отладочную панель после отправки POST-запроса. Не беда — на перенаправленной странице в панели отладки наведите на зелёную область с надписью «200». Вы увидите, что запрос был перенаправлен (об этом указывает надпись «302»), а рядом есть ссылка на профилировщик (в скобках).

Перейдите по ссылке, чтобы открыть профилировщик этого POST-запроса, затем перейдите на панель «Form».

На данный момент административная панель показывает всего лишь название файла фотографии, хотя мы ожидаем увидеть само изображение:

Не торопитесь фиксировать изменения! Чтобы загруженные файлы фотографий не попали в Git-репозиторий, добавьте директорию

/public/uploads в файл . gitignore:

На последнем шаге мы рассмотрим возможность хранения загруженных файлов на продакшен-серверах. Зачем нам нужно что-то делать для этого? Всё из-за того, что большинство современных облачных платформ по ряду причин используют контейнеры только для чтения. Platform.sh — не исключение.

В Symfony-проекте далеко не всё может быть только для чтения. Мы усердно старались закешировать как можно больше данных при сборке контейнера (во время прогрева кеша), однако Symfony всё ещё нужно сохранять файлы пользовательского кеша, логов, сессий (если они хранятся в файловой системе) и т.д.

Откройте файл .platform.app.yaml. В нём уже есть точка монтирования с возможностью записи, указанная для директории var/. Директория var/ — единственное место в файловой системе, в которую Symfony может что-то записывать (кеш, логи и т.п.).

Создадим новую точку монтирования для загруженных фотографий:

Теперь вы можете развернуть код и убедиться в том, что файлы фотографий сохраняются в директории public/uploads/, так же как и в локальной версии.

This work, including the code samples, is licensed under a Creative Commons BY-NC-SA 4.0 license.

Version

Шаблоны > Форма для отправки E-Mail

Вывод данного раздела настраивается в файле feedback.tpl В этом разделе настраиваются шаблоны, которые используются при выводе формы для отправки E-Mail. Редактирование данного раздела не рекомендуется без знания HTML, потому что используется имена полей которые передаются в скрипт через форму, другими словами вы можете редактировать текст по своему усмотрению, но не изменяйте имена полей, это крайне важно.  Возможно использование следующих тегов:

 

{recipient} — Выводит список получателей

[not-logged] и [/not-logged] — Выводит текст между тегами если посетитель не зарегистрирован

{code} — Выводит код отображения CAPTCHA

[sec_code] и [/sec_code] Выводит текст если в настройках скрипта включена стандартная CAPTCHA

[recaptcha] и [/recaptcha] Выводит текст если в настройках скрипта включена  reCAPTCHA

{recaptcha} Выводит виджет reCAPTCHA если в настройках скрипта включен данный тип вывода каптчи

[attachments] текст [/attachments] Выводят текст, заключённый в них, если разрешена отправка файлов в обратной связи для данной группы пользователей.

 

 

Также у вас есть возможность использования дополнительных полей в разделе обратной связи на сайте. Для того чтобы добавить дополнительное поле в форму обратной связи, вам необходимо только разместить необходимое поле с определенным именем в форме, после чего оно будет доступно для использования в шаблонах e-mail сообщений. Для добавления дополнительного поля в форму, для поля ввода необходимо использовать атрибут с именем: name=»xfield[X]», где X это имя поля, написанное латинскими буквами. Например, вы хотите разместить в форме обратной связи поле для заполнения номера телефона, для этого в шаблоне feedback.tpl размещаете поле:

 

<input placeholder=»Ваш номер телефона» type=»text» name=»xfield[tel]»>

 

где tel это уникальное имя дополнительного поля, а в шаблоне e-mail сообщений в админпанели размещаете тег: {%tel%}, после чего заполненный пользователем номер телефона будет также присылаться вместе с сообщением. Допускается использование любого количества дополнительных полей.

 

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

 

Непосредственно для прикрепления файлов к форме вы можете использовать тег:

 

<input name=»attachments[]» type=»file» multiple>

 

при этом имя тега и количество тегов может быть любым, главное это использование type=»file» в атрибуте. DLE сам посчитает все прикреплённые к письму файлы и их соответствие настройкам групп.

 

Также имеется возможность использования нескольких форм обратной связи на сайте. Для этого используется специально сформированный URL в браузере. Для отправки стандартной формы обратной связи используется адрес http://вашсайт.ru/index.php?do=feedback Для того чтобы добавить ещё одну форму связи вы можете использовать адрес http://вашсайт. ru/index.php?do=feedback&template=X1&mailtemplate=X2, где X1 это имя шаблона для шаблона формы обратной связи, а X2 это имя шаблона письма, которое будет отправляться через эту форму. При этом если задан шаблон X1, то на сервере в папке шаблона у вас должен находится файл с именем feedback_X1.tpl, а если задан шаблон X2, то на сервере в папке шаблона у вас должен находится файл с именем email_X2.tpl. Например, при использовании URL http://вашсайт.ru/index.php?do=feedback&template=test&mailtemplate=test в папке вашего шаблона должен находится файл feedback_test.tpl для формы обратной связи и email_test.tpl для шаблона отправляемого сообщения. Эти файлы поддерживают все те же теги что и стандартная форма обратной связи, и стандартный шаблон e-mail сообщений в админпанели. Тем самым с учётом того что формы обратной связи поддерживают дополнительные поля разного типа, вы можете организовать на своём сайте, несколько различных форм обратной связи.

Создать форму обратной связи в HTML-коде

Создать форму обратной связи в HTML-коде

  • Автор сообщения: