Zend Framework - Formularios y validación
Zend Framework proporciona un componente separado, zend-formpara acelerar el proceso de creación y validación de formularios. Conecta el modelo y la capa de vista. Proporciona un conjunto de elementos de formulario para crear un formulario html completo a partir de modelos predefinidos, unaInputFilter class para validar el modelo contra el formulario y opciones para vincular los datos del formulario al modelo y viceversa.
Instalar componente de formulario
El componente de formulario Zend se puede instalar utilizando el Composer comando como se especifica a continuación -
composer require zendframework/zend-form
Un marco de formulario Zend tiene tres subcomponentes para administrar los formularios. Son los que se explican a continuación en detalle:
Elements - Se utiliza para definir un único control de entrada html asignado a una propiedad en el modelo.
Fieldset - Se utiliza para agrupar elementos y otros fieldset de manera anidada.
Form - Se utiliza para crear un formulario html y consta de elementos y conjuntos de campos.
Los formularios Zend generalmente se crean bajo el module//src/Form directorio.
Ejemplo
Creemos ahora un formulario simple para agregar booken la base de datos. Para hacer esto, debemos seguir los siguientes pasos:
Paso 1: Cree BookForm
Cree el "BookForm.php" en el directorio * myapp / module / Tutorial / src / Form ". Agregue los siguientes cambios en el archivo:
<?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',
),
));
}
}
los Form la clase proporciona un add methodpara mapear el modelo y sus detalles de formulario correspondientes. hemos creado elBookForm extendiendo el Form class y agregó los detalles del formulario para Book modelo.
Paso 2: actualiza el modelo de libro, Book.php
Actualizar el modelo ‘Book’ con filtro y validación como se especifica a continuación -
<?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;
}
}
Cada modelo debe implementar el InputFilterAwareInterface. InputFilterAwareInterface proporciona dos métodos,setInputFilter() y getInputFilter().
GetInputFilter se utiliza para obtener los detalles de validación del modelo. Zend framework proporciona un amplio conjunto de filtros y validadores para validar el formulario. Algunos de los filtros y validadores utilizados en el modelo de libro son los siguientes:
StripTags - Eliminar HTML no deseado.
StringTrim - Elimina los espacios en blanco innecesarios.
StringLength validator - Asegúrese de que el usuario no ingrese más caracteres que el límite especificado.
Paso 3: actualice la clase BookTable
Incluir la saveBook método para agregar un libro a la base de datos.
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');
}
}
}
}
Paso 4: actualiza la clase TutorialController
Agregue una nueva acción addAction en el controlador 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);
}
los addAction El método realiza los siguientes procesos:
Obtiene el objeto de solicitud.
Comprueba si el método http de la solicitud es un post método.
Si el método http de la solicitud no es post, solo renderiza la plantilla, add.phtml
Si el método http de la solicitud no es post, luego establece el inputfilter, obtiene los datos de la solicitud y los coloca en el archivo de entrada.
Comprueba si el formulario es válido utilizando el isValid() método de la clase Form.
Si el formulario no es válido, vuelve a representar la plantilla, add.phtml
Si el formulario es válido, guarda el libro en la base de datos y lo redirecciona a la página de inicio.
Paso 5: agregue la plantilla add.phtml
Cree una plantilla: add.phtml en 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();
}
Aquí, estamos renderizando el formulario de libro usando el Form ejemplo, $form.
Paso 6: ejecutar la aplicación
Ahora, podemos ejecutar la aplicación: http://localhost:8080/tutorial/add.
Form Page
Validate Error Page