我正面临一个问题,我想知道是否有人能指出我正确的方向。
我在我的控制器中使用Zend的FlashMessenger,但在我的一个文件中,我通过AJAX帖子处理我的表单。在这种情况下,我认为Humane-flatty将是Zend FlashMessenger的一个很好的替代品,但它的布局完全不同。
有没有办法在我的AJAX帖子中触发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?
}
});
}
答案 0 :(得分:2)
我假设您的索引控制器“index / line”中的URL,函数行返回一些JSON / XML或您返回的一些HTML,并附加到带有#open_orders id的div中。
这个想法是,你的ajax调用需要从你的控制器返回一个调用你的FlashMessenger调用的函数,
$this->_helper->FlashMessenger(array('success' => 'Succesfully added'));
换句话说,代码需要从您的控制器运行,并通过直接调用返回到您的客户端(在您的jquery statemtent中回调您的ajax调用)。
您可以从“res”返回部分响应并将它们拆分并将正确的部分附加到div中,然后将另一部分附加到具有不同ID的前一个div,以便您注入的FlashMessenger代码可以正常工作,< / p>
OR
您有以下评论
//Can I call Zend flashmessenger from here?
你调用另一个ajax调用你的控制器中的另一个函数,你调用该函数中的FlashMessenger代码,这样你就可以调用所需的位和FlashMessenger
TLDR:您需要在Zend(服务器)端调用FlashMessenger,并通过.ajax调用从客户端调用控制器中的该函数
希望这有帮助。
答案 1 :(得分:1)
我假设以下index.phtml文件作为indexController文件的视图脚本,该文件打印表单并执行Ajax。当您单击“获取外部内容”按钮时,/ 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(&#39; / index / line&#39;)的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警告消息&#39; Succesfully added&#39;。
我测试了上面的代码,它适用于Zend 1.12。
答案 2 :(得分:0)
我认为有两种方法可以满足您的需求:
1)就像serdarsenay所提到的那样,您可以基于ie 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
答案 3 :(得分:0)
我可能无法正确理解你的问题,但这是我的解决方案:
您不需要flashMessenger,如果我理解正确,您只需要显示一条消息。使用FlashMessenger的默认HTML,您可以执行以下操作:
function showFlash(type, message)
{
$("body").append('<ul class="alert alert-'+type+'"><li>'+message+'</li</ul>');
}
只要您希望显示Flash消息,只需致电showFlash("success", "Orderline succesfully added.");
即可。
您可能需要将"body"
更改为要将消息添加到的任何元素。
答案 4 :(得分:0)
我假设这个URI&#39; / index / line&#39; (IndexController中的lineAction)应该返回消息。
您应该从Flash中读取(或基本上呈现消息)以清空消息会话。否则,在主布局中的下一个渲染中,它将显示给用户。
一般情况下,我建议不要先为每封格式的消息设置一条flash消息。如果您只是在重定向时设置了Flash消息,那将更合适。您可以在下一页(或在同一会话中下次访问)中显示消息的应用程序。