Zend Framework - Moduli e convalida
Zend Framework fornisce un componente separato, zend-formper accelerare il processo di creazione e convalida dei moduli. Collega il modello e il livello di visualizzazione. Fornisce una serie di elementi del modulo per creare moduli html a tutti gli effetti da modelli predefiniti, un fileInputFilter class per convalidare il modello rispetto al modulo e opzioni per associare i dati dal modulo al modello e viceversa.
Installa componente modulo
Il componente del modulo Zend può essere installato utilizzando il Composer comando come specificato di seguito -
composer require zendframework/zend-form
Un framework di moduli Zend ha tre sottocomponenti per gestire i moduli. Sono come spiegato di seguito in dettaglio:
Elements - Utilizzato per definire un singolo controllo di input HTML mappato a una proprietà nel modello.
Fieldset - Utilizzato per raggruppare elementi e altro fieldset in modo annidato.
Form - Utilizzato per creare un modulo html e consiste di elementi e set di campi.
I moduli Zend vengono solitamente creati con l'estensione module//src/Form directory.
Esempio
Creiamo ora un semplice modulo da aggiungere booknel database. Per fare ciò, dovremmo attenerci ai seguenti passaggi:
Passaggio 1: crea BookForm
Crea il "BookForm.php" nella directory * myapp / module / Tutorial / src / Form ". Aggiungi le seguenti modifiche nel file:
<?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',
),
));
}
}
Il Form class fornisce un file add methodper mappare il modello e i dettagli del modulo corrispondente. abbiamo creato il fileBookForm estendendo il Form class e ha aggiunto i dettagli del modulo per Book modello.
Passaggio 2: aggiorna il modello del libro, Book.php
Aggiorna il modello, ‘Book’ con filtro e convalida come specificato di seguito -
<?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;
}
}
Ogni modello dovrebbe implementare il InputFilterAwareInterface. InputFilterAwareInterface fornisce due metodi,setInputFilter() e getInputFilter().
GetInputFilter viene utilizzato per ottenere i dettagli di convalida del modello. Il framework Zend fornisce un ricco set di filtri e validatori per convalidare il modulo. Alcuni dei filtri e dei validatori utilizzati nel modello di libro sono i seguenti:
StripTags - Rimuovi l'HTML indesiderato.
StringTrim - Rimuovere lo spazio bianco non necessario.
StringLength validator - Assicurati che l'utente non inserisca più caratteri del limite specificato.
Passaggio 3: aggiorna la classe BookTable
Includere il file saveBook metodo per aggiungere il libro al database.
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');
}
}
}
}
Passaggio 4: aggiorna la classe TutorialController
Aggiungi una nuova azione addAction nel controller del tutorial: 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);
}
Il addAction metodo esegue i seguenti processi:
Ottiene l'oggetto richiesta.
Controlla se il metodo http della richiesta è un file post metodo.
Se il metodo http della richiesta non lo è post, esegue solo il rendering del modello, add.phtml
Se il metodo http della richiesta non lo è post, quindi imposta il inputfilter, ottiene i dati della richiesta e li imposta nel file input.
Verifica se il modulo è valido utilizzando il isValid() metodo della classe Form.
Se il modulo non è valido, esegue nuovamente il rendering del modello, add.phtml
Se il modulo è valido, salva il libro nel database e reindirizza alla home page.
Passaggio 5: aggiungi il modello add.phtml
Crea un modello - add.phtml sotto 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();
}
Qui, stiamo renderizzando il modulo del libro usando il Form esempio, $form.
Passaggio 6: eseguire l'applicazione
Ora possiamo eseguire l'applicazione - http://localhost:8080/tutorial/add.
Form Page
Validate Error Page