无法完成CakePHP自动完成教程

时间:2015-01-30 00:19:11

标签: php cakephp

在CakePHP中,我尝试使用本教程从文本框创建自动完成功能:http://bakery.cakephp.org/articles/matt_1/2011/08/07/yet_another_jquery_autocomplete_helper_2

我一直在接受 Error: AutoCompleteHelper could not be found. Undefined index: autoCompleteText

我不确定如何解决此问题,因为我尝试重新定位文件并仍然出现相同的错误。

我创建以下文件并从教程中复制代码, 在view / helpers目录中创建auto_complete.php, 并创建webroot / js / views / helpers / auto_complete.js。

控制器 - 测试 function auto_complete

class TestsController extends AppController {

public $helpers = array('Html', 'Form', 'Session','Js','AutoComplete');

 public function auto_complete() {
 $this->loadModel('Tutor');
 debug( $this->params);


    $terms = $this->Tutor->find('all', array(
        'conditions' => array(
            'Tutor.first_name LIKE' => $this->params['url']['autoCompleteText'].'%'
        ),
        'fields' => array('Tutor.first_name'),
        'limit' => 3,
        'recursive'=>-1,
    ));
    $terms = Set::Extract($terms,'{n}.Tutor.first_name');
    $this->set('terms', $terms);
    $this->layout = '';    
} 

视图  auto_complete.ctp

<?php 
echo $this->AutoComplete->input(
    'Tutor.first_name',
    array(
        'autoCompleteUrl'=>$this->Html->url( 
            array(
                'controller'=>'tests',
                'action'=>'auto_complete',
            )
        ),
        'autoCompleteRequestItem'=>'autoCompleteText',
    )
);

  if(isset($terms)) {
    echo $this->Js->object($terms);
  }

       echo $this->Form->create('');

            echo $this->Form->input('type', array('label' => 'Choose' ));
           echo $this->Form->end('send'); 

 ?>

我好好看看以前的帖子,我真的无法解决问题。 Cakephp form input with autocomplete

1 个答案:

答案 0 :(得分:0)

你正在寻找的教程是CakePHP 1.x(从2011年8月开始,Cake 2于2011年10月问世),但是你正在运行Cake 2.5。命名标准在1.x和2.x之间变化,因此Cake无法看到你的助手。

首先:您的主要问题是,当您的助手auto_complete.php应该AutoCompleteHelper.php时,您正在为其命名。

其次,您将它放在错误的目录中。在Cake 1.x中,帮助者生活在/view/helpers/之下。在2.x中,它们位于/View/Helper/下。

第三,关于未定义的索引错误,您需要首先了解此帮助程序的工作原理,以及错误实现错误的原因。

控制器操作auto_complete不应该有视图。它只是一个数据源。当您使用帮助程序时,它会加载Javascript,它通过轮询/auto_complete?autoCompleteText=stringgoeshere来实现其魔力。

您可能会注意到您从控制器操作中删除了$this->layout = 'ajax';,可能是因为您的工具栏未呈现。他们不应该这样做。它只是一个数据源,它需要ajax布局,并且应该没有关于该动作的视图。

因为您试图在auto_complete操作上放置表单而不是其他操作,所以帮助程序正在查找查询参数autoCompleteText,找不到它,并显示错误。

您可以通过尽可能地将auto_complete操作更改回示例中的方式,删除auto_complete.ctp,并尝试在正确的视图中使用帮助程序来解决此问题,例如{ {1}}。

第四:你不应该再使用jsHelper了。它在2.5中被弃用,并且将来会消失。基本上,该教程已经过时了。

但是,用add.ctp替换$this->set('terms', $terms);并编写自己的JS来进行AJAX调用真的很容易。我建议合并Typeahead.js.

最后:你应该咨询1.x -> 2.x migration guide,,同样,一旦你的帮助程序运行,你的代码中还会出现一些其他的错别字 - 无论如何都会打破它 - “{{ 1}}“,例如。祝你好运!