Как заставить Zend Framework НЕ отображать представление/макет при отправке ответа AJAX?
Документация Zend на самом деле не ясна.
Проблема заключается в том, что по умолчанию Zend автоматически отображает представление в конце каждого действия контроллера. Если вы используете макет - а почему бы и нет? - это также делает это. Это нормально для обычных веб-страниц, но когда вы отправляете ответ AJAX, вы не хотите этого. Как вы предотвращаете Zend от автоматического рендеринга по принципу действия за действиями?
Ответы
Ответ 1
Вызвать этот код из любых действий (-ов), которые будут/будут отправлять ответы AJAX:
$this->_helper->layout->disableLayout();
$this->_helper->viewRenderer->setNoRender(TRUE);
Это отключает механизм компоновки для этого действия и отключает автоматическую визуализацию представления для этого действия. Затем вы можете просто "эхом" получить все, что хотите, на выходе AJAX, не беспокоясь о том, что обычный просмотр/компоновка будет отправляться вместе для поездки.
Ответ 2
Если ваш AJAX возвращает JSON, вы можете использовать JSON-помощник действий:
$this->_helper->json($data);
Этот помощник будет json_encode
ваши $data, выводит его с заголовками JSON и, наконец, умрет, поэтому мы получаем чистый JSON, возвращенный из действия без макета и рендеринга представления.
f.e. Я использую эту конструкцию в действии, чтобы избежать нескольких проверок ACL для разных действий just-for-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
...
}
Ответ 3
Или вы можете просто положить функцию die() в конце действия
public function someAction()
{
echo json_encode($data);
die();
}