Php 没有ZendX库的Zend框架中的Jquery自动完成

Php 没有ZendX库的Zend框架中的Jquery自动完成,php,jquery,zend-framework,autocomplete,Php,Jquery,Zend Framework,Autocomplete,我发布这个问题是因为我不知道还能做什么。我在Zend中看到过类似的问题,但被接受的答案对我来说根本不起作用 环境: Zend框架1.12 Jquery:Jquery-ui.css为1.10.3,Jquery-1.9.1.js为1.10.3,Jquery-ui.js为1.10.3 当我使用jQueryAPI文档的默认功能示例时,一切都很顺利,效果非常好。当我将连接到控制器“自动完成”操作的url作为源时,问题就出现了。我的控制器做得很好,ir以json格式响应,但问题是,它的响应是: {"json

我发布这个问题是因为我不知道还能做什么。我在Zend中看到过类似的问题,但被接受的答案对我来说根本不起作用

环境: Zend框架1.12 Jquery:Jquery-ui.css为1.10.3,Jquery-1.9.1.js为1.10.3,Jquery-ui.js为1.10.3

当我使用jQueryAPI文档的默认功能示例时,一切都很顺利,效果非常好。当我将连接到控制器“自动完成”操作的url作为源时,问题就出现了。我的控制器做得很好,ir以json格式响应,但问题是,它的响应是:

{"json":[{"label":"John-1","value":"John"},{"label":"Jay","value":"Jay-1"},{"label":"Lusi","value":"Lusi-1"}]}
你看,它把所有的东西都放在一个1的数组中,键为“json”,这很让人恼火,因为Jquery不理解这一点,Jquery只需要/需要/查找包含数据的数组。所以我理解它为什么不起作用,但我不知道如何解决它(我不熟悉php、zend和javascript)

为了让控制器停止渲染viewscripts和layout,并将传递给视图的信息作为json发送,我在init()方法中使用switchContext助手:

以下是自动完成功能:

public function autocompleteAction()
    {
        $autocomplete_data=array(
            array('label'=>'John-1', 'value'=>'John'),
            array('label'=>'Jay', 'value'=>'Jay-1'),
            array('label'=>'Lusi', 'value'=>'Lusi-1')
        );
       //echo Zend_Json::encode($autocomplete_data);
       $this->view->json= $autocomplete_data;
    }
如您所见,它之所以将“json”作为我发送的所有自动完成信息的数据的键,是因为传递给视图的变量的名称。(我通过将变量名形式json更改为“lala”来测试它,当我通过url访问时,数组的键现在是“lala”,如{“lala”:[{“label”:“John-1”,“value”:“John”}

您可以看到,我还尝试使用json_encode()(Zend_json::encode()就是这样使用的),并对此进行了响应,这就是发送的内容:

[][{"label":"John-1","value":"John"},{"label":"Jay","value":"Jay-1"},{"label":"Lusi","value":"Lusi-1"}]
我甚至不知道如何使用它访问数据

有人知道如何像那样简单地发送数组[{“label”:“something”,“value”:“something”}…]吗

或者有人知道我如何操纵来自“source:”的响应,以便它读取控制器响应为-->响应['json']的任何内容吗

编辑

好的,我相信我已经掌握了一些东西。jquery的api文档已经,而且我相信它正在做我想做的事情:从源代码处操纵响应。因此我尝试用以下方法来模仿它:

$( "#profesor" ).autocomplete({
        source:function(response ) {
            $.ajax({
                url: url,
                dataType: "json",
                success: function( data ) {
                    console.log(data);
                    response(data['json']);
                }
            });
        },
        minLength:1
    });
当它到达console.log(data)时,“data”是我的控制器正在发送的响应(数组中带有“json”键的响应)。好极了,所以我要做的就是将autocomplete的响应设置为data['json'],但一旦它到达该行……就会出现以下异常:“未捕获类型错误:对象不是函数”.这意味着什么?它不能访问AUT的“响应”功能

完成编辑
提前感谢!

由于我在“source”中粗心地编写了函数,引发了异常。jquery api文档显示,该函数包含两个参数,第一个是输入到autocomplete输入元素中的值(在我的案例中,它是id为“profesor”的文本类型),第二个是响应函数。如果你看我在“编辑”部分的代码,你会注意到我只有一个参数,当我尝试将它作为函数调用时,异常(在其绝对右侧)未捕获类型错误:对象不是函数跳出。因此,这里是正确的方法:

 $( "#profesor" ).autocomplete({
            source: function( request, response ) {
                $.ajax({
                    url: url+'/term/'+request.term,
                    dataType: "json",
                    success: function( data ) {
                        response(data['json']);
                    }
                });
            }
        });
我所做的是将“/term/typedTerm”附加到url中,以便我的控制器可以处理并在数据库中查找以该url开头的任何内容。jquery将收到的响应是它想要的:

[{"label":"YourLabel","value":"LabelValue"},{"label":"Yourlabel2","value":"YourValue2"}]
再一次,我不得不上下检查,因为我的控制器发送了用{“viewVariableName”:[actualData]}包装的json数据,而我需要的是:[actualData].我注意到,这种情况不会发生在那些不使用contextSwitch\u助手的人身上,而是在应该发送json数据的每个动作上手动禁用布局和渲染

 $this->_helper->viewRenderer->setNoRender(true);
 $this->_helper->layout->disableLayout();
 ....logical stuff here...
 echo Zend_Json::encode($DataToSend);
为什么我要留下来?因为我宁愿只在一个地方指定将使用contextSwitch发送json数据的控制器(因为该控制器中的一些操作将发送json数据),而不是在每个操作上记住(并留下)两行代码。我想是“喜欢”的问题

 $this->_helper->viewRenderer->setNoRender(true);
 $this->_helper->layout->disableLayout();
 ....logical stuff here...
 echo Zend_Json::encode($DataToSend);