2009-09-30 7 views
41

Dokumentacja Zend nie jest do końca jasna.W jaki sposób Zend Framework NIE renderuje widoku/układu podczas wysyłania odpowiedzi AJAX?

Problem polega na tym, że domyślnie Zend automatycznie renderuje widok na końcu każdej akcji kontrolera. Jeśli używasz układu - i dlaczego nie miałbyś tego robić? - to również to potwierdza. Jest to w porządku dla zwykłych stron internetowych, ale kiedy wysyłasz odpowiedź AJAX, nie chcesz tego wszystkiego. Jak zapobiec automatycznemu renderowaniu Zend na zasadzie działania po akcji?

+0

Or możesz użyć przełącznika kontekstu, aby osiągnąć tę funkcję. Spójrz na [tę odpowiedź] (http://stackoverflow.com/questions/1499322/mvc-how-to-ajax/1499947#1499947). –

Odpowiedz

90

nazywają ten kod od wewnątrz wszelkie działania (y) jest/są zamiar wysyłać AJAX odpowiedzi:

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

ten wyłącza silnik układ dla tego działania, a to wyłącza automatyczne renderowanie widoku dla tego działania . Możesz wtedy po prostu "echo", cokolwiek chcesz, aby twoje wyjście AJAX było, bez martwienia się o to, że normalny widok/układ wysyłany jest do jazdy.

16

Jeśli AJAX zwraca JSON można użyć JSON akcji pomocnika:

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

Ten pomocnik będzie json_encode swoją $ dane wyjściowe go z nagłówkami JSON i umrzeć w końcu, więc coraz czyste JSON wrócił z akcji bez renderowania układu i widoku.

f.e. Używam tej konstrukcji w akcji zaczynają uniknąć wielokrotnych kontroli ACL dla różnych działań tylko-do-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

Dzięki temu jest o wiele przyjemniej, że trzeba wstawić wiele linii, aby wyłączyć renderowanie. – mic

-1

Albo można po prostu umieścić matrycę() funkcję pod koniec działania

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