【问题标题】:Zend Framework 1.12, ContextSwitch or AjaxContext not disabling layout and other problemsZend Framework 1.12,ContextSwitch or AjaxContext not disable layout等问题
【发布时间】:2013-05-27 03:02:09
【问题描述】:

环境: 视窗 8 阿帕奇 2.4 采埃孚 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。为此,我将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);
}

});

这是最有趣的部分,我的 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) 中的字符串直接输入到我浏览器的地址栏上,它会按预期执行做,打印出ReviewController设置的$this->view中的变量,并以json形式发送。

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

我在使用 YUI 框架时遇到了同样的问题。我要疯了。

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

【问题讨论】:

    标签: javascript ajax zend-framework ajaxcontext


    【解决方案1】:

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

    【讨论】:

    • 我更改了 $.ajax({...}); 中的代码异步:真的,正如你所建议的。没有任何改变。
    【解决方案2】:

    傻傻傻傻我。这就是为什么 $.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。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-01-12
        • 1970-01-01
        • 1970-01-01
        • 2017-02-11
        • 2011-08-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多