Zend Framework: Ajax istekleri özel durumları işlemek nasıl?

3 Cevap php

Bir özel durum Normalde, hata denetleyici düzenli ortak üstbilgi ve altbilgi ile komuta ve görüntüler hata sayfası alır.

Bu davranış, Ajax isteği istedim değildir. Hata durumunda, tüm html sayfa üzerinden gönderilen çünkü. Ve ben doğrudan div http yanıt içerik yükleme ediyorum durumlarda, bu daha da istenmeyen bir.

Yerine Ajax isteği halinde, sadece istisna atılan 'gerçek bir hata' almak istiyorum.

Bunu nasıl yapabilirim?

Bence, kirli bir yolu olabilir: buna göre ajax istek ve süreç içinde bir var ayarlayın. Değil iyi bir çözüm.

3 Cevap

Eğer hata kodlamak ya contextSwitch veya ajaxContext eylem yardımcıları kullanmak eğer sadece hataları geri geçebileceği (muhtemelen autoJsonSerialization kapatarak) JSON / XML nesneleri olarak .

http://framework.zend.com/manual/en/zend.controller.actionhelpers.html#zend.controller.actionhelpers.contextswitch

class Error_Controller extends Zend_Controller{
    public function errorAction(){
        $contextSwitch = $this->_helper->getHelper('contextSwitch');
        $contextSwitch->addActionContext($this->getRequest()->getActionName(),'json')
            ->initContext();
        $errors = $this->_getParam('error_handler');
        $this->view->exception = $errors->exception;
    }
}

Oradan otomatik olarak ekler her AJAX isteği veya kurulum yönlendirme zinciri format = json parametre geçmek ya var.

Bir 'biraz' daha güvenli kurulum için size yardımcı ve XMLHttpRequest başlığı json servis edilecektir yalnızca istekleri olarak ajaxContext kullanabilirsiniz.

Sağlam 'displayExceptions' seçeneğini tutarken kullandığım kod, non-Ajax istekleri için hata işleme korur. O yığın izleme, tam normal hata işleyicisi gibi, ve 'displayExceptions' Lütfen application.ini dosya içinde aktif olduğunda isteği params da geri gönderilir. Esneklik bir sürü kadar JSON verileri geri gönderiyor gibi var - vb, özel bir sınıf oluşturmak JSON view helper ile bir görünümü kullanabilirsiniz

class ErrorController extends Zend_Controller_Action
{
    public function errorAction()
    {
        $errors = $this->_getParam('error_handler');

        if ($this->getRequest()->isXmlHttpRequest()) {
            $this->_helper->contextSwitch()->initJsonContext();

            $response = array('success' => false);

            if ($this->getInvokeArg('displayExceptions') == true) {
                // Add exception error message
                $response['exception'] = $errors->exception->getMessage();

                // Send stack trace
                $response['trace'] = $errors->exception->getTrace();

                // Send request params
                $response['request'] = $this->getRequest()->getParams();
            }

            echo Zend_Json::encode($response);
            return;
        }

        switch ($errors->type) {
            case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ROUTE:
            case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER:
            case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION:

                // 404 error -- controller or action not found
                $this->getResponse()->setHttpResponseCode(404);
                $this->view->message = 'Page not found';
                break;
            default:
                // application error
                $this->getResponse()->setHttpResponseCode(500);
                $this->view->message = 'Application error';
                break;
        }

        // conditionally display exceptions
        if ($this->getInvokeArg('displayExceptions') == true) {
            $this->view->exception = $errors->exception;
        }

        $this->view->request = $errors->request;
    }
}

Ben önceki cevapların hem oynadı ama sorunlarla çalışan tuttu. Ben sorun vardı bir kaç nedeni vardır, bunlardan biri ben işler iyi gitti benim normal kumandadan ham HTML dönmek mümkün istedim olmasıdır.

Bu Sonunda geldi çözümdür:

class ErrorController extends Zend_Controller_Action
{
    public function init()
    {
        // Add the context to the error action
        $this->_helper->contextSwitch()->addActionContext('error', 'json');
    }

    public function errorAction()
    {
        // Check if this is an Ajax request
        if ($this->getRequest()->isXmlHttpRequest()) {

            // Force to use the JSON context, which will disable the layout.
            $this->_helper->contextSwitch()->initContext('json');

            //   Note: Using the 'json' parameter is required here unless you are
            //   passing '/format/json' as part of your URL.
        }

        // ... standard ErrorController code, cont'd ...