在 jQuery 中触发 Zend FlashMessenger
Trigger Zend FlashMessenger in jQuery
我遇到了一个问题,我想知道是否有人可以为我指明正确的方向。
我在我的控制器中使用 Zend 的 FlashMessenger,但在我的一个文件中,我通过 AJAX posts 处理我的表单。在那种情况下,我认为 Humane-flatty 将是 Zend FlashMessenger 的一个很好的替代品,但它的布局完全不同。
有没有办法在我的 AJAX post 中触发 Zend Flashmessenger?
这就是我目前在我的控制器中调用 Zend FlashMessenger 的方式:
$this->_helper->FlashMessenger(array('success' => 'Succesfully added'));
这是我的 jQuery:
if (data.weight !== '' && data.customer != '') {
$.ajax({
type: 'POST',
url: '/index/line',
data: data,
success: function(res) {
$('#open_orders').append(res);
flashSucces.log('Orderline succesfully added.');
//Can I call Zend flashmessenger from here?
}
});
}
我想你的 URL,索引控制器中的函数行 "index/line",returns some JSON/XML or some HTML which you return 并附加到带有 #open_orders id.
的 div
想法是,您的 ajax 调用需要 return 控制器中的一个函数调用您的 FlashMessenger 调用,
$this->_helper->FlashMessenger(array('success' => 'Succesfully added'));
换句话说,代码需要从您的控制器 运行,然后 return 发送到您的客户端(在您的 jquery 语句中回调您的 ajax 调用)通过直接调用。
您可以 return 来自您 "res" 的部分回复并将它们拆分并将正确的部分附加到您的 div 中,而另一部分附加到前面的 div 使用不同的 ID,这样您注入的 FlashMessenger 代码就可以工作,
或
您有以下评论的地方
//Can I call Zend flashmessenger from here?
您调用另一个 ajax 调用控制器中的另一个函数,您在该函数中调用 FlashMessenger 代码,这样您就可以同时调用所需的位和 FlashMessenger
TLDR:您需要在 Zend(Server) 端调用 FlashMessenger,并通过 .ajax 调用
从客户端调用控制器中的该函数
希望这对您有所帮助。
我认为有两种方法可能会满足您的需求:
1) 正如 serdarsenay 所提到的,您可以开发一个通用的有效 request/response 模型,即基于 json 或您最喜欢的格式来组织客户端和服务器端之间的通信,包括一个地方消息。 json 中的示例:
{
'status': 'success',
'message': 'Successfully added',
'whateverYouNeed': 'Goes here'
}
这种方法可能有两个主要问题:它需要您编写相应的 jQuery 对应方,它知道如何处理您的 json 响应,例如解析状态代码并在您希望它们出现的位置显示消息。为了使其可重用,您可能希望将此对应物设计为也进行回调,以便您能够以某种方式做出具体反应,具体取决于您发送的表单类型。此外,服务器端必须知道这是一个 ajax 请求,因此它不必将消息添加到 FlashMessenger ,而是 到 json 响应如果您希望处理控制器和视图以直接访问或通过 ajax.
两种方式工作
我想先介绍这个来证明另一种方法的合理性:
2) 在服务器端编写一个包装程序,它除了回显您的 FlashMessenger 消息并通过 ajax 单独调用它之外什么都不做。是的,您随后会有一个额外的 GET 请求,但考虑到您获得的灵活性可能是值得的。您的服务器端将保持不变,无论是直接请求还是通过 ajax 请求,一切都会像以前一样工作。您唯一要做的就是在您认为可能有应该向用户显示的消息时,向您的 FlashMessenger 包装器添加一个额外的 ajax 调用。并考虑 ajax 调用失败(无响应、超时等)并且用户必须重新加载页面的情况:没问题,因为您的服务器端视图将始终显示存储的闪存消息,否则会已丢失,但已成功插入数据库,但用户未被告知。
第一种方法与您的问题没有密切关系,但我觉得我必须提到这个替代方法来证明方法 2 的额外 GET 请求是合理的。
所以有些伪可能看起来像这样:
-- ajax/flashMessenger.php
echo flash messages
并且在客户端需要时(即提交表单后、用户成功登录后等)
-- flashMessenger.js
request to ajax/FlashMessenger.php
attach output to i.e. #messages div
答案的诀窍在于您的视图脚本(*.phtml 文件)。
我假设以下 index.phtml 文件是您的 indexController 文件的视图脚本,它打印表单并执行您的 Ajax。当您单击按钮 'Get External Content' 时,来自 /index/line 控制器的 Ajax 响应的结果将填充到 div1 标记中。
<!DOCTYPE html>
<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
<script>
$(document).ready(function(){
$("button").click(function(){
$.ajax({url: '/index/line',
success: function(res){
$("#div1").html(res);
//your FlashMessenger will execute from here with AJAX success.
}
});
});
});
</script>
</head>
<body>
<?php // print your form from controller here. echo $this->form; ?>
<div id="div1">Let jQuery AJAX Change This Text</div>
<button>Get External Content</button>
</body>
</html>
以上代码将从 indexController ('/index/line') 处的 lineAction 获取结果。在 IndexController.php
添加以下行
public function lineAction()
{
$this->_helper->FlashMessenger('Succesfully added');
if ($this->_helper->FlashMessenger->hasMessages())
{$this->view->messages = $this->_helper->FlashMessenger->getMessages();}
}
现在调用你的线动作的视图脚本(line.phtml)。在 line.phtml
中添加以下行
<?php
if ($this->messages!=Null)
{ $messages = $this->messages;
foreach($messages as $message) {
echo '<script> alert("'.$message.'") </script>';
}
}
现在执行你的代码。您的 Ajax 将成功执行 Zend FlashMessenger 并显示 JavaScript 警报消息 'Succesfully added'.
我已经测试了上面的代码,它在 Zend 1.12 上运行得很好。
我可能没有正确理解你的问题,但这是我的解决方案:
你不需要flashMessenger,如果我理解正确的话,你只需要显示一条消息。使用 FlashMessenger 的默认 HTML,您可以执行如下操作:
function showFlash(type, message)
{
$("body").append('<ul class="alert alert-'+type+'"><li>'+message+'</li</ul>');
}
只要您希望显示即显消息,只需调用 showFlash("success", "Orderline succesfully added.");
。
您可能需要将 "body"
更改为要将消息添加到的任何元素。
我假设此 URI“/index/line”(IndexController 中的 lineAction)应该 return 消息。
您应该从 Flash 中读取(或基本上呈现消息)以清空消息会话。否则在主布局的下一次渲染中它将显示给用户。
一般来说,我不建议一开始就为每条表单消息都设置一个闪现消息。如果您在重定向时只设置一条闪现消息,那将更合适。 flash 的应用是您希望在下一页(或同一会话中的下一次访问)中显示消息的位置。
我遇到了一个问题,我想知道是否有人可以为我指明正确的方向。
我在我的控制器中使用 Zend 的 FlashMessenger,但在我的一个文件中,我通过 AJAX posts 处理我的表单。在那种情况下,我认为 Humane-flatty 将是 Zend FlashMessenger 的一个很好的替代品,但它的布局完全不同。
有没有办法在我的 AJAX post 中触发 Zend Flashmessenger?
这就是我目前在我的控制器中调用 Zend FlashMessenger 的方式:
$this->_helper->FlashMessenger(array('success' => 'Succesfully added'));
这是我的 jQuery:
if (data.weight !== '' && data.customer != '') {
$.ajax({
type: 'POST',
url: '/index/line',
data: data,
success: function(res) {
$('#open_orders').append(res);
flashSucces.log('Orderline succesfully added.');
//Can I call Zend flashmessenger from here?
}
});
}
我想你的 URL,索引控制器中的函数行 "index/line",returns some JSON/XML or some HTML which you return 并附加到带有 #open_orders id.
的 div想法是,您的 ajax 调用需要 return 控制器中的一个函数调用您的 FlashMessenger 调用,
$this->_helper->FlashMessenger(array('success' => 'Succesfully added'));
换句话说,代码需要从您的控制器 运行,然后 return 发送到您的客户端(在您的 jquery 语句中回调您的 ajax 调用)通过直接调用。
您可以 return 来自您 "res" 的部分回复并将它们拆分并将正确的部分附加到您的 div 中,而另一部分附加到前面的 div 使用不同的 ID,这样您注入的 FlashMessenger 代码就可以工作,
或
您有以下评论的地方
//Can I call Zend flashmessenger from here?
您调用另一个 ajax 调用控制器中的另一个函数,您在该函数中调用 FlashMessenger 代码,这样您就可以同时调用所需的位和 FlashMessenger
TLDR:您需要在 Zend(Server) 端调用 FlashMessenger,并通过 .ajax 调用
从客户端调用控制器中的该函数希望这对您有所帮助。
我认为有两种方法可能会满足您的需求:
1) 正如 serdarsenay 所提到的,您可以开发一个通用的有效 request/response 模型,即基于 json 或您最喜欢的格式来组织客户端和服务器端之间的通信,包括一个地方消息。 json 中的示例:
{
'status': 'success',
'message': 'Successfully added',
'whateverYouNeed': 'Goes here'
}
这种方法可能有两个主要问题:它需要您编写相应的 jQuery 对应方,它知道如何处理您的 json 响应,例如解析状态代码并在您希望它们出现的位置显示消息。为了使其可重用,您可能希望将此对应物设计为也进行回调,以便您能够以某种方式做出具体反应,具体取决于您发送的表单类型。此外,服务器端必须知道这是一个 ajax 请求,因此它不必将消息添加到 FlashMessenger ,而是 到 json 响应如果您希望处理控制器和视图以直接访问或通过 ajax.
两种方式工作我想先介绍这个来证明另一种方法的合理性:
2) 在服务器端编写一个包装程序,它除了回显您的 FlashMessenger 消息并通过 ajax 单独调用它之外什么都不做。是的,您随后会有一个额外的 GET 请求,但考虑到您获得的灵活性可能是值得的。您的服务器端将保持不变,无论是直接请求还是通过 ajax 请求,一切都会像以前一样工作。您唯一要做的就是在您认为可能有应该向用户显示的消息时,向您的 FlashMessenger 包装器添加一个额外的 ajax 调用。并考虑 ajax 调用失败(无响应、超时等)并且用户必须重新加载页面的情况:没问题,因为您的服务器端视图将始终显示存储的闪存消息,否则会已丢失,但已成功插入数据库,但用户未被告知。
第一种方法与您的问题没有密切关系,但我觉得我必须提到这个替代方法来证明方法 2 的额外 GET 请求是合理的。
所以有些伪可能看起来像这样:
-- ajax/flashMessenger.php
echo flash messages
并且在客户端需要时(即提交表单后、用户成功登录后等)
-- flashMessenger.js
request to ajax/FlashMessenger.php
attach output to i.e. #messages div
答案的诀窍在于您的视图脚本(*.phtml 文件)。
我假设以下 index.phtml 文件是您的 indexController 文件的视图脚本,它打印表单并执行您的 Ajax。当您单击按钮 'Get External Content' 时,来自 /index/line 控制器的 Ajax 响应的结果将填充到 div1 标记中。
<!DOCTYPE html>
<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
<script>
$(document).ready(function(){
$("button").click(function(){
$.ajax({url: '/index/line',
success: function(res){
$("#div1").html(res);
//your FlashMessenger will execute from here with AJAX success.
}
});
});
});
</script>
</head>
<body>
<?php // print your form from controller here. echo $this->form; ?>
<div id="div1">Let jQuery AJAX Change This Text</div>
<button>Get External Content</button>
</body>
</html>
以上代码将从 indexController ('/index/line') 处的 lineAction 获取结果。在 IndexController.php
添加以下行public function lineAction()
{
$this->_helper->FlashMessenger('Succesfully added');
if ($this->_helper->FlashMessenger->hasMessages())
{$this->view->messages = $this->_helper->FlashMessenger->getMessages();}
}
现在调用你的线动作的视图脚本(line.phtml)。在 line.phtml
中添加以下行<?php
if ($this->messages!=Null)
{ $messages = $this->messages;
foreach($messages as $message) {
echo '<script> alert("'.$message.'") </script>';
}
}
现在执行你的代码。您的 Ajax 将成功执行 Zend FlashMessenger 并显示 JavaScript 警报消息 'Succesfully added'.
我已经测试了上面的代码,它在 Zend 1.12 上运行得很好。
我可能没有正确理解你的问题,但这是我的解决方案:
你不需要flashMessenger,如果我理解正确的话,你只需要显示一条消息。使用 FlashMessenger 的默认 HTML,您可以执行如下操作:
function showFlash(type, message)
{
$("body").append('<ul class="alert alert-'+type+'"><li>'+message+'</li</ul>');
}
只要您希望显示即显消息,只需调用 showFlash("success", "Orderline succesfully added.");
。
您可能需要将 "body"
更改为要将消息添加到的任何元素。
我假设此 URI“/index/line”(IndexController 中的 lineAction)应该 return 消息。
您应该从 Flash 中读取(或基本上呈现消息)以清空消息会话。否则在主布局的下一次渲染中它将显示给用户。
一般来说,我不建议一开始就为每条表单消息都设置一个闪现消息。如果您在重定向时只设置一条闪现消息,那将更合适。 flash 的应用是您希望在下一页(或同一会话中的下一次访问)中显示消息的位置。