domingo, 21 de julio de 2013

Más sobre las vistas, interactuando con el array del modelo ViewModel() en Zend Framework 2


En el capítulo anterior aprendimos a crear nuevas vistas para el controlador "demo", recordemos que sólo utilizamos código html para cada una de las vistas "index", "fotos" y "musica", ahora surge un problema como interactuar con código php a través de las vistas, En Zend no se recomienda la creación  de objetos directamente sobre las vistas, para ello se recomienda hacerlo sobre los controladores.

Así que para crear incluir código php que interactue con las vistas nos dirigiremos al archivo "DemoController.php" que se encuentra en la ruta ...

-module
   -Application
        -src
       -Application
                 -Controller


     
Más sobre las vistas interactuando con el array del modelo ViewModel() Zend Framework 2


Abrimos el archivo "DemoController.php" ...


class DemoController extends AbstractActionController
{
    public function indexAction()
    {
        return new ViewModel();
    }
    public function fotosAction()
    {
        return new ViewModel();
    }
    public function musicaAction()
    {
        return new ViewModel();
    }
}

Hay tenemos declaradas cada una de las vistas que a través del módelo ViewModel conectan al controlador con la vista entre sí, ahora nosotros como ejemplo necesitamos crear una función que nos retorne un resultado determinado según en la vista que nos encontremos, ¿y como hacemos esto?.

Podríamos agregar la nueva función directamente al archivo del controlador "DemoController.php", pero para la limpieza y organización del proyecto es conveniente organizar el nuevo código php que queramos incluir en una carpeta y archivo distinto, para ello crearemos una carpeta nueva a la que llamaremos "FunctionsDemoController" y crearemos un nuevo archivo llamado "FunctionsDemoController.php", vean la ruta ...

Más sobre las vistas interactuando con el array del modelo ViewModel() Zend Framework 2



En este archivo incluiremos funciones u otro código php extra que necesitemos para las vistas, copien y peguen el siguiente código en el archivo FunctionsDemoController.php ...

<?php
/* Nueva funcion */
    function interactua_php($vista)
    {
        switch($vista)
        {
            case "index":
                return utf8_encode("La vista index está interactuando con una nueva función PHP a través del controlador");
                break;
      
            case "fotos":
                return utf8_encode("La vista fotos está interactuando con una nueva función PHP a través del controlador");
                break;
           
             case "musica":
                return utf8_encode("La vista fotos está interactuando con una nueva función PHP a través del controlador");
                break;
           
        }
    }
 /* Nueva funcion */
?>


Como pueden ver la función interactua_php($vista) es un simple ejemplo que nos devolverá un valor u otro dependiendo del parámetro $vista ...

Ahora incluiremos el nuevo script FunctionsDemoController.php en el controlador DemoController.php  ...

namespace Application\Controller;

use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
include "FunctionsDemoController/FunctionsDemoController.php";


Ahora podemos interactuar con el nuevo código que nos proporcione "FunctionsDemoController.php", y así haremos uso de él en cada una de las vistas ...


class DemoController extends AbstractActionController
{
    public function indexAction()
    {
        $parametro = interactua_php("index");
        return new ViewModel(array("interactua_php" => $parametro));
    }
    public function fotosAction()
    {
        $parametro = interactua_php("fotos");
        return new ViewModel(array("interactua_php" => $parametro));
    }
    public function musicaAction()
    {
        $parametro = interactua_php("musica");
        return new ViewModel(array("interactua_php" => $parametro));
    }
}


Como se puede ver para cada una de las vistas creamos una variable llamada $parametro que contiene la función interactua_php($vista), $vista recibe el valor de la vista correspondiente.

Luego añadimos la variable al modelo ViewModel() mediante un array asociativo: "interactua_php" => $parametro, este array puede contener tantos elementos sean necesarios, esto es algo que hace especial a ZEND y que facilita mucho el trabajo.

El archivo DemoController.php queda con todo el código nuevo de la siguiente forma ...


 <?php
/**
 * Zend Framework (http://framework.zend.com/)
 *
 * @link      http://github.com/zendframework/ZendSkeletonApplication for the canonical source repository
 * @copyright Copyright (c) 2005-2013 Zend Technologies USA Inc. (http://www.zend.com)
 * @license   http://framework.zend.com/license/new-bsd New BSD License
 */

namespace Application\Controller;

use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
include "FunctionsDemoController/FunctionsDemoController.php";

class DemoController extends AbstractActionController
{
    public function indexAction()
    {
        $parametro = interactua_php("index");
        return new ViewModel(array("interactua_php" => $parametro));
    }
    public function fotosAction()
    {
        $parametro = interactua_php("fotos");
        return new ViewModel(array("interactua_php" => $parametro));
    }
    public function musicaAction()
    {
        $parametro = interactua_php("musica");
        return new ViewModel(array("interactua_php" => $parametro));
    }
}

Bien, ahora sólo queda incluir el nuevo elemento del array ViewModel a las vistas, nos vamos a la ruta de las vistas ...

Más sobre las vistas interactuando con el array del modelo ViewModel() Zend Framework 2


Abrimos el archivo index.phtml y le pegamos el siguiente código ...


<h1>Te encuentras en la vista index</h1>

<h3><?php echo $this -> interactua_php ?></h3>

<label>Selecciona una vista ...</label>
<ul>
    <li><a href="http://tutorial-zend.localhost/application/demo/index">vista index</a>
        <li><a href="http://tutorial-zend.localhost/application/demo/fotos">vista fotos</a>
            <li><a href="http://tutorial-zend.localhost/application/demo/musica">vista musica</a>
</ul>


<?php echo $this -> interactua_php ?> : Estamos llamando al elemento interactua_php que acabamos de crear en el array del modelo ViewModel() para ello se utiliza la palabra reservada $this. En las vistas Zend no recomienda colocar el punto y coma ";".


A continuación abrimos el archivo fotos.phtml y le pegamos el siguiente código ...

<h1>Te encuentras en la vista fotos</h1>

<h3><?php echo $this -> interactua_php ?></h3>

<label>Selecciona una vista ...</label>
<ul>
    <li><a href="http://tutorial-zend.localhost/application/demo/index">vista index</a>
        <li><a href="http://tutorial-zend.localhost/application/demo/fotos">vista fotos</a>
            <li><a href="http://tutorial-zend.localhost/application/demo/musica">vista musica</a>
</ul>


Y por último el archivo musica.phtml y le pegamos el siguiente código ...

<h1>Te encuentras en la vista musica</h1>

<h3><?php echo $this -> interactua_php ?></h3>

<label>Selecciona una vista ...</label>
<ul>
    <li><a href="http://tutorial-zend.localhost/application/demo/index">vista index</a>
        <li><a href="http://tutorial-zend.localhost/application/demo/fotos">vista fotos</a>
            <li><a href="http://tutorial-zend.localhost/application/demo/musica">vista musica</a>
</ul>

Como se puede ver para fotos.phtml y musica.phtml se sigue el mismo proceso que con index.phtml.

Ahora sólo queda comprobar si la función interactua_php($vista), ha sido conectada correctamente entre el controlador y la vista, asi que vamos a la url ... http://tutorial-zend.localhost/application/demo/index

Navegamos entre los links de cada una de las vistas y vemos que sí, que todo es correcto.

Más sobre las vistas interactuando con el array del modelo ViewModel() Zend Framework 2


Espero que lo hayan comprendido y les haya servido de ayuda, saludos.