2009-09-30 9 views
41

La documentazione di Zend non è chiara su questo.Come si fa a rendere Zend Framework NON renderizza una vista/layout quando si invia una risposta AJAX?

Il problema è che, per impostazione predefinita, Zend esegue automaticamente il rendering di una vista alla fine di ogni azione del controller. Se stai usando un layout - e perché no? - lo rende anche questo. Questo va bene per le normali pagine Web, ma quando invii una risposta AJAX non vuoi tutto questo. Come impedisci a Zend di eseguire automaticamente il rendering su base azione-per-azione?

+0

Or puoi utilizzare il selettore di contesto per ottenere questa funzionalità. Dai un'occhiata a [questa risposta] (http://stackoverflow.com/questions/1499322/mvc-how-to-ajax/1499947#1499947). –

risposta

90

chiamata questo codice all'interno di qualsiasi azione (s) è/stanno per essere l'invio di AJAX risposte:

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

Ciò disabilita il motore di layout per l'azione, e si spegne il rendering vista automatica per quell'azione . Puoi quindi "echo" qualsiasi cosa desideri che sia l'output AJAX, senza preoccuparti della normale vista/layout che viene inviata per il viaggio.

16

Se l'AJAX sta tornando JSON è possibile utilizzare JSON azione helper:

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

questo helper sarà json_encode vostro $ data, uscita con le intestazioni JSON e morire alla fine, così abbiamo sempre pulita JSON restituito dall'azione senza layout e visualizzazione rendering.

f.e. Sto usando questa costruzione in azione iniziando ad evitare molteplici controlli ACL per diverse azioni just-in-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

Grazie, è molto più carino dover inserire più righe per disabilitare il rendering. – mic

-1

o si può semplicemente mettere die() la funzione alla fine dell'azione

public function someAction() 
{ 
    echo json_encode($data); 
    die(); 
} 
Problemi correlati