2013-05-27 49 views
2

環境: 的Windows 8 的Apache 2.4 ZF 1.12 PHP 5.4 YUI在幕後的連接到服務器框架Zend框架1.12,ContextSwitch裏或AjaxContext沒有禁用佈局等問題

我試圖在用戶與之交互來進行一個非常簡單的AJAX/JS組合:

2 of 4 people found this review helpful. Was this review helpful to you? Yes No 

當用戶點擊或者是/否的4 2應通過AJAX/JS更新。我在ReviewController的init()方法中有以下代碼(擴展Zend_Controller_Action)。你要知道,下面這個動作視圖腳本(feedbackAction)是/views/scripts/review/feedback.json.phtml

$ajaxContext = $this->_helper->getHelper('AjaxContext'); 
$ajaxContext->addActionContext('feedback', 'json') 
      ->initContext(); 

當feedbackAction執行異常跳出來聲稱它找不到feedback.phtml 。這告訴我,AjaxContext實際上不是附加「json」格式。這是爲什麼發生? 我在某處讀到應該在動作中調用initContext()。我試過了......同樣的例外。

然後我嘗試使用ContextSwitch,但它似乎擊敗了讓AjaxContext成爲ContextSwitch的子類的目的。在ReviewController在init()的代碼由被替換:

$contextSwitch = $this->_helper->getHelper('contextSwitch'); 
    $contextSwitch->addActionContext('feedback', 'json') 
       ->initContext(); 

這個時候,莫名其妙地,不發生異常,而是顯示以下內容:頭部代碼(由我_header.phtml文件生成一個名爲由我的layout.phtml文件)。我根本不懂。我明白(顯然不是很好),如果啓用了任何「addActionContext」+ initContext()DISABLED佈局。 ¿?

編輯 我想通了,它wasn't HTML內容構成了我_header.phtml文件,但是從已被渲染,因爲有些動作我已經加入到我的動作堆棧另一個一個.phtml文件。一旦這種被照顧的,什麼是呈現如下:

{"originalModule":"default","originalController":"review","originalAction":"feedback","result":true,"id":1,"helpful_yes":"3","helpful_total":"4"} 

這是擺在$這個 - >查看變量被呈現爲JSON的感謝在的init()方法發起ContextSwitch助手我ReviewController()。當我說「這是百」時,是因爲我在地址欄中放置了以下url:http://localhost/PlacesforKids/public/review/feedback/format/json/id/1/helpful/1

據說這是YUI框架發送的URL。

我說「應該是」,因爲在我的javascript成功函數中(在成功執行ajax調用時被YUI框架調用回來)我做fownling:alert(response),打印出我得到的響應...它打印出整個shabang:html標籤,標題等等。我不知道這是怎麼可能的。

我想那時我可能會濫用YUI框架,所以我試圖改用jquery.js。爲此,我將this的版本複製到名爲jquery.js的文件中,並將其放在我的/ public/js目錄下。這裏是阿賈克斯稱之爲製作服務器:

$.ajax({ 
url: sUrl,//that would be 
      //localhost/PlacesforKids/public/review/feedback/format/json/id/$id/helpful/$helpful 
type: "GET", 
async: false, 
success: function(response){ 
    alert(response); 
} 

});

這裏是HILARIOUS部分,我的ReviewController的動作不被稱爲任何東西。相反,最後呈現的視圖會重新呈現,這意味着它重新發送由最後一個操作(屬於與ReviewController不同的控制器)所調用的視圖腳本生成的內容。我知道it's被重新呈現,因爲that's該視圖腳本的所有者我添加了這個動作:

if($this->getRequest()->getQuery('ajax') == 1) 
      throw new Exception ("WRONG controller's action being called"); 

但它永遠不會拋出異常。

編輯我想我得到它,但我需要知道如何清潔的baseUrl() 於是我打開了Java控制檯上我的chrome瀏覽器,所以我可以查找實際的HTTP請求,我reviewFeedback.js通過$ .ajax()方法制作。有趣的事情,這就是我的了:

Request URL:http://localhost/PlacesforKids/public/place/index/id/localhost/PlaceforKids/public/review/feedback/format/json/id/1/helpful/0 
Request Method:GET 
Status Code:200 OK 
Accept:*/* 
Referer:http://localhost/PlacesforKids/public/place/index/id/1 
X-Requested-With:XMLHttpRequest 

爲什麼在世界上是$阿賈克斯()附加的URL我爲GET現有的網址是什麼?這意味着無論我想通過我的$ .ajax()生成的url是gettign APPENDED給我的「引用者」。所以,我只需要清理它,並從零開始,因爲我的意思是...我怎麼能在zend框架中做到這一點?有任何想法嗎?

現在,如果我將sUrl(localhost/PlaceforKids/public/review/feedback/format/json/id/1/helpful/0)中的字符串直接輸入到我的瀏覽器的地址欄中,要做的是,打印已由ReviewController設置的$ this-> view中的變量,並將它們作爲json發送。

{"originalModule":"default","originalController":"review","originalAction":"feedback","result":true,"id":1,"helpful_yes":"3","helpful_total":"4"} 

與YUI框架相同的問題。我要瘋了。

我真的可以使用幫助,謝謝。

回答

0

很傻很傻的很傻我。這是爲什麼$ .ajax()追加構成的url而不是發送新的url的原因。

$.ajax({ 
url: sUrl,//that would be 
      //localhost/PlacesforKids/public/review/feedback/format/json/id/$id/helpful/$helpful 
type: "GET", 
async: false, 
success: function(response){ 
    alert(response); 
} 

我正在寫一個GET沒有領先的「http://」,默認情況下,它導致它追加到現有的網址。

sUrl was localhost/PlacesforKids/public/review/feedback/format/json/id/$id/helpful/$helpful 
and should have been http://localhost/PlacesforKids/public... 

雖然它仍然令我感到困惑的是ajaxContext沒有停止佈局渲染,因爲它應該有,讓我用switchContext代替。

0

你需要Ajax請求更改爲異步模式:async: true

+0

我更改了$ .ajax({...})中的代碼;以異步方式:如您所說的那樣。沒有改變。 – Chayemor

0

zend 1.1x.x中的ajax開關僅用於「特殊」html上下文(如果內存正在服務),並且您試圖將其設置爲json上下文。