Zend Framework предоставляет отдельный компонент, Zend- Form для ускорения процесса создания и проверки формы. Он соединяет модель и видовой слой. Он предоставляет набор элементов формы для создания полноценной HTML-формы из предопределенных моделей, класс InputFilter для проверки модели по форме и параметры для привязки данных из формы к модели и наоборот.
Установить компонент формы
Компонент формы Zend можно установить с помощью команды Composer, как указано ниже:
composer require zendframework/zend-form
Фреймворк форм Zend имеет три подкомпонента для управления формами. Они как описано ниже подробно —
-
Элементы — используются для определения отдельного элемента управления вводом html, сопоставленного со свойством в модели.
-
Fieldset — используется для группирования элементов и другого набора полей вложенным способом.
-
Форма — используется для создания HTML-формы и состоит из элементов и наборов полей.
Элементы — используются для определения отдельного элемента управления вводом html, сопоставленного со свойством в модели.
Fieldset — используется для группирования элементов и другого набора полей вложенным способом.
Форма — используется для создания HTML-формы и состоит из элементов и наборов полей.
Zend Forms обычно создаются в каталоге модуля // src / Form .
пример
Теперь давайте создадим простую форму для добавления книги в базу данных. Для этого мы должны придерживаться следующих шагов —
Шаг 1: Создать BookForm
Создайте «BookForm.php» в каталоге * myapp / module / Tutorial / src / Form ». Добавьте следующие изменения в файл —
<?php namespace Tutorial\Form; use Zend\Form\Form; class BookForm extends Form { public function __construct($name = null) { parent::__construct('book'); $this->add(array( 'name' => 'id', 'type' => 'Hidden', )); $this->add(array( 'name' => 'author', 'type' => 'Text', 'options' => array( 'label' => 'Author', ), )); $this->add(array( 'name' => 'title', 'type' => 'Text', 'options' => array( 'label' => 'Title', ), )); $this->add(array( 'name' => 'submit', 'type' => 'Submit', 'attributes' => array( 'value' => 'Go', 'id' => 'submitbutton', ), )); } }
Класс Form предоставляет метод add для сопоставления модели и соответствующих деталей формы. мы создали BookForm , расширив класс Form и добавив детали формы для модели Book .
Шаг 2: Обновите модель книги, Book.php
Обновите модель, «Книга» с фильтром и проверкой, как указано ниже —
<?php namespace Tutorial\Model; use Zend\InputFilter\InputFilterInterface; use Zend\InputFilter\InputFilterAwareInterface; use Zend\InputFilter\InputFilter; class Book implements InputFilterAwareInterface { public $id; public $author; public $title; protected $inputFilter; public function setInputFilter(InputFilterInterface $inputFilter) { throw new \Exception("Not used"); } public function getInputFilter() { if (!$this->inputFilter) { $inputFilter = new InputFilter(); $inputFilter->add(array( 'name' => 'id', 'required' => true, 'filters' => array( array('name' => 'Int'), ), )); $inputFilter->add(array( 'name' => 'author', 'required' => true, 'filters' => array( array('name' => 'StripTags'), array('name' => 'StringTrim'), ), 'validators' => array( array( 'name' => 'StringLength', 'options' => array( 'encoding' => 'UTF-8', 'min' => 1, 'max' => 100, ), ), ), )); $inputFilter->add(array( 'name' => 'title', 'required' => true, 'filters' => array( array('name' => 'StripTags'), array('name' => 'StringTrim'), ), 'validators' => array( array( 'name' => 'StringLength', 'options' => array( 'encoding' => 'UTF-8', 'min' => 1, 'max' => 100, ), ), ), )); $this->inputFilter = $inputFilter; } return $this->inputFilter; } public function exchangeArray($data) { $this->id = (!empty($data['id'])) ? $data['id'] : null; $this->author = (!empty($data['author'])) ? $data['author'] : null; $this->title = (!empty($data['title'])) ? $data['title'] : null; } }
Каждая модель должна реализовывать InputFilterAwareInterface . InputFilterAwareInterface предоставляет два метода, setInputFilter () и getInputFilter () .
GetInputFilter используется для получения подробных данных проверки модели. Zend Framework предоставляет богатый набор фильтров и валидаторов для проверки формы. Ниже перечислены некоторые фильтры и валидаторы, используемые в модели книги.
-
StripTags — Удалить нежелательный HTML.
-
StringTrim — удаляет ненужные пробелы.
-
Валидатор StringLength — убедитесь, что пользователь не вводит больше символов, чем указанное ограничение.
StripTags — Удалить нежелательный HTML.
StringTrim — удаляет ненужные пробелы.
Валидатор StringLength — убедитесь, что пользователь не вводит больше символов, чем указанное ограничение.
Шаг 3: Обновите класс BookTable
Включите метод saveBook, чтобы добавить книгу в базу данных.
BookTable.php
<?php namespace Tutorial\Model; use Zend\Db\TableGateway\TableGatewayInterface; class BookTable { protected $tableGateway; public function __construct(TableGatewayInterface $tableGateway) { $this->tableGateway = $tableGateway; } public function fetchAll() { $resultSet = $this->tableGateway->select(); return $resultSet; } public function getBook($id) { $id = (int) $id; $rowset = $this->tableGateway->select(array('id' => $id)); $row = $rowset->current(); if (!$row) { throw new \Exception("Could not find row $id"); } return $row; } public function saveBook(Book $book) { $data = array ( 'author' => $book->author, 'title' => $book->title, ); $id = (int) $book->id; if ($id == 0) { $this->tableGateway->insert($data); } else { if ($this->getBook($id)) { $this->tableGateway->update($data, array('id' => $id)); } else { throw new \Exception('Book id does not exist'); } } } }
Шаг 4: Обновите класс TutorialController
Добавьте новое действие addAction в учебный контроллер — myapp / module / Tutorial / src / Controller / TutorialController.php.
public function addAction() { $form = new BookForm(); $form->get('submit')->setValue('Add'); $request = $this->getRequest(); if ($request->isPost()) { $book = new Book(); $form->setInputFilter($book->getInputFilter()); $form->setData($request->getPost()); if ($form->isValid()) { $book->exchangeArray($form->getData()); $this->bookTable->saveBook($book); // Redirect to list of Tutorial return $this->redirect()->toRoute('tutorial'); } } return array('form' => $form); }
Метод addAction выполняет следующие процессы:
-
Получает объект запроса.
-
Проверяет, является ли http-метод запроса пост- методом.
-
Если http-метод запроса не post , он просто отображает шаблон, add.phtml
-
Если http-метод запроса не post , тогда он устанавливает inputfilter , получает данные запроса и устанавливает их в inputfiler.
-
Проверяет, является ли форма действительной, используя метод isValid () класса Form.
-
Если форма недействительна, она снова отображает шаблон, add.phtml
-
Если форма действительна, она сохраняет книгу в базе данных и перенаправляет на домашнюю страницу.
Получает объект запроса.
Проверяет, является ли http-метод запроса пост- методом.
Если http-метод запроса не post , он просто отображает шаблон, add.phtml
Если http-метод запроса не post , тогда он устанавливает inputfilter , получает данные запроса и устанавливает их в inputfiler.
Проверяет, является ли форма действительной, используя метод isValid () класса Form.
Если форма недействительна, она снова отображает шаблон, add.phtml
Если форма действительна, она сохраняет книгу в базе данных и перенаправляет на домашнюю страницу.
Шаг 5: Добавьте шаблон add.phtml
Создайте шаблон — add.phtml в myapp / module / Tutorial / view / tutorial / tutorial / add.phtml
Add.phtml
<?php $title = 'Add new Book'; $this->headTitle($title); ?> <h1><?php echo $this->escapeHtml($title); ?></h1> <?php if(!empty($form)) { $form->setAttribute('action', $this->url('tutorial', array('action' => 'add'))); $form->prepare(); echo $this->form()->openTag($form); echo $this->formHidden($form->get('id')); echo $this->formRow($form->get('author'))."<br>"; echo $this->formRow($form->get('title'))."<br>"; echo $this->formSubmit($form->get('submit')); echo $this->form()->closeTag(); }
Здесь мы визуализируем форму книги, используя экземпляр Form , $ form .
Шаг 6: Запустите приложение
Теперь мы можем запустить приложение — http: // localhost: 8080 / tutorial / add .
Форма страницы
Страница подтверждения ошибки