如何在yii2中使用小工具kartik select2和ajax&模板

问题描述:

我想在搜索时显示超过1个信息,所以我使用select2 ajax &模板。它使用json。我更改了网址,并在控制器上进行了功能设置。但我有一个问题。它不能显示任何东西。有什么问题?这是我的代码: 视图如何在yii2中使用小工具kartik select2和ajax&模板

$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; 

选择二

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'), 
     ], 
    ]); 

控制器

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(); 
} 

在Mozilla当我打开检查元素控制台。有这样的错误消息:

类型错误:data.slice不是一个函数 S2

尝试删除

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

仍然没有出现在下拉 –

+0

我认为选择二预计标识和文字值,所以在数组中,您必须将ean_no键更改为id,将其命名为文本 – naduvko

+0

您是什么意思?如果没有身份证,这应该不重要吗? –