环境:
Windows 8
阿帕奇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
当用户点击是/否时,应通过ajax / js更新4之2。我的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”格式。为什么会这样呢?
我在某处读到应该在操作内部调用initContext()。我尝试过...同样的例外。
然后,我尝试使用ContextSwitch,但似乎超出了使AjaxContext成为ContextSwitch的子类的目的。 ReviewController中的init()中的代码被替换为:
$contextSwitch = $this->_helper->getHelper('contextSwitch');
$contextSwitch->addActionContext('feedback', 'json')
->initContext();
这次,莫名其妙地,没有发生异常,而是呈现了以下内容:标头代码(由我的_header.phtml文件生成,由我的layout.phtml文件调用)。我一点都不明白。我已经了解(显然不是很好),如果启用了“ addActionContext” + initContext()禁用布局。 ¿?
编辑
我发现它不是我的_header.phtml文件中的html内容,而是另一个由于我添加到actionStack中的操作而呈现的.phtml文件中的内容。处理完之后,将呈现以下内容:
{"originalModule":"default","originalController":"review","originalAction":"feedback","result":true,"id":1,"helpful_yes":"3","helpful_total":"4"}
多亏了在我的ReviewController()的init()方法中启动的ContextSwitch帮助器,将$ this-> view中放置的变量呈现为json。当我说“这被表达”时,是因为我在地址栏中输入了以下网址:
http://localhost/PlacesforKids/public/review/feedback/format/json/id/1/helpful/1
可能是由YUI框架发送的URL。
我之所以说“应该是”,是因为在我的javascript成功函数中(当ajax调用成功执行时,由YUI框架调用了),我进行了以下处理:alert(response),以打印出我得到的响应...并且它打印出整个shabang:html标签,标头...等。我不知道怎么可能。
当时我以为我可能会滥用YUI框架,所以我尝试更改为jquery.js。为此,我将this的副本复制到名为jquery.js的文件中,并将其放在我的/ 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的操作无论如何都不会被调用。取而代之的是,重新渲染最后渲染的视图,这意味着它正在重新发送由last动作(与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()将我拥有的URL附加为GET到现有URL?这意味着我试图通过$ .ajax()生成的任何URL都会被附加到我的“引荐来源网址”中。因此,我只需要清理它并从零开始,对于我的意思是url ...我该如何在zend框架中做到这一点?有任何想法吗?
现在,如果我直接将sUrl中的字符串(localhost / PlaceforKids / public / review / feedback / format / json / id / 1 / helpful / 0)输入到我的浏览器的地址栏上,它就会按照预期的方式进行打印列出由ReviewController设置的$ this-> view中的变量,并将其作为json发送。
{"originalModule":"default","originalController":"review","originalAction":"feedback","result":true,"id":1,"helpful_yes":"3","helpful_total":"4"}
我在YUI框架中遇到了同样的问题。我要疯了。
我真的可以使用帮助,谢谢。
最佳答案
您需要将ajax请求更改为异步模式:async: true
关于javascript - Zend Framework 1.12,ContextSwitch或AjaxContext不会禁用布局和其他问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16765803/