【问题标题】:How to use Js->submit() in CakePHP?如何在 CakePHP 中使用 Js->submit()?
【发布时间】:2011-04-23 13:08:48
【问题描述】:

我试图在 CakePHP 应用程序中为留言板创建一个简单的 Ajax 表单,但我终其一生都无法弄清楚如何正确使用 Js->submit() 函数通过 Ajax 提交表单.

这是我认为的表单代码:

<?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-&gt;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;
    });
});

【问题讨论】:

  • 我的印象是 cake 中的整个 Js 对象都在不断变化。我会密切关注这个问题,看看你会发现什么。
  • 我已经就同一主题提出了另一个问题,对该问题进行了更详细的描述,并提供了更好的解决方案。在这里查看stackoverflow.com/questions/3947027/…

标签: ajax cakephp forms helper


【解决方案1】:

我迟到了!但不久前,大约 3 个月前,我遇到了这个问题。结果是我没有授予用户访问该操作的权限。解决方案是在 AppController beforeFilter() 中添加一些代码,例如:

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

但是我不太确定为什么它会重新渲染父 div,或者有时是整个页面,但我的猜测是,蛋糕是这样设置的,这样每当操作不可访问/不允许时,就会发生一些路由,也许执行索引或其他默认操作,这会导致在您的 ajax 视图中呈现。

如果您在浏览器的网络选项卡(chrome)中检查请求响应,很明显返回的响应与正在呈现的内容相同。但是,我是一个完整的新手,答案是基于猜测。

如果有人能给出更好的解释(请教我们),我会第一个点赞:)

到那时,快乐编码

【讨论】:

    【解决方案2】:

    发生的情况是它加载了default 布局。您必须使用以下行将布局更改为 ajax

    $this->layout = 'ajax';
    

    您将该行插入到您的 isAjax() 条件中。

    您的options 数组也有错误的格式。 action 键应该在 url 键内。

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

    【讨论】:

    • 嗯,这似乎没有任何效果。我需要创建这个 ajax 布局吗?
    • 尝试将cake/libs/view/layouts/ajax.ctp 复制到您应用的布局文件夹中。
    • 谢谢,刚试了,没效果。我已经发布了上面 cakephp 输出的 js。我在 echo Js->submit() 行中找到了一些需要“url”选项的参考。但是,这也不起作用,而是似乎没有发生任何事情。
    • action 键应该在 url 数组中。一个示例用法是:php.pastebin.com/skM4UEyL
    猜你喜欢
    • 1970-01-01
    • 2011-04-26
    • 2013-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多