Yii2 - 使用 Ajax 加载设置 Select2 插件的值
Yii2 - Set value for Select2 plugin with Ajax Loading
我在使用 yii2 的 Select2 kartik 插件时遇到了一些问题。
我使用 Ajax 加载设置我的插件,并且在我的创建视图中工作正常,所以我可以 select 多个值并将其保存在数据库中。
当我显示更新视图时,我想将我保存在数据库中的值设置为可见,但它只显示一个带有 x 图标的灰色矩形。
这是我试过的。
echo $form->field($model, 'lista_art')->widget(Select2::classname(), [
'initValueText' => $art_list,// array of text to show in the tag for the selected items
'showToggleAll' => false,
'options' => ['placeholder' => 'Select...',
'multiple' =>true,
'value' => $value, // array of Id of the selected items
],
'pluginOptions' => [
'tags' => true,
'tokenSeparators' => [',', ' '],
'allowClear' => true,
'minimumInputLength' => 3,
'language' => [
'errorLoading' => new JsExpression("function () { return 'Waiting for results...'; }"),
],
'ajax' => [
'url' => \yii\helpers\Url::to(['lista-articoli']),
'dataType' => 'json',
'data' => new JsExpression('function(params) { return {q:params.term}; }')
],
'escapeMarkup' => new JsExpression('function (markup) { console.log(markup);return markup; }'),
'templateResult' => new JsExpression('function(lista_art) { return lista_art.art_modello; }'),
'templateSelection' => new JsExpression('function (lista_art) { return lista_art.art_modello; }'),
],
]);
这就是结果。
$art_list 和 $value 是这样的数组
$art_list = ['name1','name2'];
$value= ['id_name1','id_name2'];
如果我用浏览器检查器检查代码,我会发现这个
<li class="select2-selection__choice" title="name1">
<span class="select2-selection__choice__remove" role="presentation">×</span>
</li>
更新
我会找到错误,这是非常微不足道的..
错误在这里
'templateResult' => new JsExpression('function(lista_art) { return lista_art.art_modello; }'),
'templateSelection' => new JsExpression('function (lista_art) { return lista_art.art_modello; }')
没有 lista_art.art_modello 因为此元素的对象格式为 id:id_name1 和 text:name1 所以像这样更改代码就可以了
'templateResult' => new JsExpression('function(lista_art) { return lista_art.text; }'),
'templateSelection' => new JsExpression('function (lista_art) { return lista_art.text; }')
您不能将 initValueText
设置为数组。
请参阅文档:
initValueText
: string, the text to displayed in Select2 widget for the initial value. This is useful and applicable when you are using the widget with ajax loaded data AND/OR you are not providing the data. Check the ajax usage section for an example.
'initValueText' => $art_text, // set the initial display text
改用data
:
'data' => $art_list,
大家好,感谢您回复我。
我找到了解决问题的方法,我会 post 为遇到相同问题的任何人提供答案。
这是我认为的 Select2 字段:
echo $form->field($model, 'lista_art')->widget(Select2::classname(), [
'initValueText' => $art_list,// array of text to show in the tag for the selected items
'showToggleAll' => false,
'options' => ['placeholder' => 'Seleziona un prodotto',
//'tags' => true,
'multiple' =>true,
'value' => $value, // array of Id of the selected items
'class' => 'validatej'
],
'pluginOptions' => [
'tags' => true,
'tokenSeparators' => [',' , ' '],
'allowClear' => true,
'minimumInputLength' => 3,
'language' => [
'errorLoading' => new JsExpression("function () { return 'Waiting for results...'; }"),
],
'ajax' => [
'url' => \yii\helpers\Url::to(['lista-articoli']),
'dataType' => 'json',
'data' => new JsExpression('function(params) {return {q:params.term}; }')
],
'escapeMarkup' => new JsExpression('function (markup) { return markup; }'),
'templateResult' => new JsExpression('function(data) {return data.text; }'),
'templateSelection' => new JsExpression('function (data) { return data.text; }'),
],
]);
问题不在这里,而在 ajax
调用的函数中
public function actionGetArt($q = null, $id = null) {
\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;//restituisco json
$out = ['results' => ['id' => '', 'text' => '']];
if (!is_null($q)) {
$query = new Query;
$query->select('art_cod AS id, art_modello AS text')
->from('art')
->where(['ilike', 'art_modello', $q]);
$command = $query->createCommand();
$data = $command->queryAll();
$out['results'] = array_values($data);
}
elseif ($id > 0) {
$out['results'] = ['id' => $id, 'text' => Catalogo::find($id)->art_modello];
}
return $out;
}
在我调用 select Sql
的行中
$query->select('art_cod AS id, art_modello AS text')
您必须根据 select2 小部件设置您的 id table 和您的文本 table(在我的例子中 art_modello)AS id 和 AS 文本。这在文档中没有指定,所以我会阅读代码并找到这个解决方案。
我在使用 yii2 的 Select2 kartik 插件时遇到了一些问题。 我使用 Ajax 加载设置我的插件,并且在我的创建视图中工作正常,所以我可以 select 多个值并将其保存在数据库中。
当我显示更新视图时,我想将我保存在数据库中的值设置为可见,但它只显示一个带有 x 图标的灰色矩形。
这是我试过的。
echo $form->field($model, 'lista_art')->widget(Select2::classname(), [
'initValueText' => $art_list,// array of text to show in the tag for the selected items
'showToggleAll' => false,
'options' => ['placeholder' => 'Select...',
'multiple' =>true,
'value' => $value, // array of Id of the selected items
],
'pluginOptions' => [
'tags' => true,
'tokenSeparators' => [',', ' '],
'allowClear' => true,
'minimumInputLength' => 3,
'language' => [
'errorLoading' => new JsExpression("function () { return 'Waiting for results...'; }"),
],
'ajax' => [
'url' => \yii\helpers\Url::to(['lista-articoli']),
'dataType' => 'json',
'data' => new JsExpression('function(params) { return {q:params.term}; }')
],
'escapeMarkup' => new JsExpression('function (markup) { console.log(markup);return markup; }'),
'templateResult' => new JsExpression('function(lista_art) { return lista_art.art_modello; }'),
'templateSelection' => new JsExpression('function (lista_art) { return lista_art.art_modello; }'),
],
]);
这就是结果。
$art_list 和 $value 是这样的数组
$art_list = ['name1','name2'];
$value= ['id_name1','id_name2'];
如果我用浏览器检查器检查代码,我会发现这个
<li class="select2-selection__choice" title="name1">
<span class="select2-selection__choice__remove" role="presentation">×</span>
</li>
更新 我会找到错误,这是非常微不足道的.. 错误在这里
'templateResult' => new JsExpression('function(lista_art) { return lista_art.art_modello; }'),
'templateSelection' => new JsExpression('function (lista_art) { return lista_art.art_modello; }')
没有 lista_art.art_modello 因为此元素的对象格式为 id:id_name1 和 text:name1 所以像这样更改代码就可以了
'templateResult' => new JsExpression('function(lista_art) { return lista_art.text; }'),
'templateSelection' => new JsExpression('function (lista_art) { return lista_art.text; }')
您不能将 initValueText
设置为数组。
请参阅文档:
initValueText
: string, the text to displayed in Select2 widget for the initial value. This is useful and applicable when you are using the widget with ajax loaded data AND/OR you are not providing the data. Check the ajax usage section for an example.
'initValueText' => $art_text, // set the initial display text
改用data
:
'data' => $art_list,
大家好,感谢您回复我。 我找到了解决问题的方法,我会 post 为遇到相同问题的任何人提供答案。
这是我认为的 Select2 字段:
echo $form->field($model, 'lista_art')->widget(Select2::classname(), [
'initValueText' => $art_list,// array of text to show in the tag for the selected items
'showToggleAll' => false,
'options' => ['placeholder' => 'Seleziona un prodotto',
//'tags' => true,
'multiple' =>true,
'value' => $value, // array of Id of the selected items
'class' => 'validatej'
],
'pluginOptions' => [
'tags' => true,
'tokenSeparators' => [',' , ' '],
'allowClear' => true,
'minimumInputLength' => 3,
'language' => [
'errorLoading' => new JsExpression("function () { return 'Waiting for results...'; }"),
],
'ajax' => [
'url' => \yii\helpers\Url::to(['lista-articoli']),
'dataType' => 'json',
'data' => new JsExpression('function(params) {return {q:params.term}; }')
],
'escapeMarkup' => new JsExpression('function (markup) { return markup; }'),
'templateResult' => new JsExpression('function(data) {return data.text; }'),
'templateSelection' => new JsExpression('function (data) { return data.text; }'),
],
]);
问题不在这里,而在 ajax
调用的函数中public function actionGetArt($q = null, $id = null) {
\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;//restituisco json
$out = ['results' => ['id' => '', 'text' => '']];
if (!is_null($q)) {
$query = new Query;
$query->select('art_cod AS id, art_modello AS text')
->from('art')
->where(['ilike', 'art_modello', $q]);
$command = $query->createCommand();
$data = $command->queryAll();
$out['results'] = array_values($data);
}
elseif ($id > 0) {
$out['results'] = ['id' => $id, 'text' => Catalogo::find($id)->art_modello];
}
return $out;
}
在我调用 select Sql
的行中$query->select('art_cod AS id, art_modello AS text')
您必须根据 select2 小部件设置您的 id table 和您的文本 table(在我的例子中 art_modello)AS id 和 AS 文本。这在文档中没有指定,所以我会阅读代码并找到这个解决方案。