Foros del Web » Programando para Internet » PHP » Zend »

[Zend FW] actionStack y sessiones

Estas en el tema de [Zend FW] actionStack y sessiones en el foro de Zend en Foros del Web. Hola, a ver si consigo explicar mi problema: Tengo un controlador llamador "CategoryController" con una action "list" que nuestra un listado en la parte principal ...
  #1 (permalink)  
Antiguo 01/02/2009, 12:16
 
Fecha de Ingreso: julio-2008
Mensajes: 24
Antigüedad: 15 años, 8 meses
Puntos: 0
[Zend FW] actionStack y sessiones

Hola, a ver si consigo explicar mi problema:

Tengo un controlador llamador "CategoryController" con una action "list" que nuestra un listado en la parte principal de la pagina.

Este controlador hereda de un "ContentController" hecho por mi implementado tal que:

Código PHP:
class ContentController extends BaseController
{
    
    public function 
preDispatch()
    {        

        
$this->_helper->actionStack('index''locationnav');
        
    }

En el metodo preDispatch añado al actionstack (se supone que es LIFO) una llamada a una acción de otro controlador que me genera el menu.

Dicho menu tiene enlaces que añaden un parametro "locationid" al querystring, si el usuario hace click en un enlace, al volver a cargarse el menu, se obtiene dicho parametro y se carga el menu en función de este. Luego guardo el valor en session para no tener que arrastrarlo en la URL.

Es decir, el controlador del menu hace esto:

Código PHP:

 
public function indexAction()
    {
        
        
$selectedLoc $this->_getParam('locationid'false);
        
        
        
//if no parameter, check session                    
        
if (($selectedLoc == false) && isset($this->_session->locationid))
        {
            
$selectedLoc $this->_session->locationid;
        }

      
//aqui cargo datos, etc....

         
         //Guardamos en session el valor obtenido
         
$session Zend_Registry::get('Zend_Session');
         
         
$session->location $location->GetLocalizedDescription();
                
$session->locationid $location->GetId();
        

         
        
$this->view->location $location;
   
      

 
    } 

De esta forma, al volver a cargar la pagina si no se ha clicado en el menu me lo vuelve a cargar segun el valor guardado en la session.

El problema viene dado a que si obtengo este valor de la session desde el controlador que ha provocado la llamada al preDispatch me vuestra el valor previo y tengo que refrescar o volver a abrir el navegador para que me nuestre el valor correcto.

En resumen: Si llamo a otro controlador en el predispatch y guardo un valor en sessión, luego cuando se ejecuta la "action" del controlador original no veo dicho valor en sessión...



Muchas gracias, y si algo no esta claro lo explico mas detalladamente.
  #2 (permalink)  
Antiguo 01/02/2009, 12:27
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: [Zend FW] actionStack y sessiones

Haz probado leer el valor desde Zend_Registry::get('Zend_Session')?, Es probable que $this->_session solo sea valido para el controlador actual, o no se establezca hasta recargar la pagina.

Saludos
  #3 (permalink)  
Antiguo 01/02/2009, 12:44
 
Fecha de Ingreso: julio-2008
Mensajes: 24
Antigüedad: 15 años, 8 meses
Puntos: 0
Respuesta: [Zend FW] actionStack y sessiones

Cita:
Iniciado por GatorV Ver Mensaje
Haz probado leer el valor desde Zend_Registry::get('Zend_Session')?, Es probable que $this->_session solo sea valido para el controlador actual, o no se establezca hasta recargar la pagina.

Saludos

hola,

Esta parte de codigo es del controlador del menu, que si que obtiene el valor correctamente ya que esta obteniendo el valor guardado en un request anterior. De hecho el $this->_session lo inicializo yo en el init() del controlador base para no tener que ir escribiendo Zend_registry cada 2 por 3.

El problema viene cuando se ejecuta la action solicitada inicialmente (despues de acabar la action del menu que habia forzado en el actionstack) ya que parece que no me obtiene el valor que acabo de poner sino que me obtiene el que habia puesto en el request anterior.


Yo lo entiendo asi:

preDispatch() ----> actionStack('index', 'locationnav') ---> locationnav.index() --> aqui guardo valor en session -----> category.list() ---> aqui obtengo el valor

Sin embargo en lugar de darme el valor que acabo de guardar en session me da el que habia puesto en el request anterior.

Y aqui si que lo estoy obteniendo a saco del registry para que no haya confusion:


Código PHP:

  
public function listAction()
    {
        
//blablablabla.............

        
Zend_Debug::dump(Zend_Registry::get('Zend_Session')->location);
        
        
//blablablablaa...................
    

  #4 (permalink)  
Antiguo 01/02/2009, 15:11
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: [Zend FW] actionStack y sessiones

Mmmm leyendo la documentación de Zend_Framework, comenta que el ActionStack se procesa en el postDispatch(), por lo que si estableces el valor ahí no lo vas a recuperar hasta el siguiente request.

Lo que te recomiendo es en el preDispatch leer el valor y guardarlo así lo tienes listo en los dos controladores y abstraes la dependencia de ese valor a un controlador.

Saludos
  #5 (permalink)  
Antiguo 01/02/2009, 17:59
 
Fecha de Ingreso: julio-2008
Mensajes: 24
Antigüedad: 15 años, 8 meses
Puntos: 0
Respuesta: [Zend FW] actionStack y sessiones

Finalmente he podido hacer que me ejecutara la acción del menú primero.


Código PHP:


<?php 
/**
 * Application initialization plugin
 * 
 * @uses Zend_Controller_Plugin_Abstract
 */
class Zend_Controller_Plugin_ActionSetup extends Zend_Controller_Plugin_Abstract
{
 

    public function 
dispatchLoopStartup(Zend_Controller_Request_Abstract $request
    {
        
        
parent::dispatchLoopStartup($request);
        
           
$front Zend_Controller_Front::getInstance();
       
        
          if (!
$front->hasPlugin('Zend_Controller_Plugin_ActionStack')) 
          {
            
$actionStack = new Zend_Controller_Plugin_ActionStack();
            
$front->registerPlugin($actionStack);
          } 
          else 
          {
               
$actionStack $front->getPlugin('Zend_Controller_Plugin_ActionStack');
          }
   

          
$originalRequest = clone($request);
          
          
$request->setActionName('index');
          
$request->setControllerName('locationnav');
          
          
$request->setParam('controller''locationnav');
          
$request->setParam('action''index');
          

          
$actionStack->forward($request);
   
  
        
$actionStack->pushStack($originalRequest);
        
      
    }


}
?>
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:44.