2010-08-01 79 views
0

美好的一天!AJAX調用和JSON數據

我正在學習創建AJAX調用PHP腳本。

基本上,我想找到處理AJAX調用的最佳解決方案。在this問題中,您可以找到我的客戶端代碼部分。

基本上,我想驗證我的知識,如果我錯了,得到任何提示如何使它正確的方式。

所以...我使用KohanaPHP框架(但也要學習ZendFramework)。我用以下代碼創建了一個測試控制器:

public function __construct() 
{ 
    if (request::is_ajax()) { 
     $this->auto_render = FALSE; 
     header('content-type: application/json'); 
    } 
} 

public function index() 
{ 
    $result['success'] = 1; 

    $test_model = new Test_Model; 
    $items = $test_model->get_test_rows(); 
    foreach($items as $item): 
     $rows[] = $item; 
    endforeach;  
    $result['rows'] = json_encode($rows); 

    if (request::is_ajax()) { 
     echo json_encode($result); 
    } 
} 

現在我收到了幾個與此代碼相關的問題。讓我問他們。

1)在上面提到的線程中,我被告知不必使用$.parseJSON();函數,我可以使用data.rows[0]name來代替。不幸的是,它不起作用。對於這不是一個大問題,我可以使用$.parseJSON();,但我想知道我的PHP代碼中是否有錯誤?

2)我試圖學習良好的做法和技術,我儘量不違反MVC規則。我有一個MVC相關的問題。是否可以在控制器中使用echo()?您可能會注意到我正在使用它來返回JSON編碼的數據。

+1

什麼是is_asjax函數?對我來說,根據它是否接收到Ajax調用,您的頁面返回不同的結果似乎有點可疑。相反,請考慮一個名爲「格式」的變量,其值爲「json」,「xml」等。 – 2010-08-01 14:50:08

回答

1

回答問題(2):是的,在控制器中通常是echo的錯誤形式。我甚至會說,構建任何類型的字符串都是不好的形式。

然而,在所有這一切正在輸出是JSON的情況下,我認爲它只是更容易,更簡潔,只是echo json_encode($results);如果你真的想成爲一個MVC純粹的,你總是可以創建一個什麼也不做,但echo json(...);文件。

1

1)jQuery.ajax函數足夠聰明,可以解析您的JSON響應,只要您告訴它您要返回一個JSON封裝對象。下面是你的後端的Kohana可以告訴你的前端的jQuery它們在JSON說話,在你的控制器:

$this->request->headers['Content-Type'] = 'application/json'; 

2)沒有什麼不好的,使用echo但因爲使用的是Kohana的,返回響應的推薦方法瀏覽器客戶端,從控制器內,是:

$this->request->response = json_encode($result); 
+0

不幸的是,當我使用'$ this-> request-> response = json_encode($ result);'腳本不會返回任何東西。顯然,我在KO文檔中找不到任何東西。 – Tom 2010-08-01 15:54:02

+0

對不起,'$ this-> request-> response'用於Kohana 3.x ..而你正在使用Kohana 2.x,它仍然使用'echo'輸出.. – Lukman 2010-08-02 09:17:50

+0

不需要抱歉。我運行了一項研究,並在KO3文檔中找到它。無論如何,我現在更願意繼續使用2.3.4版本,因爲KO3將會被我多次改動(根據版本2.x更新日誌)。不管怎樣,謝謝。 – Tom 2010-08-02 20:21:53

0

在您的代碼:

$result['rows'] = json_encode($rows); 

if (request::is_ajax()) { 
    echo json_encode($result); 
} 

我想說這應該是:

$result['rows'] = $rows; 

if (request::is_ajax()) { 
    echo json_encode($result); 
} 

我不知道is_ajax的用途是什麼,但這可能是一個不必要的檢查。但是可能發生的情況是您對行進行了編碼,然後編碼了整個結果集。所以當解析和你做parseJSON時,你必須再次爲數組的行索引做到這一點。

+0

是的,在我發佈這個問題後我注意到了這一點;) – Tom 2010-08-01 15:58:41

+0

我在處理需要處理直接和ajax請求的控制器時使用了simliar模式。根據請求是否爲ajax選擇輸出方式對於保持DRY邏輯非常有用。 – 2010-08-01 16:16:06