在jQuery中触发Zend FlashMessenger

时间:2015-04-29 09:29:57

标签: php jquery ajax zend-framework

我正面临一个问题,我想知道是否有人能指出我正确的方向。

我在我的控制器中使用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?
     }
   });
}

5 个答案:

答案 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)

你的答案的诀窍在于你的视图脚本(* .phtml文件)。

我假设以下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消息,那将更合适。您可以在下一页(或在同一会话中下次访问)中显示消息的应用程序。