Zend Framework 1.12,ContextSwitch或AjaxContext没有禁用布局和其他问题

时间:2013-05-27 03:02:09

标签: javascript ajax zend-framework ajaxcontext

环境: Windows 8 Apache 2.4 ZF 1.12 PHP 5.4 用于服务器幕后连接的YUI框架

我正在尝试执行一个非常简单的ajax / js组合,用户可以与之交互:

2 of 4 people found this review helpful. Was this review helpful to you? Yes No

当用户点击是/否时,4中的2个应该通过ajax / js更新。我在ReviewController的init()方法中有以下代码(扩展Zend_Controller_Action)。请注意,跟随此操作的视图脚本(feedbackAction)是/views/scripts/review/feedback.json.phtml

 $ajaxContext = $this->_helper->getHelper('AjaxContext');
 $ajaxContext->addActionContext('feedback', 'json')
             ->initContext();

当执行feedbackAction时,异常跳出声明它无法找到feedback.phtml。这告诉我,AjaxContext实际上并没有附加“json”格式。为什么会这样? 我在某处读到应该在action中调用initContext()。我试过了......同样的例外。

然后我尝试使用ContextSwitch,但它似乎胜过让AjaxContext成为ContextSwitch的子类。 ReviewController中init()中的代码替换为:

    $contextSwitch = $this->_helper->getHelper('contextSwitch');
    $contextSwitch->addActionContext('feedback', 'json')
                ->initContext();

这一次,莫名其妙地,不会发生异常,而是呈现以下内容:标头代码(由我的layout.phtml文件调用的myheader.phtml文件生成)。我根本不明白。我已经理解(显然不太好)“addActionContext”+ initContext()DISABLED布局(如果有的话)。 ¿?

修改 我发现它不是html内容形成我的_header.phtml文件,而是来自另一个.phtml文件,因为我添加到我的actionStack中的一些动作而被渲染。一旦处理完毕,呈现的内容如下:

{"originalModule":"default","originalController":"review","originalAction":"feedback","result":true,"id":1,"helpful_yes":"3","helpful_total":"4"}

由于我在ReviewController()的init()方法启动的ContextSwitch助手,因此将这个$ this->视图中的变量呈现为json。当我说“这是rendred”是因为我在地址栏中放置了以下网址:http://localhost/PlacesforKids/public/review/feedback/format/json/id/1/helpful/1

,据说是YUI框架发送的URL。

我说“应该”因为在我的javascript成功函数中(当ajax调用成功执行时被YUI框架回调)我做了fowlling:alert(响应),打印出我得到的响应。 ..它打印出整个shabang:html标签,标题......等等。我不知道怎么可能。

我当时认为我可能会滥用YUI框架,所以我尝试更改为jquery.js。为此,我将this的副本复制到名为jquery.js的文件中,并将其放在my / public / js目录下。这是对服务器进行的ajax调用:

$.ajax({
url: sUrl,//that would be   
          //localhost/PlacesforKids/public/review/feedback/format/json/id/$id/helpful/$helpful
type: "GET",
async: false,
success: function(response){
    alert(response);
}

});

这是HILARIOUS的一部分,我的ReviewController的动作没有被调用。相反,最后呈现的视图是重新呈现的,这意味着它重新发送由最后一个操作(属于与ReviewController不同的控制器)调用的视图脚本生成的内容。我知道它已被重新渲染,因为在该视图脚本的所有者的动作中我添加了这个:

if($this->getRequest()->getQuery('ajax') == 1)
            throw new Exception ("WRONG controller's action being called");

但它永远不会抛出异常。

编辑我认为我认真但我需要知道如何清理baseUrl() 所以我在我的chrome浏览器上打开了java控制台,这样我就可以查看我的reviewFeedback.js通过$ .ajax()方法生成的实际http请求。有趣的是,这就是我得到的:

    Request URL:http://localhost/PlacesforKids/public/place/index/id/localhost/PlaceforKids/public/review/feedback/format/json/id/1/helpful/0
Request Method:GET
Status Code:200 OK
Accept:*/*
Referer:http://localhost/PlacesforKids/public/place/index/id/1
X-Requested-With:XMLHttpRequest

为什么在这个世界上是$ ajax()附上我对现有网址获取的网址?这意味着我试图通过我的$ .ajax()生成的任何url都是附加到我的“referer”。所以,我只需要清理它并从零开始,因为我的意思是网址...我怎么能在zend框架中做到这一点?有什么想法吗?

现在,如果我将sUrl中的字符串(localhost / PlaceforKids / public / review / feedback / format / json / id / 1 / helpful / 0)直接输入到我的broswer中的地址栏中,它会按原样进行do,在$ this->视图中打印出由ReviewController设置的变量,并将它们作为json发送。

{"originalModule":"default","originalController":"review","originalAction":"feedback","result":true,"id":1,"helpful_yes":"3","helpful_total":"4"}

与YUI框架相同的问题。我要疯了。

我真的可以使用帮助,谢谢。

3 个答案:

答案 0 :(得分:0)

您需要将ajax请求更改为异步模式:async: true

答案 1 :(得分:0)

傻傻傻傻的我。这就是$ .ajax()附加编组网址而不是发送新网址的原因。

$.ajax({
url: sUrl,//that would be   
          //localhost/PlacesforKids/public/review/feedback/format/json/id/$id/helpful/$helpful
type: "GET",
async: false,
success: function(response){
    alert(response);
}

我正在写一个没有前导“http://”的GET,默认情况下会导致它附加到现有的url。

sUrl was localhost/PlacesforKids/public/review/feedback/format/json/id/$id/helpful/$helpful
and should have been http://localhost/PlacesforKids/public...

虽然仍然让我感到困惑的是ajaxContext没有像它应该那样停止布局渲染,而是让我使用switchContext。

答案 2 :(得分:0)

zend 1.1x.x中的ajax开关仅用于“特殊”html上下文(如果内存服务)并且您尝试将其设置为json上下文。