Yii 以数据库作为源进行键入
这个代码段工作正常,它正确地将表Product和列名中的数据设置为YII的引导typeahead扩展的输入 但是,我最终编写了一个从表中全选的产品,它有大量的数据 我们是否可以修改它,以便在用户输入事件上向数据提供程序添加WHERE条件。根据输入的每个字母表,可以启动一个新的查询,只检索数据的一个子集Yii 以数据库作为源进行键入,yii,bootstrap-typeahead,Yii,Bootstrap Typeahead,这个代码段工作正常,它正确地将表Product和列名中的数据设置为YII的引导typeahead扩展的输入 但是,我最终编写了一个从表中全选的产品,它有大量的数据 我们是否可以修改它,以便在用户输入事件上向数据提供程序添加WHERE条件。根据输入的每个字母表,可以启动一个新的查询,只检索数据的一个子集 <?php $dataProvider = new CActiveDataProvider('Product');
<?php
$dataProvider = new CActiveDataProvider('Product');
$dataArray = $dataProvider->getData();
$myarray = array();
foreach ($dataArray as $data){
array_push($myarray, CHtml::encode($data->name));
}
$this->widget('bootstrap.widgets.TbTypeahead', array(
'name' => 'typeahead',
'options'=>array(
'name'=>'typeahead',
'source'=>$myarray,
'items'=>4,
'matcher'=>"js:function(item) {
return ~item.toLowerCase().indexOf(this.query.toLowerCase());
}",
),
'htmlOptions'=>array('class'=>'search-query span3', 'placeholder'=>"Search" ),
)); ?>
一旦您开始向
源代码提供函数,您就有能力处理发生的事情,包括发送请求的频率
minLength: 3, // <- custom option
source: function(query, process) {
var longEnough = query.length >= this.options.minLength;
// you can create custom variables (this.search) that a remembered across
// searches
if (longEnough && (! this.search || whateverRuleYouWantToLimitBy)) {
// remember the query so that you can compare it to the next one
this.search = query;
$.ajax({
url: '/ajaxsearch.php?value=' + query,
type: "GET",
success: process
});
}
}
minLength:3,/=this.options.minLength;
//您可以创建自定义变量(this.search),该变量可以跨
//搜查
如果(足够长&(!this.search | | whateverRuleYouWantToLimitBy)){
//记住查询,以便将其与下一个查询进行比较
this.search=查询;
$.ajax({
url:'/ajaxsearch.php?value='+query,
键入:“获取”,
成功:过程
});
}
}
我有一些做类似事情的代码,我缓存Ajax代码返回的结果,然后我查看新的查询
字符串是否有可能更改结果(例如,如果您限制4个结果,但我只有3个结果,那么一个查询
,它只会添加到最后一个查询
(搜索)无需点击服务器)
或者,您可以启动一个计时器,有效地等待用户停止键入,以避免每次按键都会触动服务器的行为。从技术上讲,这会导致反馈速度变慢,但对服务器和移动用户更好。这适用于流量大的站点。一旦您开始向源代码提供功能,您就可以控制发生的情况,包括发送请求的频率
minLength: 3, // <- custom option
source: function(query, process) {
var longEnough = query.length >= this.options.minLength;
// you can create custom variables (this.search) that a remembered across
// searches
if (longEnough && (! this.search || whateverRuleYouWantToLimitBy)) {
// remember the query so that you can compare it to the next one
this.search = query;
$.ajax({
url: '/ajaxsearch.php?value=' + query,
type: "GET",
success: process
});
}
}
minLength:3,/=this.options.minLength;
//您可以创建自定义变量(this.search),该变量可以跨
//搜查
如果(足够长&(!this.search | | whateverRuleYouWantToLimitBy)){
//记住查询,以便将其与下一个查询进行比较
this.search=查询;
$.ajax({
url:'/ajaxsearch.php?value='+query,
键入:“获取”,
成功:过程
});
}
}
我有一些做类似事情的代码,我缓存Ajax代码返回的结果,然后我查看新的查询
字符串是否有可能更改结果(例如,如果您限制4个结果,但我只有3个结果,那么一个查询
,它只会添加到最后一个查询
(搜索)无需点击服务器)
或者,您可以启动一个计时器,有效地等待用户停止键入,以避免每次按键都会触动服务器的行为。从技术上讲,这会导致反馈速度变慢,但对服务器和移动用户更好。这适用于流量大的站点。可能重复使用Ajax动态加载值。顺便说一句,如果匹配器与上面的默认值保持不变,则不需要指定它。@pickypg,最初从数据库获取所有数据作为源还是使用Ajax对输入的每个字母表多次运行查询更好?这真的取决于您。“很多”数据是相当主观的。您可以调整Ajax请求的行为,以限制命中服务器的次数。可能的重复使用Ajax动态加载值。顺便说一句,如果匹配器与上面的默认值保持不变,则不需要指定它。@pickypg,最初从数据库获取所有数据作为源还是使用Ajax对输入的每个字母表多次运行查询更好?这真的取决于您。“很多”数据是相当主观的。您可以调整Ajax请求的行为,以限制命中服务器的次数。