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

Duda con AjaxContext

Estas en el tema de Duda con AjaxContext en el foro de Zend en Foros del Web. Hola amigos, tengo una duda con el AjaxContext. Viendo este ejemplo del manual: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código PHP: Ver original class CommentController extends Zend_Controller_Action {   ...
  #1 (permalink)  
Antiguo 04/02/2011, 07:24
pur
 
Fecha de Ingreso: agosto-2007
Mensajes: 98
Antigüedad: 16 años, 8 meses
Puntos: 4
Duda con AjaxContext

Hola amigos, tengo una duda con el AjaxContext.
Viendo este ejemplo del manual:
Código PHP:
Ver original
  1. class CommentController extends Zend_Controller_Action
  2. {
  3.     public function init()
  4.     {
  5.         $ajaxContext = $this->_helper->getHelper('AjaxContext');
  6.         $ajaxContext->addActionContext('view', 'html')
  7.                     ->addActionContext('form', 'html')
  8.                     ->addActionContext('process', 'json')
  9.                     ->initContext();
  10.     }
  11.  
  12.     public function viewAction()
  13.     {
  14.         // Tirar para ver un único comentario.
  15.         // Cuando se detecta AjaxContext, utiliza el script de vista
  16.         // comment/view.ajax.phtml.
  17.     }
  18.  
  19.     public function formAction()
  20.     {
  21.         // Mostrar el form "add new comment".
  22.         // Cuando se detecta AjaxContext, utiliza el script de vista
  23.         // comment/form.ajax.phtml.
  24.     }
  25.  
  26.     public function processAction()
  27.     {
  28.         // Procesar un nuevo comentario
  29.         // Devolver los resultados como JSON; simplemente asignar los
  30.         // resultados como variables de la vista, y se devolverán como JSON.
  31.  
  32.     }
  33. }
Veo que un action tiene dos vistas, por ejemplo el action "form" form.phtml y form.ajax.phtml
Esto es lo que entiendo yo: si el zend detecta una llamada XmlHttpRequest muestra el form.ajax.phtml, sino muestra la vista normal o sea form.phtml.

Aqui mi duda: si la llamada no es XmlHttpRequest en esa vista yo muestro un formulario, ese mismo formulario quiero enviar los datos por ajax, en la proxima llamada envio mediante jquery la llamada XmlHttpRequest, alli es cuando devuelve el form.ajax.phtml, ahora si solo tengo un action, como hago en el controlador para no mezclar los datos de las dos vistas?

Espero que se entienda.
Saludos y gracias.
  #2 (permalink)  
Antiguo 04/02/2011, 09:20
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Duda con AjaxContext

Pues si solo vas a hacer render del formulario como dices no tienes porque mezclarlos, solo sería cuestión de ver si el request es ajax y solo levantar/validar el formulario.
  #3 (permalink)  
Antiguo 04/02/2011, 12:15
Avatar de SergeMedina  
Fecha de Ingreso: septiembre-2007
Ubicación: Guadalajara, Jalisco
Mensajes: 459
Antigüedad: 16 años, 7 meses
Puntos: 20
Respuesta: Duda con AjaxContext

Como tip:

Puedes analizar si el request es post o get y en base a eso decidir que hacer.

Saludos.
__________________
I see dead pixels
  #4 (permalink)  
Antiguo 04/02/2011, 15:39
pur
 
Fecha de Ingreso: agosto-2007
Mensajes: 98
Antigüedad: 16 años, 8 meses
Puntos: 4
Respuesta: Duda con AjaxContext

Hola, quizas no me expresé bien, o no tengo bien el concepto de AjaxContext
Tengo en el formAction las variables, tanto del formulario para form.phtml y la validacion para el formulario o sea para form.ajax.phtml.
Código PHP:
Ver original
  1. public function formAction()
  2.     {
  3.         // Aca muestro el formulario a form.phtml
  4.  
  5.        include_once 'Formulario.php';  // el formulario podría ir en un helper pero lo coloco así de prueba
  6.  
  7.         $form= new Formulario();
  8.         $conf=$form->confirmar();
  9.         $this->view->verformulario=$conf;  
  10.  
  11.         //hasta aca para form.phtml      
  12.  
  13.         // aca cuando se detecta el AjaxContext, para la vista form.ajax.phtml
  14.         $f = new Zend_Filter_StripTags();
  15. $username = $f->filter($this->_request->getPost('nombre'));
  16. $password = md5($f->filter($this->_request->getPost('clave')));
  17. .
  18. .
  19. .
  20. ... y toda la validacion
  21.  
  22.   $this->view->validado= "usuario validado satisfactoriamente";    //esta variable se espera en un div debajo del formulario, que es donde recibe el resultado de ajax.
  23.     }
Espero que se entienda, tengo una vista normal con un formulario y valido este formulario en el mismo action mediante ajax, pero el resultado de ajax va a form.ajax.phtml

No sé si esta bien implementado así, me suena raro tener dos vistas y un action.
Saludos.
  #5 (permalink)  
Antiguo 04/02/2011, 15:58
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Duda con AjaxContext

No se bien que estas haciendo pur, pero no es asi, segun lo que estas mostrando en formAction deberia ir unicamente el form y en processAction es donde procesas el request(aunque lo podes unificar todo en formAction), algo así:

Código PHP:
Ver original
  1. public function formAction()
  2. {
  3.     $form = new Default_Form_Example();
  4.     $this->view->form = $form;
  5. }
  6.  
  7.  
  8. public function processAction()
  9. {
  10.     if(!$this->_request->isXmlHttpRequest()) {
  11.         throw new OnlyXmlHttpRequestAllowed();
  12.     }
  13.     if($this->_request->isPost()) {
  14.         ....
  15.     }
  16. }

los formularios van dentro de la carpeta forms de cada modulo, la clase debe ser Module_Form_Class, los filters, validators, decorators del form deberias setearlos en el init del form, algo asi:

Código PHP:
Ver original
  1. class Default_Form_Example extends Zend_Form
  2. {
  3.     public function init()
  4.     {
  5.         $this->setMethod(Zend_Form::METHOD_POST);
  6.         $this->setElementFilters(array('stripTags'));
  7.         ....
  8.     }
  9. }

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #6 (permalink)  
Antiguo 04/02/2011, 16:22
pur
 
Fecha de Ingreso: agosto-2007
Mensajes: 98
Antigüedad: 16 años, 8 meses
Puntos: 4
Respuesta: Duda con AjaxContext

Yo lo que quiero en definitiva, es saber como funciona el AjaxContext, que me está complicando.
Este codigo es sacado de la guia de maestrosdelweb.
Código PHP:
Ver original
  1. class IndexController extends Zend_Controller_Action {
  2.  
  3.     public $ajaxable = array(
  4.         'list'     => array('html'),
  5.         'comments' => array('html')
  6.     );
  7.  
  8.     public function init()
  9.     {
  10.         $this->_helper->getHelper('ajaxContext')->initContext();
  11.     }
  12.  
  13.     public function listAction() {
  14.  
  15.     }
  16.  
  17.     public function commentsAction() {
  18.  
  19.     }
  20.  
  21. }
Lo que no entiendo es, si actionList no le envio un XmlHttpRequest, se va a ver la vista normal list.phtml, ahora si le mando un XmlHttpRequest, me va a mostrar la vista list.ajax.phtml.

Mi gran duda es donde coloco las variables que muestro en list.phtml y list.ajax.phtml, si solo tengo un action.
  #7 (permalink)  
Antiguo 04/02/2011, 16:39
Avatar de SergeMedina  
Fecha de Ingreso: septiembre-2007
Ubicación: Guadalajara, Jalisco
Mensajes: 459
Antigüedad: 16 años, 7 meses
Puntos: 20
Respuesta: Duda con AjaxContext

AjaxContext es un ActionHelper que detecta si en las cabeceras de la petición viene la cabecera: x-requested-with xmlhttprequest, si encuentra esta cabecera desactiva el layout y asigna el script de vista: nameAction.ajax.phtml.

Las variables y estructura de la respuesta la tienes que construir en cada vista por separado.
__________________
I see dead pixels
  #8 (permalink)  
Antiguo 04/02/2011, 17:05
pur
 
Fecha de Ingreso: agosto-2007
Mensajes: 98
Antigüedad: 16 años, 8 meses
Puntos: 4
Respuesta: Duda con AjaxContext

Gracias Serge.
Seguramente sea que estoy bloqueado, porque sigo sin entender lo del action.
ya se que hay dos vistas distintas, pero supongamos que las DOS vistas necesitan datos del controlador, o sea del formAction, como se hace con un action, pasarle datos a dos vistas, form.ajax.phtml y form.phtml.

Esto es lo que no logro entender.
saludos.
  #9 (permalink)  
Antiguo 04/02/2011, 17:25
Avatar de SergeMedina  
Fecha de Ingreso: septiembre-2007
Ubicación: Guadalajara, Jalisco
Mensajes: 459
Antigüedad: 16 años, 7 meses
Puntos: 20
Respuesta: Duda con AjaxContext

Asignalas de manera normal:
Código HTML:
Ver original
  1. $this->view->var1 = 'Data';
El objeto Vista se encarga de pasarle los datos a tus scripts de vista para que puedas hacer uso de ellos.
__________________
I see dead pixels
  #10 (permalink)  
Antiguo 04/02/2011, 17:30
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Duda con AjaxContext

Mmmmmm, es una vista con dos formatos de respuesta diferentes, suponiendo que tengo un action list con los formatos de respuesta html, xml y json:

Código PHP:
Ver original
  1. public function listAction()
  2. {
  3.     $records = $this->_service->fetchAll();
  4.     $this->view->records = $records;
  5. }

list.phtml
Código HTML:
Ver original
  1. <ul>
  2. <?php foreach($this->records as $record) : ?>
  3.    <li><?php echo $record->title; ?></li>
  4. <?php endforeach; ?>
  5. </ul>

list.xml.phtml
Código HTML:
Ver original
  1. <?xml...>
  2. <records>
  3. <?php foreach($this->records as $record) : ?>
  4.    <record><?php echo $record->title; ?></record>
  5. <?php endforeach; ?>
  6. </records>

en el caso del json no es necesario crear la vista, las variables asignadas a la vista se serializan de forma automática(esto es configurable), la logica del action es la misma lo unico que cambia es el formato de la respuesta.
__________________
http://es.phptherightway.com/
thats us riders :)
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 12:34.