2010-10-10 53 views
4

我試圖爲CakePHP應用程序中的留言板創建一個簡單的Ajax表單,但是我不知道如何正確使用Js-> submit()函數通過Ajax提交表單。如何在CakePHP中使用Js-> submit()?

我的繼承人視圖中的表單代碼:

<?php 

echo $this->Form->create('Message',array(
    'type' => 'post', 
    'action' => 'add', 
    'onSubmit' => 'return false;' 
)); 

echo $this->Form->input('name', array('label' => 'From:')); 
echo $this->Form->input('text', array('label' => 'Message:')); 

echo $this->Js->submit('Post Your Message', array(
    'action' => 'add', 
    'update' => '#message_board' 
)); 

echo $this->Form->end(); 

?> 

<div id="message_board"> 
    ... 
</div> 

這裏是控制器動作:

function add() { 
$this->autoRender = false; 
if($this->RequestHandler->isAjax()) { 
    $this->layout = 'ajax'; //THIS LINE NEWLY ADDED 
    if(!empty($this->data)) { 
     if($this->Message->save($this->data)) { 
      $this->Session->setFlash('Your Message has been posted'); 
     } 
    } 
} 
} 

奇怪的是,當我提交表單的形式的精確副本會發生什麼,其包含的div被複制到message_board div中。奇怪的。

顯然我錯過了一些東西(或幾件事)。如果任何人有任何想法,或者知道如何使用它的很好的信息來源,它將不勝感激。

謝謝。

更新:我試着將新行$this->layout = 'ajax';添加到控制器(見上面),但它沒有效果。這是CakePHP的jquery輸出,可以告訴別人發生了什麼事情。

$(document).ready(function() { 
    $("#submit-707957402").bind("click", function (event) { 
     $.ajax({ 
      action:"add", 
      data:$("#submit-707957402").closest("form").serialize(), 
      dataType:"html", 
      success:function (data, textStatus) { 
       $("#message_board").html(data); 
      }, 
      type:"post", 
      url:"\/messages" 
     }); 
     return false; 
    }); 
}); 
+0

我感到的印象是整體的js對象蛋糕有點不穩定。將繼續關注這個問題,看看你發現了什麼。 – the0ther 2010-10-18 22:36:16

+0

我已經就同一主題提出了另一個問題,並提供了更詳細的問題描述和更好的解決方案。在這裏看到http:// stackoverflow。com/questions/3947027/action-not-running-with-cakephp-js-submit – 2010-10-19 00:22:44

回答

5

會發生什麼,它會加載default佈局。你必須佈局與以下行改爲ajax

$this->layout = 'ajax'; 

您插入isAjax()條件內該行。

另外你的options數組格式錯誤。 action密鑰應位於url密鑰內。

$this->Js->submit('Post Your Message', array(
     'url' => array(
      'action' => 'add' 
     ), 
     'update' => '#message_board' 
    ) 
); 
+0

嗯,這似乎沒有任何效果。我需要創建這個ajax佈局嗎? – 2010-10-11 17:36:17

+0

嘗試將'cake/libs/view/layouts/ajax.ctp'複製到您應用的佈局文件夾中。 – 2010-10-11 17:59:43

+0

謝謝,只是試過這個,但沒有效果。我已經發布了上面的cakephp輸出的js。我發現在echo Js-> submit()行中需要一個「url」選項。然而,這也不起作用,而不是似乎沒有發生。 – 2010-10-11 18:14:11

0

我很晚參加派對!但是一段時間之後,大約3個月前我遇到了這個問題。結果是,我沒有允許用戶訪問該操作。解決的辦法是在AppController的beforeFilter()添加一些代碼,類似:

function beforeFilter(){ 
    $this->Auth->allow('my_actions_name'); 
} 

但是我真的不知道爲什麼它重新呈現在父DIV,有時整個頁面,但我的猜測是,設置該蛋糕以便每當該操作不可訪問/允許時,執行一些路由,或者執行索引或其他默認操作,這會導致在您的ajax視圖中呈現該操作。

如果您檢查瀏覽器網絡選項卡(以chrome的形式)內的請求響應,則返回的響應與正在呈現的內容相同變得非常清楚。不過,我是一個完全新手,答案是基於猜測。

如果有人可以提供一個更好的解釋(請告訴我們),我會是第一個給予好評:)

至此,快樂編碼