之前在工作中遇到了问题,我要实时手动输入筛选查询用户,有两种实现方式
方式一:
<?= $form->field($model, 'companies_company_id')->widget(Select2::classname(), [ 'data' => ArrayHelper::map(Companies::find()->all(),'company_id','company_name'), 'language' => 'en', 'options' => ['placeholder' => 'Select a state ...'],//直接在这个地方加入数组 'pluginOptions' => [ 'allowClear' => true ], ]); ?>这种方式只适合小范围的数组筛选,如果这个数据超大,查询时会出现卡顿的现象,用户体验非常差,建议用ajax实时查询结果。就是下面介绍的重点:
方式二:
View.php
<?= $form->field($model, 'borrowid')->widget(kartik\select2\Select2::className(), [ 'options' => ['placeholder' => '请输入用户真实姓名 ...'], 'pluginOptions' => [ 'allowClear' => true, 'minimumInputLength' => 1,//重要 'language' => [ 'errorLoading' => new JsExpression("function () { return 'Waiting...'; }"), ], 'ajax' => [ 'url' => '/borsroswer/search', 'dataType' => 'json', 'data' => new JsExpression('function(params) { return {q:params.term}; }'), 'cache' => true ], 'width' => '400px', 'escapeMarkup' => new JsExpression('function (markup) { return markup; }'), 'templateResult' => new JsExpression('function(res) { return res.text; }'), 'templateSelection' => new JsExpression('function (res) { return res.text; }'), ], ]); ?>
Controller.php
public function actionSearch(){ $q = Yii::$app->request->get('q'); Yii::$app->response->format = Response::FORMAT_JSON;//响应数据格式为json $out = ['results' => ['id' => '', 'text' => '']]; if (!$q) { return $out; } $data = User::find() ->select('user.userId, user.realname,user.cardId,ab.status') ->leftJoin('account_bank ab','ab.userId=user.userId') ->andFilterWhere(['like', 'user.realname', $q]) ->limit(50) ->asArray() ->all(); $out['results'] = array_map([$this, 'format'],$data); return $out; } private function format($data){ $result = []; $result['id'] = $data['userId']; $result['text'] = '['.$data['userId'].']['.$data['realname'].']['.$data['cardId'].']'; return $result; }