03 Формы
Phalcon\Forms\Form - это компонент, который помогает создавать и поддерживать формы в веб-приложениях.
В следующем примере показано его основное использование:
<?php use Phalcon\Forms\Form; use Phalcon\Forms\Element\Text; use Phalcon\Forms\Element\Select; $form = new Form(); $form->add( new Text( 'name' ) ); $form->add( new Text( 'telephone' ) ); $form->add( new Select( 'telephoneType', [ 'H' => 'Home', 'C' => 'Cell', ] ) );
Формы могут отображаться на основе определения формы:
<h1> Contacts </h1> <form method='post'> <p> <label> Name </label> <?php echo $form->render('name'); ?> </p> <p> <label> Telephone </label> <?php echo $form->render('telephone'); ?> </p> <p> <label> Type </label> <?php echo $form->render('telephoneType'); ?> </p> <p> <input type='submit' value='Save' /> </p> </form>
Каждый элемент формы может быть отрисован в соответствии с требованиями разработчика. Внутренне, Phalcon\Tag используется для создания правильного HTML для каждого элемента, и вы можете передать дополнительные атрибуты HTML в качестве второго параметр render()
:
<p> <label> Name </label> <?php echo $form->render('name', ['maxlength' => 30, 'placeholder' => 'Введите свое имя']); ?> </p>
HTML атрибуты также могут быть установлены в определении элемента:
<?php $form->add( new Text( 'name', [ 'maxlength' => 30, 'placeholder' => 'Введите свое имя', ] ) );
Инициализация форм
Как было показано ранее, формы можно инициализировать вне класса формы путем добавления в него элементов. Можно повторно использовать код или организовать классы формы, реализующие форму в отдельном файле:
<?php use Phalcon\Forms\Form; use Phalcon\Forms\Element\Text; use Phalcon\Forms\Element\Select; class ContactForm extends Form { public function initialize() { $this->add( new Text( 'name' ) ); $this->add( new Text( 'telephone' ) ); $this->add( new Select( 'telephoneType', TelephoneTypes::find(), [ 'using' => [ 'id', 'name', ], 'useEmpty' => true, 'emptyText' => 'Выбирать один...', 'emptyValue' => '', ] ) ); } }
Кроме того, Select elements поддерживает параметр useEmpty
, позволяющий использовать пустой элемент в списке доступных параметров. Варианты emptyText
andemptyValue
являются необязательными, которые позволяют настраивать, соответственно, текст и значение пустой элемент
Phalcon\Forms\Form расширяет Phalcon\Di\Injectable так что у вас есть доступ к службам приложений, если это необходимо:
<?php use Phalcon\Forms\Form; use Phalcon\Forms\Element\Text; use Phalcon\Forms\Element\Hidden; class ContactForm extends Form { /** * Этот метод возвращает значение по умолчанию для поля 'csrf' */ public function getCsrf() { return $this->security->getToken(); } public function initialize() { // Задать ту же форму, что и сущность $this->setEntity($this); // Добавьте текстовый элемент для 'email' $this->add( new Text( 'email' ) ); // Добавить текстовый элемент, чтобы поместить скрытый CSRF $this->add( new Hidden( 'csrf' ) ); } }
Связанный объект, добавленный в форму в параметрах инициализации и созданных пользователей, передается конструктору формы:
<?php use Phalcon\Forms\Form; use Phalcon\Forms\Element\Text; use Phalcon\Forms\Element\Hidden; class UsersForm extends Form { /** * Forms initializer * * @param Users $user * @param array $options */ public function initialize(Users $user, array $options) { if ($options['edit']) { $this->add( new Hidden( 'id' ) ); } else { $this->add( new Text( 'id' ) ); } $this->add( new Text( 'name' ) ); } }
В экземпляре формы необходимо использовать:
<?php $form = new UsersForm( new Users(), [ 'edit' => true, ] );
Валидация
Формы Phalcon интегрированы с компонентом validation для мгновенной проверки. Для каждого элемента могут быть установлены встроенные или настраиваемые валидаторы:
<?php use Phalcon\Forms\Element\Text; use Phalcon\Validation\Validator\PresenceOf; use Phalcon\Validation\Validator\StringLength; $name = new Text( 'name' ); $name->addValidator( new PresenceOf( [ 'message' => 'Имя обязательное', ] ) ); $name->addValidator( new StringLength( [ 'min' => 10, 'messageMinimum' => 'Это слишком короткое имя', ] ) ); $form->add($name);
Затем вы можете проверить форму в соответствии с введенным пользователем пользователем:
<?php if (!$form->isValid($_POST)) { $messages = $form->getMessages(); foreach ($messages as $message) { echo $message, '<br>'; } }
Валидаторы выполняются в том же порядке, в каком они были зарегистрированы.
По умолчанию сообщения, сгенерированные всеми элементами в форме, объединяются, чтобы их можно было перемещать с помощью одного foreach, вы можете изменить это поведение, чтобы получить сообщения, разделенные полем:
<?php foreach ($form->getMessages(false) as $attribute => $messages) { echo 'Сообщения, созданные ', $attribute, ':', "\n"; foreach ($messages as $message) { echo $message, '<br>'; } }
Или получить конкретные сообщения для элемента:
<?php $messages = $form->getMessagesFor('name'); foreach ($messages as $message) { echo $message, '<br>'; }
Фильтрация
Форма также может фильтровать данные до их проверки. Вы можете устанавливать фильтры в каждом элементе:
<?php use Phalcon\Forms\Element\Text; $name = new Text( 'name' ); // Set multiple filters $name->setFilters( [ 'string', 'trim', ] ); $form->add($name); $email = new Text( 'email' ); // Установить один фильтр $email->setFilters( 'email' ); $form->add($email);
Forms + Entities
Сущность, такая как экземпляр model/collection/plainили просто простой PHP-класс, может быть привязана к форме, чтобы устанавливать значения по умолчанию в элементах формы или легко присваивать значения из формы объекту:
<?php $robot = Robots::findFirst(); $form = new Form($robot); $form->add( new Text( 'name' ) ); $form->add( new Text( 'year' ) );
Когда форма отображается, если нет значений по умолчанию, назначенных элементам, они будут использовать те, которые предоставляются объектом:
<?php echo $form->render('name'); ?>
Вы можете проверить форму и присвоить значения с пользовательского ввода следующим образом:
<?php $form->bind($_POST, $robot); // Проверить, действительна ли форма if ($form->isValid()) { // Save the entity $robot->save(); }
Также возможно создание простого класса как объекта:
<?php class Preferences { public $timezone = 'Europe/Amsterdam'; public $receiveEmails = 'No'; }
Используя этот класс как сущность, он позволяет форме принимать значения по умолчанию из него:
<?php $form = new Form( new Preferences() ); $form->add( new Select( 'timezone', [ 'America/New_York' => 'New York', 'Europe/Amsterdam' => 'Amsterdam', 'America/Sao_Paulo' => 'Sao Paulo', 'Asia/Tokyo' => 'Tokyo', ] ) ); $form->add( new Select( 'receiveEmails', [ 'Yes' => 'Yes, please!', 'No' => 'No, thanks', ] ) );
Сущности могут реализовывать методы get, которые имеют более высокий приоритет, чем открытые свойства. Эти методы предоставляют больше свободы для создания значений:
<?php class Preferences { public $timezone; public $receiveEmails; public function getTimezone() { return 'Europe/Amsterdam'; } public function getReceiveEmails() { return 'No'; } }
Элемент формы
Phalcon предоставляет набор встроенных элементов для использования в формах, все эти элементы расположены в пространстве имен Phalcon\Forms\Element:
Name | Description |
---|---|
Phalcon\Forms\Element\Check | Генерирует элементы INPUT[type=check] |
Phalcon\Forms\Element\Date | Генерирует элементы INPUT[type=date] |
Phalcon\Forms\Element\Email | Генерирует элементы INPUT[type=email] |
Phalcon\Forms\Element\File | Генерирует элементы INPUT[type=file] |
Phalcon\Forms\Element\Hidden | Генерирует элементы INPUT[type=hidden] |
Phalcon\Forms\Element\Numeric | Генерирует элементы INPUT[type=number] |
Phalcon\Forms\Element\Password | Генерирует элементы INPUT[type=password] |
Phalcon\Forms\Element\Radio | Генерирует элементы IMPUT[type=radio] |
Phalcon\Forms\Element\Select | Генерирует элементы тега SELECT (комбинированные списки) на основе выбора |
Phalcon\Forms\Element\Submit | Генерирует элементы INPUT[type=submit] |
Phalcon\Forms\Element\Text | Генерирует элементы INPUT[type=text] |
Phalcon\Forms\Element\TextArea | Генерирует элементы TEXTAREA |
Обратные вызовы событий
Всякий раз, когда формы реализуются как классы, обратные вызовы: beforeValidation()
и afterValidation()
могут быть реализованы в классе формы для выполнения предварительных валидаций и пост-валидации:
<?php use Phalcon\Forms\Form; class ContactForm extends Form { public function beforeValidation() { } }
Рендеринг форм
Вы можете отобразить форму с полной гибкостью, в следующем примере показано, как визуализировать каждый элемент с помощью стандартной процедуры:
<form method='post'> <?php // Перейти в форму foreach ($form as $element) { // Получить любые сгенерированные сообщения для текущего элемента $messages = $form->getMessagesFor( $element->getName() ); if (count($messages)) { // Вывод каждого элемента echo '<div class='$messages'>'; foreach ($messages as $message) { echo $message; } echo '</div>'; } echo '<p>'; echo '<label for='', $element->getName(), ''>', $element->getLabel(), '</label>'; echo $element; echo '</p>'; } ?> <input type='submit' value='Send' > </form>
Или повторите использование логики в своем классе формы:
<?php use Phalcon\Forms\Form; class ContactForm extends Form { public function initialize() { // ... } public function renderDecorated($name) { $element = $this->get($name); // Получить любые сгенерированные сообщения для текущего элемента $messages = $this->getMessagesFor( $element->getName() ); if (count($messages)) { // Печать каждого элемента echo "<div class='messages'>"; foreach ($messages as $message) { echo $this->flash->error($message); } echo '</div>'; } echo '<p>'; echo '<label for="', $element->getName(), '">', $element->getLabel(), '</label>'; echo $element; echo '</p>'; } }
В представлении:
<?php echo $element->renderDecorated('name'); echo $element->renderDecorated('telephone');
Создание элементов формы
В дополнение к элементам формы, предоставленным Phalcon, вы можете создавать свои собственные элементы:
<?php use Phalcon\Forms\Element; class MyElement extends Element { public function render($attributes = null) { $html = // ... Произведите некоторый HTML return $html; } }
Менеджер форм
Этот компонент предоставляет менеджер форм, который может быть использован разработчиком для регистрации форм и доступа к ним через локатор службы:
<?php use Phalcon\Forms\Manager as FormsManager; $di['forms'] = function () { return new FormsManager(); };
Формы добавляются в менеджер форм и ссылаются на уникальное имя:
<?php $this->forms->set( 'login', new LoginForm() );
Используя уникальное имя, формы могут быть доступны в любой части приложения:
<?php $loginForm = $this->forms->get('login'); echo $loginForm->render();