Упреждающий ввод с базой данных в качестве источника

Этот фрагмент работает и правильно устанавливает данные из Table Product и имени столбца в качестве входных данных для расширения начального ввода для YII.

но в итоге я написал SELECT ALL из Table Product, который имеет большое количество данных.

Можем ли мы изменить это, чтобы условие WHERE можно было добавить в DataProvider при событии пользовательского ввода. На основе каждого введенного алфавита может быть запущен новый запрос и получен только подмножество данных?

            <?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" ), 
            )); ?>  

person fortm    schedule 28.04.2013    source источник
comment
comment
Используйте Ajax для загрузки значения на лету. Кстати, вам не нужно указывать matcher, если он не изменился по умолчанию, как у вас выше.   -  person pickypg    schedule 28.04.2013
comment
@pickypg, что было бы лучше, сначала получить все данные из базы данных в качестве источника или использовать Ajax для запуска запроса несколько раз для каждого введенного алфавита?   -  person fortm    schedule 28.04.2013
comment
Это зависит только от вас. Многие данные весьма субъективны. Вы можете настроить поведение запроса Ajax, чтобы ограничить количество обращений к серверу.   -  person pickypg    schedule 29.04.2013


Ответы (1)


Как только вы начнете предоставлять функцию 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 (поиск), не требует обращения к серверу).

В качестве альтернативы вы можете запустить таймер, который фактически ожидает, пока пользователь перестанет печатать, чтобы избежать обращения к серверу при каждом нажатии клавиши. Технически это приводит к более медленной обратной связи, но лучше для сервера и мобильных пользователей. Это уместно на сайтах с большим трафиком.

person pickypg    schedule 28.04.2013