【问题标题】:Return only body with CakePHP Ajax request仅返回带有 CakePHP Ajax 请求的正文
【发布时间】:2013-03-12 06:14:49
【问题描述】:

我有一个模式对话框,在满足特定条件后会弹出并要求用户更改密码。

这很好用,但是,当请求完成时,它会返回包括模板在内的整个页面。

我以我的默认布局 (APP/View/Layout/default.ctp) 运行脚本,因为它需要在每个页面上,因为用户已登录然后重定向到请求的页面。

我想知道,如何只显示请求页面的内容,而不显示模板?

这是我的 jquery 脚本:

//In the default layout
$(document).ready(function(e) {
var $dialog = $("#view_dialog").dialog(
{
    autoOpen: false,
    closeOnEscape: false,
    closeText: 'hide',
    draggable: false,
    modal: true,
    resizable: false,
    hide:"fade",
    title: 'Password Change Required',
    open: function(event, ui) { $(".ui-dialog-titlebar-close").hide(); },
    buttons: {
        "Change Now": function() {
            if($('#password').val() != "" && $('#confirm').val() != "") {
                if($('#password').val() == $('#confirm').val()) {
                    $.ajax({
                        type: 'GET',
                        url: 'pages/password_change',
                        data: { password:$('#password').val(), usern : $('#usern').val() },
                        success: function(data) {
                        if(data.indexOf("SUCCESS") != -1) {
                            data = data.replace("SUCCESS", "");
                            $('#passAlert').removeClass('ui-state-error').addClass('ui-state-highlight').html(data).show('fast');
                            setTimeout(function() { $(this).dialog('close'); },1000);
                        } else {
                            data = data.replace("FAIL", "");
                            $('#passAlert').html(data).show('fast');
                        }
                    },
                    error: function(xhr,ajaxOptions,thrownError) {
                        data = data.replace("FAIL", xhr.status + ' - ' + thrownError);
                        $('#passAlert').html(data).show('fast');
                    }
                });
            } else {
                $('#passAlert').html("Password doesn't match.").show('fast');
            }
        } else
            $('#passAlert').html("Please complete all boxes.").show('fast');
        }
    }
});
if(<?php echo $showPopup ?>) {
    $dialog.dialog("open");
}

目前我只是重复一个句子来检查响应。

【问题讨论】:

    标签: jquery ajax cakephp-2.2


    【解决方案1】:

    Cakephp 允许我们在每个控制器操作上覆盖模板。

    内部控制器动作写在下面的行。

    $this->layout = "ajax";
    

    你可以像这样禁用布局

    $this->layout = null ;
    

    现在你的动作会变成

    public function listnames()
    {
        $this->layout = null ;
        // $this->layout = "ajax";
        //other code.
    }
    

    【讨论】:

    • 我读了这么多,但我把它放在哪个控制器中(考虑到我是从 pages 目录中的脚本运行它。我应该改变我的结构,所以我宁愿有一个 changePassword 函数在我的用户控制器中,它只是在提交时调用它?我该怎么做?
    • @DarkRanger 在页面控制器的 password_change 操作中更改它......看看魔法
    • 不。 pages 控制器是 cakePHP 附带的标准控制器。当我将该操作添加到控制器时,没有任何反应。
    • @DarkRanger 您要添加哪一行。??如果您添加 layout = null 然后尝试 layout = ajax 并仅添加 在 ajax 布局中。
    • 我无法将public function password_change 添加到PagesController,没有任何反应。它不会运行该操作中的代码
    猜你喜欢
    • 1970-01-01
    • 2018-10-26
    • 2010-11-06
    • 2014-12-01
    • 2013-10-17
    • 1970-01-01
    • 2013-10-29
    • 2014-08-23
    • 1970-01-01
    相关资源
    最近更新 更多