2012-05-29 24 views
0

我使用的是Cake 2.1,它帶有新的JsonView。我想要做的是POST到我的控制器中的方法並呈現一個html片段,以便我可以將它作爲json中的值返回。在CakePHP中使用JsonView返回HTML片段

以前我會做這樣的事情:

public function ajaxSubmit() { 
    if (!$this->request->is('ajax')) { 
     $this->redirect('/'); 
    } else { 
     $this->autoRender = $this->layout = false; 

     $message = 'Please enter a message'; 
     $this->set('message'); 
     $errorFragment = $this->render('/Elements/errors/flash_error'); 
     $toReturn = array('errorFragment' => $errorFragment); 
     return json_encode($toReturn); 
    } 
} 

其中僅發回一個特定flash_error元素的HTML片段,使得我不能有多個key => values在一個標準的JSON對象被送回。我希望能夠發送html片段和純文本爲json。

所以我的問題是,我怎樣才能渲染一個HTML元素,並使用Cake 2.1提供的JsonView從我的控制器中發回(key => value pair)作爲json?我已經在我的路線文件Router::parseExtensions('json');中設置了,並且我在我的AppController中包含了RequestHandler組件。

回答

0

在使用數據視圖時,您不應該爲AJAX單獨執行一個操作。使用可以使用與您的非AJAX提交相同的操作。

但是,假設您希望對AJAX使用不同的操作,因爲我不知道您的其他操作是什麼樣的,您可以在app/View/ControllerName/json/ajaxSubmit.ctp中寫下類似內容。

<?php 
$errorFragment = $this->element('errors/flash_error'); 
$toReturn = array('errorFragment' => $errorFragment); 
echo json_encode($toReturn); 

然後改變你的行動,這

public function ajaxSubmit() { 
    if (!$this->request->is('ajax')) { 
     $this->redirect('/'); 
    } else { 
     $message = 'Please enter a message'; 
     $this->set('message'); 
    } 
} 

請參閱 「Using a data view with view files」 的文件中。

+0

嗯,謝謝。這似乎工作,但它似乎非常笨重。無論如何,ajaxSubmit.ctp有什麼意義?這似乎是它存在的唯一原因是能夠調用該'flash_error'元素... –

+0

這就是爲什麼你可能會更好使用AJAX和正常提交相同的動作。 假設你的正常提交做同樣的事情,那麼你可以將這個行爲減少到2行代碼。 –

+0

使用RequestHandler和parseExtensions的目的是它會自動切換到數據視圖。這就是爲什麼你需要ajaxSubmit.ctp。如果你給我一個更完整的例子,那麼我可以幫助更多。 –