2017-10-10 4 views
0

Je veux afficher plus d'une information lors de la recherche, donc j'utilise select2 ajax & templates. Il utilise JSON. Je change l'url et je fais fonctionner sur mon contrôleur. Mais j'ai un problème. Il ne peut rien montrer. Quel est le problème? Ceci est mon code: vueComment utiliser le widget kartik select2 avec ajax & templates dans yii2

$formatJs = <<< 'JS' 
var formatProduct = function (product) { 
    if (product.loading) { 
    return product.text; 
    } 
var markup = 
    '<div class="row">' + 
     '<div class="col-sm-5">' + 
     '<b style="margin-left:5px">' + product.name + '</b>' + 
     '</div>' + 
     '<div class="col-sm-3"><i class="fa fa-code-fork"></i> ' + product.ean_no + '</div>' + 
     '<div class="col-sm-3"><i class="fa fa-star"></i> ' + product.desc + '</div>' + 
    '</div>'; 
    return '<div style="overflow:hidden;">' + markup + '</div>'; 
    }; 
    var formatProductSelection = function (product) { 
    return product.name || product.text; 
    } 
JS; 

// Register the formatting script 
$this->registerJs($formatJs, \yii\web\View::POS_HEAD); 

// script to parse the results into the format expected by Select2 
$resultsJs = <<< JS 
    function (data, params) { 
     params.page = params.page || 1; 
     return { 
      // Change `data.items` to `data.results`. 
      // `results` is the key that you have been selected on 
      // `actionJsonlist`. 
      results: data.results 
     }; 
    } 
JS; 

Select2

echo Select2::widget([ 
     'name' => 'kv-repo-template', 
     'value' => '14719648', 
     'initValueText' => 'kartik-v/yii2-widgets', 
     'options' => ['placeholder' => 'Search for a repo ...'], 
     'pluginOptions' => [ 
      'allowClear' => true, 
      'minimumInputLength' => 1, 
      'ajax' => [ 
       'url' => Url::to(['/bom/product/productlist']), 
       'dataType' => 'json', 
       'delay' => 250, 
       'data' => new JsExpression('function(params) { return {q:params.term, page: params.page}; }'), 
       'processResults' => new JsExpression($resultsJs), 
       'cache' => true 
      ], 
      'escapeMarkup' => new JsExpression('function (markup) { return markup; }'), 
      'templateResult' => new JsExpression('formatProduct'), 
      'templateSelection' => new JsExpression('formatProductSelection'), 
     ], 
    ]); 

contrôleur

public function actionProductlist($search = NULL, $code = NULL) 
{ 
    header('Content-type: application/json'); 
    $clean['more'] = false; 

    $query = new \yii\db\Query; 
    if(!is_Null($search)) 
    { 
     $mainQuery = $query->select('code, name, description, volume') 
          ->from('product'); 
     $command = $mainQuery->createCommand(); 
     $rows = $command->queryAll(); 
     $clean['results'] = array_values($rows); 
    } 
    else 
    { 
     if(!is_null($code)) 
     { 
      $clean['results'] = ['ean_no'=> $code, 'name' => Product::find($code)->nama, 
       'description' => Product::find($code)->description, 'volume' => Product::find($code)->volume]; 
     }else 
     { 
      $clean['results'] = ['ean_no' => 123, 'name' => 'None found', 'description' => 'None found', 'volume' => 'None found']; 
     } 
    } 
    echo \yii\helpers\Json::encode($clean); 
    exit(); 
} 

sur mozilla quand j'ouvre la console d'élément inspecter. il y a un message d'erreur comme ceci:

TypeError: data.slice est pas une fonction S2

Répondre

0

Essayez de supprimer

'processResults' => new JsExpression($resultsJs), 
+0

ne semble toujours pas dans la liste déroulante –

+0

Je pense que Select2 attend id et le texte valeurs, donc dans le tableau, vous devez changer la clé ean_no à l'id, nom au texte – naduvko

+0

Que voulez-vous dire? ne devrait pas importer à la place si sans identifiant? –