Zend Framework - Formularze i walidacja
Zend Framework dostarcza oddzielny komponent, zend-formprzyspieszenie procesu tworzenia i walidacji formularzy. Łączy model i warstwę widoku. Zapewnia zestaw elementów formularza do tworzenia pełnoprawnego formularza html z predefiniowanych modeli, plikuInputFilter klasy, aby sprawdzić poprawność modelu względem formularza i opcji, aby powiązać dane z formularza z modelem i odwrotnie.
Zainstaluj składnik formularza
Komponent formularza Zend można zainstalować przy użyciu Composer polecenie jak określono poniżej -
composer require zendframework/zend-form
Framework formularzy Zend ma trzy podskładniki do zarządzania formularzami. Są one szczegółowo opisane poniżej -
Elements - Służy do definiowania pojedynczej kontrolki wejściowej HTML odwzorowanej na właściwość w modelu.
Fieldset - Służy do grupowania elementów i innych fieldset w sposób zagnieżdżony.
Form - Służy do tworzenia formularza html i składa się z elementów i zestawów pól.
Formularze Zend są zwykle tworzone w ramach module//src/Form informator.
Przykład
Stwórzmy teraz prosty formularz do dodania bookdo bazy danych. Aby to zrobić, powinniśmy postępować zgodnie z następującymi krokami -
Krok 1: Utwórz BookForm
Utwórz „BookForm.php” w katalogu * myapp / module / Tutorial / src / Form ”. Dodaj następujące zmiany w pliku -
<?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',
),
));
}
}
Plik Form class zapewnia add methodaby zmapować model i odpowiadające mu szczegóły formularza. stworzyliśmyBookForm poprzez rozszerzenie Form class i dodałem szczegóły formularza dla Book Model.
Krok 2: Zaktualizuj model książki Book.php
Zaktualizuj model, ‘Book’ z filtrem i walidacją, jak określono poniżej -
<?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;
}
}
Każdy model powinien implementować InputFilterAwareInterface. InputFilterAwareInterface udostępnia dwie metody,setInputFilter() i getInputFilter().
GetInputFilter służy do pobierania szczegółów walidacji modelu. Framework Zend zapewnia bogaty zestaw filtrów i walidatorów do walidacji formularza. Niektóre z filtrów i walidatorów używanych w modelu książki są następujące:
StripTags - Usuń niechciany kod HTML.
StringTrim - Usuń niepotrzebne odstępy.
StringLength validator - Upewnij się, że użytkownik nie wprowadza więcej znaków niż określony limit.
Krok 3: Zaktualizuj klasę BookTable
Zawierać saveBook metoda dodania książki do bazy danych.
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');
}
}
}
}
Krok 4: Zaktualizuj klasę TutorialController
Dodaj nową akcję addAction do kontrolera samouczka - 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);
}
Plik addAction metoda wykonuje następujące procesy -
Pobiera obiekt żądania.
Sprawdza, czy metoda http żądania to post metoda.
Jeśli metoda http żądania nie jest post, po prostu renderuje szablon, add.phtml
Jeśli metoda http żądania nie jest post, to ustawia inputfilter, pobiera dane żądania i ustawia je w pliku wejściowym.
Sprawdza, czy formularz jest prawidłowy przy użyciu isValid() metoda klasy Form.
Jeśli formularz jest nieważny, ponownie renderuje szablon, add.phtml
Jeśli formularz jest prawidłowy, zapisuje książkę w bazie danych i przekierowuje na stronę główną.
Krok 5: Dodaj szablon add.phtml
Utwórz szablon - add.phtml w 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();
}
Tutaj renderujemy formularz książki przy użyciu Form instancja, $form.
Krok 6: Uruchom aplikację
Teraz możemy uruchomić aplikację - http://localhost:8080/tutorial/add.
Form Page
Validate Error Page