Es recomendable consultar la documentación oficial de Zend al respecto: Introduction to Zend\Form
Generalmente organizaremos nuestros formularios en una carpeta para dicho propósito, dicha carpeta estará ubicada en el fuente de nuestro módulo, en el caso de ser el módulo "Menus", para seguir con los ejemplos anteriores, la carpeta la podríamos llamar "Form" y la ubicariamos en /module/Menus/src/Menus/.
El objetivo es crear un formulario para la inserción de los campos de las entradas de menú, para ello a parte del formulario crearemos su controlador y vistas asociadas.
Nuestro formulario lo crearemos en el fichero MenuForm.php:
Contenido del fichero /module/Menus/src/Menus/Form/MenuForm.php:
<?php // filename : /module/Menus/src/Menus/Form/MenuForm.php namespace Menus\Form; use Zend\Form\Form; class MenuForm extends Form { public function __construct($name = null) { parent::__construct('Menus'); $this->setAttribute('method', 'post'); $this->setAttribute('enctype', 'multipart/form-data'); $this->add(array( 'name' => 'id_menu', 'attributes' => array( 'type' => 'hidden' ) )); $this->add(array( 'name' => 'menu', 'attributes' => array( 'type' => 'text', 'required' => 'required', 'class' => 'form-control' ), 'options' => array( 'label' => 'Menu Type' ) )); $this->add(array( 'name' => 'name', 'attributes' => array( 'type' => 'text', 'required' => 'required', 'class' => 'form-control' ), 'options' => array( 'label' => 'Menu Name' ) )); $this->add(array( 'name' => 'label', 'attributes' => array( 'type' => 'text', 'required' => 'required', 'class' => 'form-control' ), 'options' => array( 'label' => 'Label' ) )); $this->add(array( 'name' => 'module', 'attributes' => array( 'type' => 'text', 'required' => 'required', 'class' => 'form-control' ), 'options' => array( 'label' => 'Module' ) )); $this->add(array( 'name' => 'controller', 'attributes' => array( 'type' => 'text', 'required' => 'required', 'class' => 'form-control' ), 'options' => array( 'label' => 'Controller' ) )); $this->add(array( 'name' => 'action', 'attributes' => array( 'type' => 'text', 'required' => 'required', 'class' => 'form-control' ), 'options' => array( 'label' => 'Action' ) )); $this->add(array( 'name' => 'order', 'attributes' => array( 'type' => 'text', 'required' => 'required', 'class' => 'form-control' ), 'options' => array( 'label' => 'Order' ) )); $this->add(array( 'name' => 'submit', 'attributes' => array( 'type' => 'submit', 'value' => 'Submit', 'class' => 'btn btn-success' ) )); } }
Zend Framework nos proporciona una serie de funciones incorporadas para el tratamiento de los datos en formularios, eso es especialmente interesante para evitar accesos no deseados a nuestra base de datos, además de usar una metodología ordenada que permite separar los datos de su definición.
Procederemos a crear un nuevo fichero php llamado MenuFilter.php en /module/Menus/src/Menus/Form/.
Contenido del fichero /module/Menus/src/Menus/Form/MenuFilter.php.
<?php namespace Menus\Form; use Zend\InputFilter\InputFilter; class MenuFilter extends InputFilter { public function __construct() { $this->add(array( 'name' => 'menu', 'required' => true, 'filters' => array( array( 'name' => 'StripTags' ) ), 'validators' => array( array( 'name' => 'StringLength', 'options' => array( 'encoding' => 'UTF-8', 'min' => 2, 'max' => 255 ) ) ) )); $this->add(array( 'name' => 'name', 'required' => true, 'filters' => array( array( 'name' => 'StripTags' ) ), 'validators' => array( array( 'name' => 'StringLength', 'options' => array( 'encoding' => 'UTF-8', 'min' => 2, 'max' => 255 ) ) ) )); $this->add(array( 'name' => 'label', 'required' => true, 'filters' => array( array( 'name' => 'StripTags' ) ), 'validators' => array( array( 'name' => 'StringLength', 'options' => array( 'encoding' => 'UTF-8', 'min' => 2, 'max' => 255 ) ) ) )); $this->add(array( 'name' => 'module', 'required' => true, 'filters' => array( array( 'name' => 'StripTags' ) ), 'validators' => array( array( 'name' => 'StringLength', 'options' => array( 'encoding' => 'UTF-8', 'min' => 2, 'max' => 255 ) ) ) )); $this->add(array( 'name' => 'controller', 'required' => true, 'filters' => array( array( 'name' => 'StripTags' ) ), 'validators' => array( array( 'name' => 'StringLength', 'options' => array( 'encoding' => 'UTF-8', 'min' => 2, 'max' => 255 ) ) ) )); $this->add(array( 'name' => 'action', 'required' => true, 'filters' => array( array( 'name' => 'StripTags' ) ), 'validators' => array( array( 'name' => 'StringLength', 'options' => array( 'encoding' => 'UTF-8', 'min' => 2, 'max' => 255 ) ) ) )); $this->add(array( 'name' => 'order', 'required' => true, 'filters' => array( array( 'name' => 'Digits', 'break_chain_on_failure' => true, ) ), 'validators' => array( array( 'name' => 'Between', 'options' => array( 'min' => 1, 'max' => 99, ), ) ) )); } }Recordemos que el controlador invocará los datos del formulario y pasará en forma de variables a la vista, que será la encargada de generar el código HTML pertinente.
Nuestro controlador lo llamaremos MenusController.php y lo ubicaremos en la carpeta /module/Menus/src/Menus/Controller.
Contenido del fichero /module/Menus/src/Menus/Controller/MenusController.php:
<?php namespace Menus\Controller; use Zend\Mvc\Controller\AbstractActionController; use Zend\View\Model\ViewModel; use Menus\Form\MenuForm; use Menus\Form\MenuFilter; class MenusController extends AbstractActionController { /** * Crea un nuevo registro * * @return \Zend\View\Model\ViewModel */ public function createAction() { $form = new MenuForm(); $form->setInputFilter(new MenuFilter()); $viewVars = array ( 'title' => 'Add Menu', 'form' => $form ); if (! $this->request->isPost ()) { return new ViewModel ( $viewVars ); } $post = $this->request->getPost (); $form->setData ( $post ); if (! $form->isValid ()) { $viewVars ['error'] = true; return new ViewModel ( $viewVars ); } // Create menu try { // ... } catch (\Exception $e) { $viewVars['error'] = true; $viewVars['message'] = $e->getMessage(); } return new ViewModel ( $viewVars ); } }
Es una buena práctica gestionar los datos en el controlador y pasarlos como variables a la vista, en este caso estamos usando el array viewVars para incluir en él todos los parámetros. Posteriormente en la vista podremos acceder fácilmente usando la cláusual this.
Cada acción susceptible de ser invocada en el controlador debe tener una vista asociada. La vista que transformará el contenido en HTML se llamará create.phtml y estará ubicada en la carpeta "menus" (en minúsculas), que no existe, nuestro siguiente paso será crearla en /module/Menus/view.
Contenido del fichero /module/Menus/view/menus/create.phtml:
<section class="create"> <h2><?php echo $this->translate($this->title); ?></h2> <?php if ($this->error){ ?> <p class="error"> <?php echo $this->translate('There were one or more isues with your submission. Please correct them as indicated below.'); ?> <?php if(isset($this->message) && $this->message != '') { ?> <br> <?php echo $this->message; ?> <?php } ?> </p> <?php } ?> <?php $form = $this->form; $form->prepare(); $form->setAttribute('action', $this->url(NULL, array( 'controller' => 'menus', 'action' => 'create' ))); $form->setAttribute('method', 'post'); echo $this->form()->openTag($form); ?> <div class="form-group"> <?php echo $this->formLabel($form->get('menu')); ?> <?php echo $this->formElement($form->get('menu')); echo $this->formElementErrors($form->get('menu')); ?> </div> <div class="form-group"> <?php echo $this->formLabel($form->get('name')); ?> <?php echo $this->formElement($form->get('name')); echo $this->formElementErrors($form->get('name')); ?> </div> <div class="form-group"> <?php echo $this->formLabel($form->get('label')); ?> <?php echo $this->formElement($form->get('label')); echo $this->formElementErrors($form->get('label')); ?> </div> <div class="form-group"> <?php echo $this->formLabel($form->get('module')); ?> <?php echo $this->formElement($form->get('module')); echo $this->formElementErrors($form->get('module')); ?> </div> <div class="form-group"> <?php echo $this->formLabel($form->get('controller')); ?> <?php echo $this->formElement($form->get('controller')); echo $this->formElementErrors($form->get('controller')); ?> </div> <div class="form-group"> <?php echo $this->formLabel($form->get('action')); ?> <?php echo $this->formElement($form->get('action')); echo $this->formElementErrors($form->get('action')); ?> </div> <div class="form-group"> <?php echo $this->formLabel($form->get('order')); ?> <?php echo $this->formElement($form->get('order')); echo $this->formElementErrors($form->get('order')); ?> </div> <div class="form-group"> <?php echo $this->formElement($form->get('submit')); echo $this->formElementErrors($form->get('submit')); ?> <a class="btn btn-default" href="<?php echo $this->url('menus/default', array('controller' => 'menus', 'action' => 'index'), null); ?>"><?php echo $this->translate('Return back');?></a> </div> <?php echo $this->form()->closeTag()?> </section>Como detalle comentar que tenemos acceso directo a las variables que desde el controlador hemos pasado a la vista: p. ej.: $this->title.
Finalmente hemos de incluir nuestro nuevo controlador en la definición de las rutas de nuestro módulo.
Contenido del fichero /module/Menus/config/module.config.php:
<?php return array( 'controllers' => array( 'invokables' => array( 'Menus\Controller\Index' => 'Menus\Controller\Index', 'Menus\Controller\Menus' => 'Menus\Controller\MenusController', ), ), 'router' => array( 'routes' => array( 'menus' => array( 'type' => 'Literal', 'options' => array( 'route' => '/menus', 'defaults' => array( '__NAMESPACE__' => 'Menus\Controller', 'controller' => 'Index', 'action' => 'index', ), ), 'may_terminate' => true, 'child_routes' => array( 'default' => array( 'type' => 'Segment', 'options' => array( 'route' => '/[:controller[/:action]]', 'constraints' => array( 'controller' => '[a-zA-Z][a-zA-Z0-9_-]*', 'action' => '[a-zA-Z][a-zA-Z0-9_-]*', ), 'defaults' => array( ), ), ), ), ), ), ), 'view_manager' => array( 'template_path_stack' => array( 'Menus' => __DIR__ . '/../view', ), ), );
Ya podemos comprobar la salida de nuestro formulario creado consultando la página http://localhost/myApp/menus/menus/create:
No hay comentarios:
Publicar un comentario