2009-09-30 6 views
41

La documentación de Zend no es muy clara al respecto.¿Cómo hace que Zend Framework NO represente una vista/diseño al enviar una respuesta AJAX?

El problema es que, de forma predeterminada, Zend muestra automáticamente una vista al final de cada acción del controlador. Si está usando un diseño, ¿por qué no? - También representa eso. Esto está bien para las páginas web normales, pero cuando envía una respuesta AJAX no quiere todo eso. ¿Cómo se evita que Zend reproduzca automáticamente acción por acción?

+0

O puede usar el selector de contexto para lograr esta funcionalidad. Eche un vistazo a [esta respuesta] (http://stackoverflow.com/questions/1499322/mvc-how-to-ajax/1499947#1499947). –

Respuesta

90

Llame a este código desde cualquier acción (s) es/son va a ser el envío de respuestas AJAX:

$this->_helper->layout->disableLayout(); 
$this->_helper->viewRenderer->setNoRender(TRUE); 

Esto desactiva el motor de renderizado para esa acción, y se apaga vista automática de reproducción para que la acción . A continuación, puede simplemente "hacer eco" de lo que quiera que sea su salida AJAX, sin preocuparse por las cosas normales de vista/diseño que se enviarán durante el viaje.

16

Si su AJAX está volviendo JSON puede utilizar JSON ayudante de acciones:

$this->_helper->json($data); 

Esta ayuda se json_encode sus datos $, la salida con cabeceras JSON y morir en el pasado, así que estar limpio JSON regresó de acción sin diseño y visualización de visualización.

f.e. Estoy utilizando esta construcción en la acción comienza a evitar que las comprobaciones de ACL para diferentes acciones con sólo-para-ajax

public function photosAction() { 

if ($this->getRequest()->getQuery('ajax') == 1 || $this->getRequest()->isXmlHttpRequest()) { 
    $params = $this->getRequest()->getParams(); 
    $result = false; 

    switch ($params['act']) { 
     case 'deleteImage': 
      //deleting something 
      ... 
      $result = true; //ok 
      break; 

     default : 
      $result = array('error' => 'Invalid action: ' . $params['act']); 
      break; 
     } 

    $this->_helper->json($result); 
} 

// regular action code here 
... 
} 
+0

Gracias, esto es mucho más agradable que tener que poner en varias líneas para deshabilitar la prestación. – mic

-1

O simplemente podría poner die() función al final de la acción

public function someAction() 
{ 
    echo json_encode($data); 
    die(); 
} 
Cuestiones relacionadas