在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
答案 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}}“,例如。祝你好运!