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

unset en Zend

Estas en el tema de unset en Zend en el foro de Zend en Foros del Web. Como hago un unset de una array de sessiones tengo esto $this->orden = new Zend_Session_Namespace('orden'); y lo trabajo de este modo $this->orden->id[1] = '001' $this->orden->id[2] ...
  #1 (permalink)  
Antiguo 28/12/2010, 15:11
Avatar de alfcm  
Fecha de Ingreso: mayo-2009
Mensajes: 291
Antigüedad: 10 años, 6 meses
Puntos: 7
Pregunta unset en Zend

Como hago un unset de una array de sessiones

tengo esto

$this->orden = new Zend_Session_Namespace('orden');

y lo trabajo de este modo

$this->orden->id[1] = '001'
$this->orden->id[2] = '002'
$this->orden->nombre[1] = 'pedro'
$this->orden->nombre[2] = 'juan'

pero cuando hago un unset($this->orden) no limpia los datos, tambien probe de este modo de Zend Zend_Session::namespaceUnset($this->orden) y tambien de este modo Zend_Session::namespaceUnset('orden') y se mantiene los datos intactos, no quiero aplicar destroy porque uso sessiones en otro lado de mi aplicacion.

Muchas gracias de antemano
  #2 (permalink)  
Antiguo 28/12/2010, 16:39
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 13 años, 6 meses
Puntos: 2135
Respuesta: unset en Zend

Muy raro la forma correcta de hacerlo es Zend_Session::namespaceUnset('orden') y en el siguiente request los datos no estarán disponibles.
  #3 (permalink)  
Antiguo 28/12/2010, 16:46
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 11 años, 10 meses
Puntos: 845
Respuesta: unset en Zend

De donde lo queres eliminar ?, del objeto al que lo estas asociando ? (no se a que objeto hace referencia $this) o de $_SESSION ?

esto:

Código PHP:
Ver original
  1. unset($this->orden);

elimina la instancia de Zend_Session_Namespace del objeto pero no la elimina el namespace de la sesion.

y esto:

Código PHP:
Ver original
  1. Zend_Session::namespaceUnset('orden');

elimina el namespace pero no el objeto asociado.

si queres eliminar completamente, deberias hacerlo en los dos lados

Código PHP:
Ver original
  1. unset($this->orden);
  2. Zend_Session::namespaceUnset('orden');

Saludos.
  #4 (permalink)  
Antiguo 28/12/2010, 17:08
Avatar de alfcm  
Fecha de Ingreso: mayo-2009
Mensajes: 291
Antigüedad: 10 años, 6 meses
Puntos: 7
Respuesta: unset en Zend

pongo $this porque 'orden' es una variable fuera de mi metodo action declarada en mi clase controller.

hice un try catch y me muestra Zend_Session is currently marked as read-only , y busque sobre eso pero hacen referencia a los metodos lock y unlock pero yo no uso ninguno de estos.
  #5 (permalink)  
Antiguo 28/12/2010, 18:08
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 13 años, 6 meses
Puntos: 2135
Respuesta: unset en Zend

Pues si esta como read-only es porque en algún lado haces un $this->orden->lock() sería interesante ver el flujo de tu controller para ver porque te marca esos errores.

Saludos.
  #6 (permalink)  
Antiguo 28/12/2010, 18:33
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 11 años, 10 meses
Puntos: 845
Respuesta: unset en Zend

El problema es que en algún lugar estar dejando a Zend_Session_Abstract::$_writable en false, quien accede a esta propiedad es Zend_Session, estas haciendo algún stop, writeClose o destroy antes de llamar a Zend_Session::namespaceUnset?
  #7 (permalink)  
Antiguo 28/12/2010, 23:59
Avatar de alfcm  
Fecha de Ingreso: mayo-2009
Mensajes: 291
Antigüedad: 10 años, 6 meses
Puntos: 7
Respuesta: unset en Zend

solo hice un destroy para limpiar al inicio para hacer nuevas pruebas, pero luego comento esa linea de comando //Zend_Session::destroy(); , en conclusion no lo uso.

No se que pueda estar sucediendo
  #8 (permalink)  
Antiguo 29/12/2010, 03:37
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 11 años, 10 meses
Puntos: 845
Respuesta: unset en Zend

En algun lugar lo esta haciendo, el único que accede a Zend_Session_Abstract::$_writable es Zend_Session y lo hace a través de los metodos que te mencione antes, entre este codigo

Código PHP:
Ver original
  1. $this->orden = new Zend_Session_Namespace('orden');
  2. $this->orden->id[1] = '001';
  3. $this->orden->id[2] = '002';
  4. $this->orden->nombre[1] = 'pedro';
  5. $this->orden->nombre[2] = 'juan';

y este

Código PHP:
Ver original
  1. Zend_Session::namespaceUnset('orden');

se esta cerrando la sesion sino no te dejaria ni siquiera setearle valores, igualmente hay algo que no me cuadra, si estas en un Controller como puede ser que la Exception no sea redirigida al ErrorController y para poder verla tengas que envolver Zend_Session::namespaceUnset en try && catch ?

Última edición por masterpuppet; 29/12/2010 a las 05:15 Razón: typo
  #9 (permalink)  
Antiguo 29/12/2010, 07:00
Avatar de alfcm  
Fecha de Ingreso: mayo-2009
Mensajes: 291
Antigüedad: 10 años, 6 meses
Puntos: 7
Respuesta: unset en Zend

Hola masterpuppet, bueno aqui posteo todo mi controller y no uso ningun stop,writable, solo use una vez el destroy para hacer nuevas pruebas luego lo comente

Este controller es de un carrito de compras, y el metodo quitarAction es donde quiero hacer un unset ,y bueno lo encerre en un try catch porque uso ajax y me lo muestra en el firebug

Te comento que los demas metodos me funcionan de agregarAction, el cual me setea valores, pero el quitarAction me manda el error que de comente

Código PHP:
Ver original
  1. <?php
  2.  
  3. class OrdenController extends Zend_Controller_Action{
  4.    
  5.     protected $logger;
  6.     private $orden;
  7.     private $orden_n; //orden nueva
  8.    
  9.     public function init(){
  10.         $this->logger = Zend_Registry::get('logger');
  11.     }
  12.    
  13.     public function preDispatch(){ 
  14.         //Zend_Session::destroy();
  15.     }
  16.    
  17.     public function indexAction(){
  18.         $this->view->titulo = 'Orden de Compras';  
  19.     }
  20.    
  21.     public function agregarAction(){
  22.         $this->orden = new Zend_Session_Namespace('orden');
  23.        
  24.         ($this->orden->cont == null)?$this->orden->cont=0:$this->orden->cont=$this->orden->cont;
  25.        
  26.         $this->orden->cont = $this->orden->cont + 1;
  27.        
  28.         $this->orden->id[$i] = $this->_getParam('id');
  29.         $this->orden->nombre[$i] = $this->_getParam('nombre');
  30.         $this->orden->precio[$i] = $this->_getParam('precio');
  31.         $this->orden->cantidad[$i] = $this->_getParam('cantidad');
  32.  
  33.         $this->_helper->viewRenderer->setNoRender();
  34.         $this->_helper->layout->disableLayout();
  35.     }
  36.    
  37.     public function quitarAction(){
  38.         $x = 1;
  39.         $this->_helper->viewRenderer->setNoRender();
  40.         $this->_helper->layout->disableLayout();
  41.        
  42.         try{
  43.             unset($this->orden);
  44.             unset($this->orden_n);
  45.             Zend_Session::namespaceUnset('orden');
  46.             Zend_Session::namespaceUnset('orden_n');   
  47.         }catch(Exception $e){  
  48.             $this->logger->log("UNSET SESION ".$e->getMessage(),Zend_Log::ERR);
  49.         }
  50.  
  51.         $this->orden = new Zend_Session_Namespace('orden');
  52.         $this->orden_n = new Zend_Session_Namespace('orden_n');
  53.  
  54.         for($i=1; $i<= $this->orden->cont; $i++){
  55.             if($this->orden->id[$i] != $this->_getParam('id')){
  56.                 $this->orden_n->id[$x]= $this->orden->id[$i];
  57.                 $this->orden_n->nombre[$x]= $this->orden->nombre[$i];
  58.                 $this->orden_n->precio[$x]= $this->orden->precio[$i];
  59.                 $this->orden_n->cantidad[$x]= $this->orden->cantidad[$i];
  60.                 $this->orden_n->cont= $x;
  61.                 $x+=1; 
  62.             }
  63.         }
  64.  
  65.         $this->orden = new Zend_Session_Namespace('orden');
  66.  
  67.         for($i=1; $i<= $this->orden_n->cont; $i++){
  68.    
  69.             $this->orden->id[$i]= $this->orden_n->id[$i];
  70.             $this->orden->nombre[$i]= $this->orden_n->nombre[$i];
  71.             $this->orden->precio[$i]= $this->orden_n->precio[$i];
  72.             $this->orden->cantidad[$i]= $this->orden_n->cantidad[$i];
  73.             $this->orden->cont= $i;
  74.         }
  75.     }
  76.    
  77.     public function preventaAction(){
  78.  
  79.         $this->_helper->viewRenderer->setNoRender();
  80.         $this->_helper->layout->disableLayout();
  81.        
  82.         $this->orden = new Zend_Session_Namespace('orden');
  83.             $tabla="<div style='font-family:Verdana' align='right'><a href='http://192.168.40.100/pruebajax/public/orden/reset' id='nuevaorden'>Nueva Orden</a></div>";
  84.             $tabla.="<br/><div style='font-family:Verdana;font-size:11px;' align='center'>
  85.                 <table width='80%' border='1' style='border-collapse:collapse'>";
  86.             $tabla.="<thead style='background-color:#BBBBBB'><tr><th>ITEM</th><th>DESCRIPCION</th><th>CANTIDAD</th><th>PRECIO</th><th>MONTO</th><th>&nbsp;</th></tr></thead>";
  87.            
  88.             for($i=1; $i <= $this->orden->cont; $i++){
  89.                 $tabla.="<tr><td>".$i."</td>
  90.                              <td>".$this->orden->nombre[$i]."</td>
  91.                              <td align='center' width='8%'>
  92.                              <input type='text' name='cantidad[".$i."]'
  93.                              value='".$this->orden->cantidad[$i]."' size='8' style='text-align:right'/></td>
  94.                              <td align='right'>".number_format($this->orden->precio[$i],2,'.',',')."</td>
  95.                              <td align='right'>S/. ".number_format($this->orden->precio[$i]*$this->orden->cantidad[$i],2,'.',',')."</td>
  96.                              <td align='center'><a href='' title='Quitar del Pedido' onclick='quitar(".$this->orden->id[$i].",event)'>
  97.                              <img src='http://192.168.40.100/pruebajax/public/img/drop.gif' style='border:0px'
  98.                              /></a></td>
  99.                              </tr>";
  100.                 $total += $this->orden->precio[$i]*$this->orden->cantidad[$i];  
  101.             }
  102.             $this->orden->monto = $total;
  103.  
  104.             $tabla.="<tr><td colspan='4' align='right' style='font-weight:bold;padding-right:25px'>TOTAL</td><td align='right'>S/.  ".number_format($total,2,'.',',')."</td>
  105.                          <td align='center'>
  106.                          <input type='image' title='Recalcular Orden' src='http://192.168.40.100/pruebajax/public/img/refrescar.png' style='border:0px'
  107.                          onclick='recalcular()' /></td>
  108.                          </tr></table><br/>
  109.                          <div align='center'><a href='http://192.168.40.100/pruebajax/public/orden/grabar' style='text-decoration:none'>
  110.                          <img src='http://192.168.40.100/pruebajax/public/img/icono_compras.gif' style='border:0px' />
  111.                          <b style='color:#D82729'>&nbsp;&nbsp;Finalizar Compra</b></a></div>";
  112.            
  113.             echo $tabla;   
  114.     }
  115.    
  116.    
  117.     public function recalculoAction(){
  118.         $this->orden = new Zend_Session_Namespace('orden');
  119.        
  120.         $cantidad = $this->_getParam('cantidad');
  121.        
  122.         for($i=1;$i<= $this->orden->cont;$i++){
  123.             if($cantidad[$i] != $this->orden->cantidad[$i]){
  124.                 $this->orden->cantidad[$i] = $cantidad[$i];
  125.             }
  126.         }
  127.         $this->_redirect('producto/listar');
  128.     }
  129.    
  130.     public function grabarAction(){
  131.         $this->orden = new Zend_Session_Namespace('orden');
  132.         $ordenes = new Model_DbTable_Orden();
  133.         $res = $ordenes->grabar();
  134.         $this->logger->log("respuesta ".$res,Zend_Log::INFO);
  135.         //$this->_redirect('producto/listar');
  136.     }
  137. }

Gracias por su ayuda

Última edición por alfcm; 29/12/2010 a las 07:26
  #10 (permalink)  
Antiguo 29/12/2010, 09:01
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 11 años, 10 meses
Puntos: 845
Respuesta: unset en Zend

En principio no veo nada raro, aunque deberias cambiar la forma en la que estas realizando algunas cosas.
Vas a tener que debugear, pero primero vamos a confirmar que es $_writable el problema, agrega al inicio de agregar y quitar:

Código PHP:
Ver original
  1. Zend_Debug::dump(Zend_Session::isWritable());

y comenta que te devuelve.
  #11 (permalink)  
Antiguo 29/12/2010, 10:15
Avatar de alfcm  
Fecha de Ingreso: mayo-2009
Mensajes: 291
Antigüedad: 10 años, 6 meses
Puntos: 7
Respuesta: unset en Zend

en agregar y quitar me muestra esto en el firebug <pre>bool(false)
</pre>

pero mi metodo agregar funciona bien, en todo caso no dejaria agregar ya que segun writable is false

tambien hice esto antes de las lineas de hacer el unset de php y del propio Zend puse
Zend_Debug::dump($this->orden); y me mostro esto

</pre><pre>NULL

y luego de hacer un $this->orden = new Zend_Session_Namespace('orden'); a continuacion
puse lo mismo Zend_Debug::dump($this->orden);

</pre><pre>object(Zend_Session_Namespace)#71 (1) {
[&quot;_namespace:protected&quot;] =&gt; string(5) &quot;orden&quot;
}
</pre>

Última edición por alfcm; 29/12/2010 a las 10:23
  #12 (permalink)  
Antiguo 29/12/2010, 11:24
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 11 años, 10 meses
Puntos: 845
Respuesta: unset en Zend

Bueno después de varios test...., deberia lanzar la Exception en los dos casos porque Zend_Session_Abstract::$_writable es false, no lo hace por un bug(aparece como cerrado, pero sigue fallando) de php, este codigo:

Código PHP:
Ver original
  1. $this->orden->id[$i] = $this->_getParam('id');

no ejecuta el Zend_Session_Namespace::__set que es quien lanza la Exception al setear valores si Zend_Session::$_writable es false, pero la propiedad se crea igual(ouch!), te invito a que lo pruebes, crea primero la propiedad como array y después asignale el valor(no importa que sobrescriba el valor anterior es solo a para que lo veas), con esto si va a entrar a Zend_Session_Namespace::__set y va a lanzar la Exception, que es como debería funcionar sino estuviera el bug.

Código PHP:
Ver original
  1. public function agregarAction()
  2. {
  3. ...
  4. $this->orden->id = array();
  5. $this->orden->id[$i] = $this->_getParam('id');
  6. ...
  7. }

La conclusión es que en alguna parte, Bootstrap, Plugin, etc.. estas modificando Zend_Session_Abstract::$_writable.

Última edición por masterpuppet; 29/12/2010 a las 11:45
  #13 (permalink)  
Antiguo 29/12/2010, 13:12
Avatar de alfcm  
Fecha de Ingreso: mayo-2009
Mensajes: 291
Antigüedad: 10 años, 6 meses
Puntos: 7
Respuesta: unset en Zend

Hice la prueba primero declarando como array, pero hice el debud y me muestra <pre>bool(false)
</pre>

en que parte puede que este haciendo el writable, si mi configuracion es como la del quickstart, y en este modulo esla primera vez que aplico sesiones, ni siquiera sabia del metodo writable, como puede estar sucediendo esto

Tambien trabajo con Zend_Auth_Adapter_DbTable($db); y todo lo referente a Zend_Auth, por lo que se, estas clases internamente trabajan con sessiones, pero no se si por aqui estara el problema.

Ya no se que hacer

Última edición por alfcm; 29/12/2010 a las 13:21
  #14 (permalink)  
Antiguo 29/12/2010, 13:40
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 11 años, 10 meses
Puntos: 845
Respuesta: unset en Zend

Creo que no me exprese bien, la idea es que elimines los debug y que en el agregarAction hagas lo mismo que en quitarAction envolviendo en un try & catch pero agregando la linea

Código PHP:
Ver original
  1. $this->orden->id = array();

al inicio, para que veas que en realidad también falla en el agregar, que solo por casualidad un bug de PHP permite la ejecución de agregar, debería quedar así:


Código PHP:
Ver original
  1. public function agregarAction(){
  2.         $this->orden = new Zend_Session_Namespace('orden');
  3.        
  4.         ($this->orden->cont == null)?$this->orden->cont=0:$this->orden->cont=$this->orden->cont;
  5.        
  6.         $this->orden->cont = $this->orden->cont + 1;
  7.      
  8.          try{
  9.               $this->orden->id = array();
  10.               $this->orden->nombre = array();
  11.               $this->orden->precio = array();
  12.               $this->orden->cantidad = array();
  13.               $this->orden->id[$i] = $this->_getParam('id');
  14.               $this->orden->nombre[$i] = $this->_getParam('nombre');
  15.               $this->orden->precio[$i] = $this->_getParam('precio');
  16.               $this->orden->cantidad[$i] = $this->_getParam('cantidad');
  17.  
  18.          }catch(Exception $e)  {
  19.                $this->logger->log("ADD PROD ".$e->getMessage(),Zend_Log::ERR);
  20.          }
  21.  
  22.         $this->_helper->viewRenderer->setNoRender();
  23.         $this->_helper->layout->disableLayout();
  24.     }

Ahora como solucionarlo es otra historia, no te va a quedar otra que debugear a mano, usar esta linea:

Código PHP:
Ver original
  1. Zend_Debug::dump(Zend_Session::isWritable());

para poder tener una idea de en donde es que cambia a false, empeza por el ultimo método del Bootstrap, después salta a los Plugins, a ver si podes dar en donde se da el cambio.
  #15 (permalink)  
Antiguo 29/12/2010, 16:27
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 13 años, 6 meses
Puntos: 2135
Respuesta: unset en Zend

Que version de PHP manejas???
  #16 (permalink)  
Antiguo 29/12/2010, 16:32
Avatar de alfcm  
Fecha de Ingreso: mayo-2009
Mensajes: 291
Antigüedad: 10 años, 6 meses
Puntos: 7
Respuesta: unset en Zend

hice la prueba como me indicaste masterpuppet, pero sigue igual, no me lanza ninguna exception en el metodo agregar, lo hace con normalidad, y en el metodo quitar la exception completa es:

Código PHP:
Ver original
  1. quitar SESION exception 'Zend_Session_Exception' with message 'Zend_Session
  2. is currently marked as read-only.' in C:\xampp\htdocs\pruebajax\library
  3. \Zend\Session\Abstract.php:112 Stack trace: #0 C:\xampp\htdocs\pruebajax
  4. \library\Zend\Session.php(813):
  5. Zend_Session_Abstract::_namespaceUnset('orden') #1 C:\xampp\htdocs
  6. \pruebajax\application\controllers\OrdenController.php(98):
  7. Zend_Session::namespaceUnset('orden') #2 C:\xampp\htdocs\pruebajax\library
  8. \Zend\Controller\Action.php(513): OrdenController->quitarAction() #3 C:\xampp
  9. \htdocs\pruebajax\library\Zend\Controller\Dispatcher\Standard.php(295):
  10. Zend_Controller_Action->dispatch('quitarAction') #4 C:\xampp\htdocs\pruebajax
  11. \library\Zend\Controller\Front.php(954):
  12. Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http),
  13. Object(Zend_Controller_Response_Http)) #5 C:\xampp\htdocs\pruebajax\library\Zend\Application\Bootstrap\Bootstrap.php(97):
  14. Zend_Controller_Front->dispatch() #6 C:\xampp\htdocs\pruebajax\library\Zend\Application.php(366): Zend_Application_Bootstrap_Bootstrap->run() #7
  15. C:\xampp\htdocs\pruebajax\public\index.php(35): Zend_Application->run() #8
  16. {main}
  #17 (permalink)  
Antiguo 29/12/2010, 17:13
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 11 años, 10 meses
Puntos: 845
Respuesta: unset en Zend

Raro, pero si probas poner un die('overloading!'); en Zend_Session_Namespace::__set vas a ver que no se ejecuta en agregarAction cuando haces esto

Código PHP:
Ver original
  1. ...
  2. $this->orden->id[$i] = $this->_getParam('id');
  3. ...

igual eso es por curiosidad, el tema es encontrar en donde se deja en false a Zend_Session_Abstract::$_writable, probaste poner en el primer _init del Bootstrap y en el último la linea ? :

Código PHP:
Ver original
  1. Zend_Debug::dump(Zend_Session::isWritable());

hay que ir descartando.

@GatorV yo pude reproducir el error en php 5.3.1 te dejo las lineas por si lo queres probar:

Código PHP:
Ver original
  1. public function indexAction()
  2. {
  3.     Zend_Session::writeClose();
  4.     $orden = new Zend_Session_Namespace('orden');                              
  5.     $i = 1;
  6.     //Descomentar para lanzar Exception
  7.     //$orden->id = array();
  8.     $orden->id[$i] = '001';
  9.     Zend_Debug::dump($orden);
  10. }

Última edición por masterpuppet; 29/12/2010 a las 17:26
  #18 (permalink)  
Antiguo 29/12/2010, 18:47
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 13 años, 6 meses
Puntos: 2135
Respuesta: unset en Zend

Muy raro, según el Manual es un bug que ocurre en PHP 5.2.1 y menores, ya que al asignar un array de esa manera no se ejecuta el método mágico __set, y en PHP5.2.1+ ya se ejecutará...
  #19 (permalink)  
Antiguo 29/12/2010, 19:17
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 11 años, 10 meses
Puntos: 845
Respuesta: unset en Zend

Cita:
Iniciado por GatorV Ver Mensaje
Muy raro, según el Manual es un bug que ocurre en PHP 5.2.1 y menores, ya que al asignar un array de esa manera no se ejecuta el método mágico __set, y en PHP5.2.1+ ya se ejecutará...
Que va GatorV, dejo una referencia, lo testee y efectivamente se ejecuta el __get, pero no el __set, para ejecutar ambos

Código PHP:
Ver original
  1. $orden->id = array();
  2. $orden->id[$i] = '001';

o

Código PHP:
Ver original
  1. $tmp =  $orden->id;
  2. $orden->id = array($i => '001') + (array)$tmp;

y supongo que varias combinaciones mas, pero tal cual esta ahora nunca entra al __set
  #20 (permalink)  
Antiguo 30/12/2010, 00:43
Avatar de alfcm  
Fecha de Ingreso: mayo-2009
Mensajes: 291
Antigüedad: 10 años, 6 meses
Puntos: 7
Respuesta: unset en Zend

Hola GatorV, uso la version 5.2.6 y servidor xampp

Bueno masterpuppet,tambien puse lo que me indicaste de poner en los init del bootstrap y me muestra lo siguiente bool(false)
  #21 (permalink)  
Antiguo 30/12/2010, 02:37
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 11 años, 10 meses
Puntos: 845
Respuesta: unset en Zend

A veces los errores te patean los ojos y uno no los ve, el problema es que nunca se inica la sesion, el encargado de esto es Zend_Session::start y Zend_Session_Namespace lo llama en el constructor, al no crear primero la instancia y al no inicializar la sesion por otro mecanismo(login de usuario por ej) Zend_Session_Abstract::$_writable esta en false, esto:

Código PHP:
Ver original
  1. public function quitarAction(){
  2.         $x = 1;
  3.         $this->_helper->viewRenderer->setNoRender();
  4.         $this->_helper->layout->disableLayout();
  5.        
  6.         try{
  7.             unset($this->orden);
  8.             unset($this->orden_n);
  9.             Zend_Session::namespaceUnset('orden');
  10.             Zend_Session::namespaceUnset('orden_n');    
  11.         }catch(Exception $e){  
  12.             $this->logger->log("UNSET SESION ".$e->getMessage(),Zend_Log::ERR);
  13.         }
  14.  
  15.         $this->orden = new Zend_Session_Namespace('orden');
  16.         $this->orden_n = new Zend_Session_Namespace('orden_n');
  17.         ....

deberia ser esto:

Código PHP:
Ver original
  1. public function quitarAction(){
  2.         $x = 1;
  3.         $this->_helper->viewRenderer->setNoRender();
  4.         $this->_helper->layout->disableLayout();
  5.  
  6.         $this->orden = new Zend_Session_Namespace('orden');
  7.         $this->orden_n = new Zend_Session_Namespace('orden_n');        
  8.  
  9.         try{
  10.             unset($this->orden);
  11.             unset($this->orden_n);
  12.             Zend_Session::namespaceUnset('orden');
  13.             Zend_Session::namespaceUnset('orden_n');    
  14.         }catch(Exception $e){  
  15.             $this->logger->log("UNSET SESION ".$e->getMessage(),Zend_Log::ERR);
  16.         }

o agregar al Bootstrap:

Código PHP:
Ver original
  1. protected function _initSession()
  2. {
  3.     Zend_Session::start(true);
  4. }

Proba y nos cuentas.
  #22 (permalink)  
Antiguo 30/12/2010, 08:34
Avatar de alfcm  
Fecha de Ingreso: mayo-2009
Mensajes: 291
Antigüedad: 10 años, 6 meses
Puntos: 7
Respuesta: unset en Zend

Casi lloro de la emocion, es lo mismo como se trabajaba en PHP (sin zend). si queria hacer un unset tenia que primero iniciar la sesion, gracias materpuppet , eres lo máximo


Saludos y un Feliz año nuevo

posdata:No era necesario declarar los array $orden->id = array(); aparte que tambien me seteaba en vacio mis datos por eso lo quite y funciono con normalidad
  #23 (permalink)  
Antiguo 30/12/2010, 08:46
Avatar de alfcm  
Fecha de Ingreso: mayo-2009
Mensajes: 291
Antigüedad: 10 años, 6 meses
Puntos: 7
Respuesta: unset en Zend

Cita:
Iniciado por masterpuppet Ver Mensaje
En principio no veo nada raro, aunque deberias cambiar la forma en la que estas realizando algunas cosas

Aprovechando la ocasion, y su gran experiencia en formas de trabajo,me gustaria saber que deberia cambiar con respecto a lo mencionado

Gracias
  #24 (permalink)  
Antiguo 31/12/2010, 10:11
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 11 años, 10 meses
Puntos: 845
Respuesta: unset en Zend

Que tal alfcm, te dejo un par de sugerencias y una pregunta:
  1. Deberias utilizar los contextos, http://framework.zend.com/manual/en/....contextswitch y en tu caso ajaxContext http://framework.zend.com/manual/en/...ch.ajaxcontext en lugar de:

    Código PHP:
    Ver original
    1. $this->_helper->viewRenderer->setNoRender();
    2. this->_helper->layout->disableLayout();
  2. En preventaAction estas generando y concatenando el html, por que ?, simplemente crea el .phtml correspondiente, en el controller asigna orden a la vista y en la vista lo tratas como siempre.
  3. Si solo funciona con AJAX deberías comprobar el request a través de Zend_Controller_Request_Http::isXmlHttpRequest
Y por último te hago una pegunta, que es lo que representa OrdenController ? el carrito de compra ?

Saludos y un Feliz año nuevo.

PD: si bien te funciona $orden->id[$i], deberias/mos seguir las recomendaciones del link de GatorV, ya que con arrays bidimensionales(a.k.a matrices) tiene un comportamiento errático.
  #25 (permalink)  
Antiguo 31/12/2010, 11:36
Avatar de alfcm  
Fecha de Ingreso: mayo-2009
Mensajes: 291
Antigüedad: 10 años, 6 meses
Puntos: 7
Respuesta: unset en Zend

Gracias por responder Masterpuppet, estoy empezando a leer los links que me mandaste, y bueno el controler OrdenController es el controlador donde se encuentra los metodos con todo lo referente para la compra en linea

Nuevamente Saludos y que tengas un Feliz Año nuevo

Etiquetas: unset
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 06:36.