输入数据库作为源

时间:2013-04-28 19:51:29

标签: yii bootstrap-typeahead

此代码段有效并且它正确地将表产品和列名称中的数据设置为YII的bootstrap typeahead扩展的输入。

但是,我最终从Table Product中编写了一个SELECT ALL,它具有大量数据。

我们可以修改它,以便可以在用户输入事件的DataProvider上添加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" ), 
            )); ?>  

1 个答案:

答案 0 :(得分:3)

一旦开始向source提供功能,您就有权操纵发生的事情,包括发送请求的频率。

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
        });
    }
}

我有一些类似的代码,我缓存了Ajax代码返回的结果,然后我看到新的query字符串是否有可能改变结果(例如,如果你限制为4个结果,但我只有3个结果,然后只需添加到最后query(搜索)的query就不需要点击服务器了。

或者,您可以启动一个有效等待用户停止输入的计时器,以避免每按一次按键击中服务器的行为。从技术上讲,这会导致反馈速度变慢,但对服务器和移动用户来说更好。这适用于流量很大的网站。