lunes, 26 de marzo de 2012

Action Helpers

Para ZF los Action Helpers son clases que permitirán ser ejecutadas por cualquier Controlador mejorando sustancialmente la funcionalidad de los “Action Controllers” o cambiando su comportamiento bajo demanda, de tal forma que independiza ciertas tareas, permite reusar y hacer el código mucho más limpio. Tiene la ventaja además de ser utilizados en tiempo de ejecución, si se necesitan se utilizan pero no se cargan por defecto. Zend Framework tiene algunos Action Helpers diseñados que pueden ser ejecutados directamente dentro de los “Action”, en la lista se encuentran: Url, ViewRenderer, Redirector, FlashMessenger, ContextSwitch, Cache,AjaxContext, AutoCompleteDojo,  AutoCompleteScriptaculous, Json  y ActionStack , ZF ofrece además la posibilidad de crear nuestros propios Action Helpers. 


Crear nuestros Action Helpers 


Los Action  Helpers son clases que se extienden de Zend_Controller_Action_Helper_Abstract y siguiendo la convención de nombres, la ubicación física de los action que vienen por defecto es LIBRERÍA/ZEND/CONTROLLER/ACTION/HELPER, ahora bien, para adicionar código personalizado o propio se sugiere hacerlo bajo la carpeta LIBRARY, nuestros Action Helpers los podemos guardar en LIBRARY/COD/HELPERS
COD = Carpeta de Código Propio (El nombre es indiferente por ejemplo: MY o LIB)



Cómo llamar un Action Helper


La clase que esta encargada de administrar los Action Helpers es  Zend_Controller_Action_HelperBroker , mediante sus métodos getHelper, addHelper, addPath, addPrefix, resetHelpers,  podrá obtener un helper por nombre, adicionar helper, adicionar la ruta de ubicación, adicionar helpers por prefijo y hacer un reset al stack respectivamente. Esta clase permite cargar por demanda cualquier Action Helper, esto debido a que se comporta como una fábrica de helper registrados de forma estática. 

Esta clase es requerida por Zend_Controller_Action y una de sus propiedades es:


protected $_helper = null;


La cual guarda una instancia de su clase


public function __construct(Zend_Controller_Request_Abstract $request, Zend_Controller_Response_Abstract $response, array $invokeArgs = array())
    {
        $this->setRequest($request)
             ->setResponse($response)
             ->_setInvokeArgs($invokeArgs);
        $this->_helper = new Zend_Controller_Action_HelperBroker($this);
        $this->init();
    }


Para llamar a un Action Helper dentro de un Controller debemos utilizar el helperbroker así: 
$this->_helper->nombreActionHelper();




Cómo registrarlos y ejecutarlos


Utilizando addPrefix() la clase prefijo sirve para determinar la ruta donde están ubicados los Action Helpers, este prefijo debe regirse por la convenciones de nombre de clases utilizadas por ZF.


Para ser ejecutados dentro de los "Action" de  los controladores se debe primero indicar donde se encuentran físicamente para esto inicializaremos en el Bootstrap un metodo _init o adicionamos una nueva linea en application.ini


class Cod_Helpers_Ayudas extends Zend_Controller_Action_Helper_Abstract {

 public function direct( )
 {
    
    
 }


class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
 protected function _initHelper()
  {
     Zend_Controller_Action_HelperBroker::addPrefix('Cod_Helpers');
 }
}


Una alternativa para el bootstrap es inicializar en el application.ini 
[production]
resources.frontController.actionHelperPaths.HELPER_Prefix ="My/Helper/Path" 



Podemos también llamar a otros Action Helper ubicados físicamente en otra ruta, para hacer estos utilizamos:
Zend_Controller_Action_HelperBroker::addPath(
        APPLICATION_PATH .'/controllers/helpers');





sábado, 17 de marzo de 2012

Métodos _forward _redirect

Zend_Controller_Action tiene dos métodos que nos permiten movernos fácilmente entre acciones de un controlador a otro, el método _forward() y _redirect(), la diferencia entre ellos radica básicamente en que _forward () pasa de una acción a otra sin hacer una nueva petición HTTP, permaneciendo en la misma URL


indexController.php




class IndexController extends Zend_Controller_Action
{
    public function init()
    {
        /* Initialize action controller here */
    }
    public function indexAction()
    {
        $this->_forward('listar');
    }
   public function listarAction()
    {
        
    }
}



listar.phtml


<div>
   <h1>Listar</h1>  
</div>


Realicemos algunos cambios


Controller
public function indexAction()

    {
        $this->_forward('listar','index',null,array( 'nombre' => 'Carlos' ));
        //_forward($action, $controller = null, $module = null,array $params = null)
        // Los parametros con valor null son opcionales
    }         
   public function listarAction()
    {
       $this->view->nombre = $this->_getParam('nombre','sin nombre'); 
       // _getParam tiene dos parametros, el primero es el nombre la
       // la variable a recuperar y el segundo(opcional) es el valor por defecto si
       // la variable no esta.
    }


Vista


<div>
   <h1>Listar <?php echo $this->nombre;?></h1>  
</div>


De esta forma podemos pasar valores de una acción a otra. Ahora nuestro ejemplo será utilizando _redirect()  este método utiliza dos parametros $this->_redirect($url,$opciones).



<?php

class IndexController extends Zend_Controller_Action
{
    public function init()
    {
        /* Initialize action controller here */
    }

    public function indexAction()
    {
        $this->_redirect('contacto/index');
         //_redirect($url)       
    }

Al verificar este ejemplo se puede apreciar que la URL en el navegador ha cambiado.

viernes, 16 de marzo de 2012

Accediendo a la Aplicación ...IndexController

Al terminar la configuración básica de todo el entorno de Zend Framework desde nuestro navegador  podemos ejecutar http://contabilidad (según nuestro ejemplo) y visualizaremos lo siguiente:


Las siguientes URL`s daran del mismo resultado
http://contabilidad/index
http://contabilidad/index/index
http://contabilidad/default/index/index 



Zend Framework puede trabajar bajo modulos y el nombre del modulo por defecto es "default". Todas las peticiones al navegador se realizaran bajo el siguiente esquema:

http://nombreProyecto/controlador/accion
http://nombreProyecto/modulo/controlador/accion 

http://nombreProyecto/modulo/controlador/accion/variable1/valor1

Nuestra URL http://contabilidad/index  indica que nuestro controlador por defecto es IndexController y nuestra acción por defecto es indexAction, ademas que nuestra vista por defecto es index.phtml, en la siguiente gráfica queda explicado el proceso.


La gráfica es una representación básica de como se ejecuta el proceso, faltando el Front Controller como el componente que permite enrutar todas las peticiones. 


El IndexController básico es:
class IndexController extends Zend_Controller_Action
{


    public function init()
    {
        /* Initialize action controller here */
       // El código en este método se ejecutará antes que el Predispatch
    }


    public function indexAction()
    {
        // action body
    }




}

El método init() es el último método del constructor de la clase padre  Zend_Controller_Action y permite inicializar nuestro controller cada que es llamado por el Front Controller en el proceso de dispatch, la configuración dada afectará todo el Controlador.


Dentro del controlador están las acciones o métodos que realizaran funciones especificas, cada nombre de acción tendrá como sufijo "Action"  por ejemplo indexAction(), listaAction(),etc. En el controlador podemos tener métodos que no tengan este sufijo y ser llamados de forma interna, no son publicamente accesibles.


Crear nuevos Controlllers desde NetBeans









Mediante Zend_Tool NetBeans  automaticamente creará el Controller y los metodos por defecto, al igual que las vistas respectivas en view/scripts/nuevocontrolador.

Los Controllers soportan action helper y plugin, los plugins se utilizan para ejecutar algo especifico en cada petición a la aplicación, como por ejemplo verificar si el usuario esta registrado, que perfil tiene el usuario,etc. Los Action Helpers son tareas mucho más especificas y permiten compartir información entre controladores 


jueves, 15 de marzo de 2012

Interfaces Fluidas o Fluent Interfaces

Interfaces fluiadas en Zend Framework


Zend Framework utiliza un estilo especial para la ejecución de varios métodos de forma encadenada esto realmente se conoce como "Fluent Interfaces" o interfaces fluidas, su nombre esta asociado a Martin Fowler y fundamentalmente se pretende hacer más legible el código.


Cada método setter debe tener return $this de esta forma devolverá una referencia del objeto del cual fue llamado. 


Ejemplo
http://www.techchorus.net/making-code-more-readable-using-fluent-interface 
class Customer{
    protected 
$_name;
    protected 
$_street;
    protected 
$_city;
    protected 
$_country;

    public function 
setName($name)
    {
        
$this->_name $name;
        return 
$this;
    }

    public function 
setStreetAddress($street)
    {
        
$this->_street $street;
        return 
$this;
    }

    public function 
setCity($city)
    {
        
$this->_city $city;
        return 
$this;
    }

    public function 
setCountry($country)
    {
        
$this->_country $country;
        return 
$this;
    }

    public function 
save()
    {
      
// Save the information to a database
        
echo "Customer information saved";
    }
}
?> 


Se ejecutaría de la siguiente forma


$customer = new Customer;
$customer->setName('James Bond')
         ->
setStreetAddress('Abc street')
         ->
setCity('London')
         ->
setCountry('England')
         ->
save();?>