Zend Framework - Formulare und Validierung
Zend Framework bietet eine separate Komponente: zend-formum den Prozess der Formularerstellung und -validierung zu beschleunigen. Es verbindet das Modell und die Ansichtsebene. Es bietet eine Reihe von Formularelementen zum Erstellen eines vollständigen HTML-Formulars aus vordefinierten ModellenInputFilter Klasse zum Validieren des Modells anhand des Formulars und Optionen zum Binden der Daten aus dem Formular an das Modell und umgekehrt.
Installieren Sie die Formularkomponente
Die Zend-Formularkomponente kann mit dem installiert werden Composer Befehl wie unten angegeben -
composer require zendframework/zend-form
Ein Zend-Formularframework verfügt über drei Unterkomponenten zum Verwalten der Formulare. Sie sind wie unten im Detail erklärt -
Elements - Wird verwendet, um ein einzelnes HTML-Eingabesteuerelement zu definieren, das einer Eigenschaft im Modell zugeordnet ist.
Fieldset - Wird zum Gruppieren von Elementen und anderen Elementen verwendet fieldset auf verschachtelte Weise.
Form - Wird zum Erstellen eines HTML-Formulars verwendet und besteht aus Elementen und Feldsätzen.
Zend Forms werden normalerweise unter dem erstellt module//src/Form Verzeichnis.
Beispiel
Lassen Sie uns nun ein einfaches Formular zum Hinzufügen erstellen bookin die Datenbank. Um dies zu tun, sollten wir die folgenden Schritte einhalten:
Schritt 1: BookForm erstellen
Erstellen Sie die Datei "BookForm.php" im Verzeichnis * myapp / module / Tutorial / src / Form. Fügen Sie der Datei die folgenden Änderungen hinzu:
<?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',
),
));
}
}
Das Form Klasse bietet eine add methodum das Modell und die entsprechenden Formulardetails abzubilden. wir haben das geschaffenBookForm durch die Erweiterung der Form Klasse und fügte die Formulardetails für Book Modell.
Schritt 2: Aktualisieren Sie das Buchmodell Book.php
Aktualisieren Sie das Modell, ‘Book’ mit Filter und Validierung wie unten angegeben -
<?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;
}
}
Jedes Modell sollte das implementieren InputFilterAwareInterface. Das InputFilterAwareInterface bietet zwei Methoden:setInputFilter() und getInputFilter().
Der getInputFilter wird verwendet, um die Validierungsdetails des Modells abzurufen. Das Zend-Framework bietet eine Vielzahl von Filtern und Validatoren zur Validierung des Formulars. Einige der im Buchmodell verwendeten Filter und Validatoren sind wie folgt:
StripTags - Entfernen Sie unerwünschtes HTML.
StringTrim - Entfernen Sie unnötigen Leerraum.
StringLength validator - Stellen Sie sicher, dass der Benutzer nicht mehr Zeichen als das angegebene Limit eingibt.
Schritt 3: Aktualisieren Sie die BookTable-Klasse
Umfassen die saveBook Methode zum Hinzufügen eines Buches zur Datenbank.
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');
}
}
}
}
Schritt 4: Aktualisieren Sie die TutorialController-Klasse
Fügen Sie eine neue Aktion addAction im Tutorial-Controller hinzu - 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);
}
Das addAction Methode führt die folgenden Prozesse aus -
Ruft das Anforderungsobjekt ab.
Überprüft, ob die http-Methode der Anforderung a ist post Methode.
Wenn die http-Methode der Anfrage nicht ist post, es rendert nur die Vorlage, add.phtml
Wenn die http-Methode der Anforderung nicht lautet post, dann setzt es die inputfilter, ruft die Anforderungsdaten ab und setzt sie in den Eingabe-Filer.
Überprüft, ob das Formular gültig ist isValid() Methode der Formularklasse.
Wenn das Formular nicht gültig ist, wird die Vorlage erneut gerendert. add.phtml
Wenn das Formular gültig ist, speichert es das Buch in der Datenbank und leitet es zur Startseite weiter.
Schritt 5: Fügen Sie die Vorlage add.phtml hinzu
Erstellen Sie eine Vorlage - add.phtml unter 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();
}
Hier rendern wir das Buchformular mit dem Form Beispiel, $form.
Schritt 6: Führen Sie die Anwendung aus
Jetzt können wir die Anwendung ausführen - http://localhost:8080/tutorial/add.
Form Page
Validate Error Page