yii2組件之下拉框帶搜索功能(yii-select2)

簡單的小功能,可是用起來仍是蠻爽的。分享出來讓更多的人有更快的開發效率,開開心心快樂編程。php

若是你尚未使用過composer,你可就out了,看個人教程分享,composer簡直就是必備神奇有木有。都說到這個點上了,咱們趕忙使用composer進行安裝吧。git

不急,先來看看效果圖是啥樣的,否則都沒心情沒慾望看下去。web

啥玩意,不感興趣?繼續看嘛,看完再操做一邊才能以爲好在哪裏。ajax

有木有感受很帥氣,固然啦,遠遠不止,還很上檔次用起來效果也是槓槓的有木有。編程

好了好了,抓緊時間安裝,否則聊起來真是沒完沒了。json

composer require kartik-v/yii2-widget-select2 "@dev"
#特別說明,由於這裏安裝的dev版本,也就是開發版本,不穩定版本,若是你的項目是git託管的,composer安裝下來以後這裏記得刪掉 \vendor\kartik-v\yii2-widget-select2目錄下的.git文件,否則你提交不上去的哦

等他個大概5分鐘的樣子差很少了,安裝就行了,而後咱們就能夠像下面同樣開始使用了數組

//若是你的表單是ActiveForm,請使用yii2

use kartik\select2\Select2; 
//$data是鍵值對數組哦,key-value ,下面所聲明的全部$data均爲鍵值對數組,以該數組爲例 
$data = [2 => 'widget', 3 => 'dropDownList', 4 => 'yii2']; 
echo $form->field($model, 'title')->widget(Select2::classname(), [  
    'data' => $data, 
    'options' => ['placeholder' => '請選擇 ...'], 
]);

//若是你的表單是非ActiveForm,能夠參考下面的app

use kartik\select2\Select2; 
echo Select2::widget([ 'name' => 'title', 
    'data' => $data, 
    'options' => ['placeholder' => '請選擇...'] 
]);

#非ActiveFomr生成的更新數據的時候就須要默認選中,好辦,加value值便可composer

use kartik\select2\Select2; 
echo Select2::widget([ 
    'name' => 'title', 
    'value' => 2, 
    'data' => $data, 
    'options' => ['placeholder' => '請選擇...'] 
]);
#可是若是你的表單是ActiveForm生成的,可是每每字段不是表字段怎麼辦呢?更好辦啦,以上面的爲例,你只須要指定$model->title = ['title1', 'title2'];便可

 

基本上就是這麼回事,咱們也就很簡單的實現了下拉選擇並可搜索的功能。可是,咋又冒出來了個可是呢,可是剛纔是咱們想的,事實是這樣的,小編妹子說了,你這能不能操做再方便點,一次選擇一個太麻煩了,能不能多選呀?爲了實現你那ZB的伎倆,好吧,確實也簡單,一行代碼解決掉。

echo $form->field($model, 'title')->widget(Select2::classname(), [ 
    'data' => $data, 
    'options' => ['multiple' => true, 'placeholder' => '請選擇 ...'], 
]);
#多選的添加默認值同上

眼尖的注意到了,加了一個multiple選項。非ActiveForm生成的表單操做一致。

咱們看看效果是怎麼樣的。

到此,咱們已經能夠唱者NB的歌歡快的回家了

等等,好像忘記什麼了,有眼尖的小夥伴可能注意到了,$data都是咱們預先準備好的數據,你說這數據量萬一很大的狀況,不搞死人了嘛,那接下來讓咱們看看如何實現異步搜索結果。舉一個例子,咱們如今要查詢某一個書名,可是咱們的書的數據量大概有100W,很簡單,這須要咱們根據你的搜索結果異步獲取下拉框裏面的數據。未完待續,晚點作進一步說明。

華麗的分割線


來,上傢伙,咱們來看看如何使用異步搜索功能,工做中尤爲是進行關聯數據的時候其用途更是大大的,方便性嘛,看看就知道了,好用的不得了。

基本的使用方法就很少說了,請看官們移步上文,咱們這裏繼續接着大侃大論。

咱們先來預覽下異步搜索的效果圖

注意哦,圖中標記的部分是咱們經過輸入的關鍵詞搜索出來的,異步這效果呢,我截圖上來估計你也看不到效果,動圖我還不會,不知道怎麼搞的,要說具體是啥效果嗎,相信大多數人也是明白滴,這就叫作只可意會,言談不出來。好了,咱們乾脆直接上代碼看具體操做吧。

// view層
use kartik\select2\Select2;
use yii\web\JsExpression;

<?php
    echo $form->field($model, 'title')->widget(Select2::classname(), [
        'options' => ['placeholder' => '請輸入標題名稱 ...'],
        'pluginOptions' => [
            'placeholder' => 'search ...',
            'allowClear' => true,
            'language' => [
                'errorLoading' => new JsExpression("function () { return 'Waiting...'; }"),
            ],
            'ajax' => [
                'url' => '這裏是提供數據源的接口',
                'dataType' => 'json',
                'data' => new JsExpression('function(params) { return {q:params.term}; }')
            ],
            'escapeMarkup' => new JsExpression('function (markup) { return markup; }'),
            'templateResult' => new JsExpression('function(res) { return res.text; }'),
            'templateSelection' => new JsExpression('function (res) { return res.text; }'),
        ],
    ]);
?>

上面的代碼可直接複製使用,惟獨須要修改的就是ajax裏對應的url地址。下面咱們看看controller層代碼是怎麼提供數據的。

//controller層
public function actionSearchTitle ($q)
{
    \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
    $out = ['results' => ['id' => '', 'text' => '']];
    if (!$q) {
        return $out;
    }

    $data = Article::find()
                ->select('id, title as text')
                ->andFilterWhere(['like', 'title', $q])
                ->limit(50)
                ->asArray()
                ->all();
                
    $out['results'] = array_values($data);

    return $out;
}
相關文章
相關標籤/搜索