5

我对 zend 框架 2 和 Web 应用程序的编程真的很陌生。在我的应用程序中,我想要一个按钮来触发一个更改数据库内容并返回一个字符串的函数,我可以使用它来更新网站的可见内容。因为我不希望在单击按钮时重新加载网站,所以我想使用 ajax 来执行此操作。在阅读了几个 ajax 教程之后,我想这个解决方案看起来会很相似:

HTML部分:

 <head>

 <script type="text/javascript">

 function myFunction() {

var xmlhttp = new XMLHttpRequest();
    // I am working with Chrome

    xmlhttp.onreadystatechange=function(){

        if (xmlhttp.readyState == 4 && xmlhttp.status == 200){

                var text = xmlhttp.responseText;
        document.getElementById("text_paragraph").innerHTML =                 
                            text;
            }
                    };

        xmlhttp.open("GET", "function.php", true);
        xmlhttp.send();

}

 </script>

 </head>

 <body>
 ......
 <button id="function_button" onClick="myFunction()">Click</button>
 <p id = "text_paragraph">Initial text"</p>
 ......  
 </body>

使用 .php 文件 function.php (一开始,我只希望它返回一个文本值):

<?php

     echo "Text triggered by the button click";
?>

当我尝试测试按钮时,没有任何反应。显然,xmlhttp.status 是 404,并且找不到 function.php 文件。我想我放置 function.php 文件的位置(它与 .phtml - 网站的查看文件位于同一文件夹中)或我在 xmlhttp.open 中使用的 url - 函数是错误的。你能告诉我如何在 zf2 中正确使用 ajax 吗?感谢您的宝贵时间,非常感谢您的每一个回答。

4

2 回答 2

6

首先,我要感谢您的所有回答。他们真的是一个很大的帮助。使用 jQuery 确实比使用纯 Javascript 更舒服,而且不仅适用于 Ajax 调用。詹姆斯,非常感谢你的回答。我尝试使用它,但我可能做错了什么,因为它不起作用。我为我的问题找到了另一种解决方案,我想在这里发布它以解决这个问题。

我要发布的代码是一个小例子,它只是做一件简单的事情:用户点击由 zend 框架 2 创建的网站中的按钮,读取输入字段,将其内容传输到服务器函数,根据接收到的数据,返回一定的结果。收到结果后,网站更新而不重新加载。

由于我将使用 Json 对象进行通信,因此有必要通过将以下代码行添加到 module.config.php 来激活 zf2 中的 Json 策略:

// module/Application/config/module.config.php

'view_manager' => array (
                'display_not_found_reason' => true,
                'display_exceptions' => true,
                'doctype' => 'HTML5',
                'not_found_template' => 'error/404',
                'exception_template' => 'error/index',
                'template_map' => array (
                        'layout/layout' => __DIR__ .   
'/../view/layout/layout.phtml',
                        'application/index/index' => __DIR__ . 
'/../view/application/index/index.phtml',
                        'error/404' => __DIR__ . 
'/../view/error/404.phtml',
                        'error/index' => __DIR__ . 
'/../view/error/index.phtml' 
                ),
                'template_path_stack' => array (
                        __DIR__ . '/../view' 
                ),
                'strategies' => array (            // Add
                                           // this
                        'ViewJsonStrategy' // line
                )

        ),

网站的视图文件(例如名为 example.phtml)将类似于以下内容:

<html>
<head>

<script
    src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>

<script>

//Function,  activated by clicking the button

$("#trigger").click(function(){

    var text = $("#input_to_read").val();
    var myData = {textData:text};

    //The post using ajax
    $.ajax({
            type:"POST",
            // URL : / name of the controller for the site / name of the action to be                         
            //                                                 executed
            url:"/example/answer",
            data:myData,
            success: function(data){
                                   //The callback function, that is going to be executed 
                                   //after the server response. data is the data returned
                                   //from the server.

                                   // Show the returned text
                                   $("#answer").text(data.text);


                                    },
            failure(function(){alert("Failure!!");})


           });


});


</script>
</head>

<body>

<input id="input_to_read" type="text">
<button id="trigger">Klick</button>
<!-- The answer will be shown here. -->
<p id="answer"></p>
</body>
</html>

将在单击按钮时调用的服务器函数被放置在网站的控制器(在本例中为 ExampleController)中,可能如下所示:

//Make sure to add this line to use Json objects
use Zend\View\Model\JsonModel;

....


public function answerAction(){

#read the data sent from the site
$text = $_POST['textData'];

#do something with the data

$text = $text . "successfully processed";

#return a Json object containing the data

$result = new JsonModel ( array (

                'text' => $text 
        ) );
return $result;
}
于 2013-10-01T13:11:22.347 回答
0

通常我会处理这个问题的方式是构建一个 RPC 控制器来只返回 JSON,然后使用一些好的 javascript 框架,如jQueryKnockout JS来动态更新相关的 UI 区域。我相信基础 Zend 控制器类提供了一种$this->_helper->json方法,该方法将返回 JSON,而不是返回您在给定视图中定义的内容。在下面的情况下,Public_RpcController我什至根本没有定义视图。它返回 JSON,我可以将其与 JS 框架一起用于客户端标记操作。使用 JS 框架有一些学习曲线,但非常值得学习。

class Public_RpcController extends MySubClassed_Controller_Action
{
    public function getUserDataAction()
    {
        $output = array();
        $request = $this->getRequest();

        ...

        $output = array(
                'Value1'    => "foobar",
                'Value2'    => "foobar",
        );
        return $this->_helper->json($output);       
    }   
}

// Use Jquery to fetch JSON data to update. 
$.getJSON( "/rpc/get-user-data", function( data ) { 
    // Do something with the JSON data like bind to Knockout template.
});
于 2013-09-27T18:10:34.603 回答