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