Yii2 - Установить значение для плагина Select2 с Ajax Загрузка - PullRequest
0 голосов
/ 18 сентября 2018

У меня проблемы с плагином Select2 kartik для yii2.Я установил свой плагин с помощью Ajax Loading и в моем представлении создания работает нормально, поэтому я могу выбрать несколько значений и сохранить их в базе данных.

Когда я показываю представление обновления, я хочу установить видимое значение, которое яСохранено в моей базе данных, но оно показывает мне только серый прямоугольник со значком 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; }'),
    ],
]);

И вот результат.

enter image description here

$ 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; }')

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

Привет, ребята, спасибо, что ответили мне.Я нашел решение для своей проблемы, и я опубликую ответ для всех, у кого такая же проблема.

Это мое поле 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') 

, вы должны установить свою таблицу идентификаторов в свою текстовую таблицу (в моем случае art_modello) AS id и AS text в соответствии с виджетом select2.Это не указано в документации, поэтому я прочел код и нашел это решение.

0 голосов
/ 18 сентября 2018

Вы не можете установить initValueText как массив.См. Документы:

initValueText: строка, текст для отображения в виджете Select2 для начального значения.Это полезно и применимо, когда вы используете виджет с данными, загруженными ajax И / ИЛИ вы не предоставляете данные.Посмотрите пример использования ajax.

'initValueText' => $art_text, // set the initial display text

Используйте вместо этого data:

'data' => $art_list,
...