Yii 以数据库作为源进行键入

Yii 以数据库作为源进行键入,yii,bootstrap-typeahead,Yii,Bootstrap Typeahead,这个代码段工作正常,它正确地将表Product和列名中的数据设置为YII的引导typeahead扩展的输入 但是,我最终编写了一个从表中全选的产品,它有大量的数据 我们是否可以修改它,以便在用户输入事件上向数据提供程序添加WHERE条件。根据输入的每个字母表,可以启动一个新的查询,只检索数据的一个子集 <?php $dataProvider = new CActiveDataProvider('Product');

这个代码段工作正常,它正确地将表Product和列名中的数据设置为YII的引导typeahead扩展的输入

但是,我最终编写了一个从表中全选的产品,它有大量的数据

我们是否可以修改它,以便在用户输入事件上向数据提供程序添加WHERE条件。根据输入的每个字母表,可以启动一个新的查询,只检索数据的一个子集

            <?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请求的行为,以限制命中服务器的次数。