gpt4 book ai didi

jquery - CakePHP 3.x 用于 ajax 请求的 Flash 消息

转载 作者:行者123 更新时间:2023-12-01 08:37:21 26 4
gpt4 key购买 nike

我有一个用 CakePHP 3.5.13 编写的应用程序

它利用Flash Component内置于蛋糕中。当以标准方式配置时,所有这些都可以正常工作,例如

// src/Controller/SomeController.php
public function foo()
{
$this->Flash->set('Records updated', ['element' => 'success']);
return $this->redirect(['action' => 'index']);
}

// src/Template/SomeController/index.ctp
<?= $this->Flash->render() ?>

因此,如果我访问 /some-controller/foo ,它将设置 flash 消息,重新加载 index.ctp 并显示它。

但是,我想修改一些内容,以便这一切都通过 ajax 调用完成。

如果我创建一个新模板,/src/Template/SomeController/index.ctp 并使用以下 jquery:

$('.foo-test').click(function(e) {
e.preventDefault();

$.ajax({
url: '/some-controller/foo'
}).done(response) {
//console.log(response);
window.location.href = '/some-controller/index';
});
});

当我点击.foo-test类的 anchor 时,它将发出ajax请求。

但是重新加载页面 (window.location.reload) 不会显示 Flash 消息。这是为什么,因为这相当于浏览器重新加载 /some-controller/index,对吗?

我认为修改它的唯一方法是让 foo() 返回 JSON 响应。在我使用 console.log(response) 的地方,我可以访问响应数据并确定结果,然后添加 Flash 消息,例如

 if (response.success !== '') {
$('#outcome').html(response.success).addClass('alert alert-success');
}

它将响应消息写入 ID 为 #outcome 的 div,并添加适当的类用于样式设计。

肯定有比这更好的方法,因为它需要重写我需要执行此操作的每个方法?

为什么执行 Controller 函数然后使用 jquery 重新加载页面不起作用,记住以这种方式执行操作时它仍然可以访问 $_SESSION

我已经查看了插件,但想知道是否有一种我忽略的原生 Cake 方法可以做到这一点? Flash 组件文档中未提及 Ajax。

最佳答案

好的,在评论中 @ndm 的帮助下,我已经解决了这个问题。

解决方案是删除 SomeController::foo() 中的 PHP 重定向:

public function foo()
{
// There is no template (foo.ctp) associated with this function.
$this->autoRender = false;

$this->Flash->set('Records updated', ['element' => 'success']);

// Remove line below:
//return $this->redirect(['action' => 'index']);
}

这是因为我们在 jquery 中进行了等效的重定向:

window.location.href = '/some-controller/index'; 

因此对 /some-controller/foo 的 ajax 请求仍然会设置 flash 消息。使用 jquery 重定向重新加载 index.ctp,其中包含渲染 Flash 消息的代码。

如果您要重构代码以这种方式执行操作,则需要确保与本示例中的 foo() 等效的操作仅设置闪烁消息并且不输出任何内容。您可以通过 $this->autoRender = false 实现此目的,然后正常使用 $this->Flash->set() 来设置消息。

关于jquery - CakePHP 3.x 用于 ajax 请求的 Flash 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52167624/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com