我将Yii2
与Select 2
一起使用。我尝试使用从ajax加载的optgroup示例。浏览器发出请求,但在我尝试打印时没有向我显示任何内容。
代码如下。
<?= Select2::widget([
'name' => 'cycle',
'pluginOptions' => [
'multiple' => true,
'ajax' => [
'url' => Url::to(['films-json/cycle-channel']),
'dataType' => 'json',
'data' => new JsExpression('function(params) { return {q:params.term}; }')
],
],
]);
?>
循环通道操作返回100%工作的json。当我尝试将id用作静态ID(下面的代码)时,它正在工作。但我需要动态搜索。
<?= Select2::widget([
'name' => 'cycle',
'data' => FilmsJsonController::actionCycleChannel(''),
'pluginOptions' => [
'multiple' => true,
]
]);
?>
我做错了什么?
答案 0 :(得分:1)
您的问题是您没有告诉窗口小部件对您服务器返回的数据执行任何操作。您需要在插件选项中添加类似的内容;
'escapeMarkup' => new JsExpression('function (markup) { return markup; }'),
'templateResult' => new JsExpression('function(city) { return city.text; }'),
'templateSelection' => new JsExpression('function (city) { return city.text; }'),
您显然需要将city.text更改为您希望在选择下拉列表中显示的任何文本。
控制器需要以插件期望的格式返回json数据。结构显示了这样的东西;
public function actionSearch($q = null, $id = null) {
\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
$out = ['results' => ['id' => '', 'text' => '']];
if (!is_null($q)) {
$query = new Query;
$query->select('id, title AS text')
->from('city')
->where(['like', 'title', $q])
->limit(20);
$command = $query->createCommand();
$data = $command->queryAll();
$out['results'] = array_values($data);
} elseif ($id > 0) {
$out['results'] = ['id' => $id, 'text' => City::find($id)->title];
}
return $out;
}
有关更多示例,请参阅the documentation