2

环境: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

当用户点击是/否时,应通过 ajax/js 更新 2 of 4。我的 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 内容,而是来自另一个 .phtml 文件,由于我添加到我的 actionStack 中的一些操作,它正在呈现。处理完这件事后,呈现的内容如下:

{"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 框架回调)我执行 fowlling: alert(response),打印出我得到的响应......并且它打印出整个shabang:html标签,标题...等。我不知道这怎么可能。

当时我想我可能误用了 YUI 框架,所以我尝试更改为 jquery.js。为此,我将其内容复制到名为 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);
}

});

这是最有趣的部分,我的 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() 将我作为 GET 的 url 附加到现有的 url?这意味着我试图通过我的 $.ajax() 生成的任何 url 都是 gettign 附加到我的“referer”的。所以,我只需要清理它并从零开始,对于我的意思是 url... 我怎么能在 zend 框架中做到这一点?有任何想法吗?

现在,如果我将 sUrl (localhost/PlaceforKids/public/review/feedback/format/json/id/1/helpful/0) 中的字符串直接输入到我浏览器的地址栏上,它会按照预期的方式执行,打印$this->view 中已由 ReviewController 设置的变量,并将它们作为 json 发送。

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

YUI 框架也有同样的问题。我要疯了。

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

4

3 回答 3

0

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

于 2013-05-27T13:07:15.533 回答
0

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

$.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。

于 2013-05-27T23:33:10.280 回答
0

zend 1.1xx 中的 ajax 开关仅适用于“特殊”html 上下文(如果有记忆的话),并且您试图将其设置为 json 上下文。

于 2013-08-08T19:25:13.623 回答