Подтвердить что ты не робот

Как заставить Zend Framework НЕ отображать представление/макет при отправке ответа AJAX?

Документация Zend на самом деле не ясна.

Проблема заключается в том, что по умолчанию Zend автоматически отображает представление в конце каждого действия контроллера. Если вы используете макет - а почему бы и нет? - это также делает это. Это нормально для обычных веб-страниц, но когда вы отправляете ответ AJAX, вы не хотите этого. Как вы предотвращаете Zend от автоматического рендеринга по принципу действия за действиями?

4b9b3361

Ответ 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();
}