2012-10-10 59 views
4

使用PHP Zend Framework 2.0.2,我在AJAX調用後返回JSON數據。顯然,Internet Explorer 9想要下載數據而不是將其返回到調用Javascript方法。如何告訴ZF2的JsonModel返回text/plain而不是application/json?

this onethis one這樣的帖子說使用Content-Type: text/plain而不是Content-Type: application/json,但我該如何使用ZF2的JsonModel?我是新來的...

我想我必須在setOptions()數組中設置一些東西,但什麼?

public function testJsonAction() 
{ 
    $jsonResponse = new JsonModel(array('success' => false)); 

    $jsonResponse->setOptions(array(
     // ** Should I put something here? What? ** 
    )); 

    return $jsonResponse; 
} 

我試圖使用這些:

$this->getResponse()->getHeaders()->addHeaderLine('Content-Type', 'text/plain'); 
    $this->getResponse()->getHeaders()->addHeaderLine('Content-Disposition', 'inline; filename="textdata.json"'); 

,但它不會在響應頭更改HTTP內容類型:

Key     Value 
Response    HTTP/1.1 200 OK 
Content-Type   application/json 
Server    Microsoft-IIS/7.5 
X-Powered-By   PHP/5.3.13 
Set-Cookie   ZDEDebuggerPresent=php,phtml,php3; path=/ 
Content-Disposition inline; filename="textdata.json" 
X-Powered-By   ASP.NET 
Date     Wed, 10 Oct 2012 13:19:42 GMT 
Content-Length  17 

感謝您的幫助!

回答

3

因爲當\ Zend \ Mvc \ MvcEvent :: EVENT_RENDER事件發生時,JsonStrategy會再次更改content-type。源代碼位於

Zend \ View \ Strategy \ JsonStrategy-> injectResponse();

因此,爲了將內容類型替換爲您的內容,您需要在注入JsonStrategy後使用EventManager注入自定義標頭。

試試下面的代碼在你的控制器:

$this->getServiceLocator()->get('Application')->getEventManager()->attach(\Zend\Mvc\MvcEvent::EVENT_RENDER, function($event){ 
    $event->getResponse()->getHeaders()->addHeaderLine('Content-Type', 'text/plain'); 
}, -10000); 
+0

謝謝,但沒有奏效,它仍然是'應用程序/ json'。我在你提到的函數中設置了斷點,並且在附加的事件被調用後我看到它被調用......並且在那之後,標題包含3倍的Content-Type鍵。 – dstj

+0

再次嗨!我嘗試將事件函數附加到'MvcEvent :: EVENT_FINISH'事件上,而不是在它的工作!你認爲會有什麼理由不這樣做嗎? – dstj

+0

嗨,實際上我只是在ViewModel中測試我的代碼,它的工作原理是,現在我測試了JsonViewModel,發現事件優先級不夠小,我將其調整爲-10000,並且它工作正常。 我沒有使用EVENT_FINISH,因爲JSONStrategy在EVENT_RENDER中改變標題,只是爲了減少入侵。 – AlloVince

相關問題