在 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 的应用是您希望在下一页(或同一会话中的下一次访问)中显示消息的位置。