yii2 select2 by kartik-v 设置默认值

问题描述 投票:0回答:7

我有一个关于 yii2 kartik-v widget select 2 的问题。

小部件已附加到我视图中的字段

<?=
$form->field($model, 'address')->widget(Select2::className(), [
    'options' => ['placeholder' => 'Inserta an address '],
    'pluginOptions' => [
        'allowClear' => true,
        'minimumInputLength' => 3,
        'ajax' => [
            'url' => Url::to(['register/addresses']),
            'dataType' => 'json',
            'data' => new JsExpression('function(params) { return {q:params.term}; }')
        ],
        'escapeMarkup' => new JsExpression('function (markup) { return markup; }'),
        'templateResult' => new JsExpression('function(address) { return address.name; }'),
        'templateSelection' => new JsExpression('function (address) { return address.name; }'),
    ],
    'pluginEvents' => [
        "select2:select" => "function(e) {
                      // some function

                }",
    ],
]);
?>

如果在我的控制器中我想为此字段设置一个值

喜欢:

$model->address = "Some Value";
在视图上该字段保持空白

我能做什么?

更新!

正如文档所说,如果我使用此插件的 ajax 版本,我可以使用选项:“initValueText”。所以我尝试设置

'initValueText' => $model->address,
但结果是一样的

php yii2
7个回答
2
投票

嘿我对 #ajax 也有同样的问题,占位符和 initValueText 都没有显示 我所做的是这个

<?php
    $product = $model->product_id ? Product::findOne($model->product_id)->name : 'select ....';
    echo $form->field($model, 'product_id')->widget(Select2::classname(), [
        'initValueText' => $product, // set the initial display text
        // 'options' => ['placeholder' => 'select ....'],
        'pluginOptions' => [
            'allowClear' => true,
            'minimumInputLength' => 3,
            'ajax' => [
                'url' => Url::to(['list']),
                'dataType' => 'json',
                'data' => new JsExpression('function(params) { return {q:params.term}; }')
            ],
            'escapeMarkup' => new JsExpression('function (markup) { return markup; }'),
            'templateResult' => new JsExpression('function(product_id) { return product_id.name; }'),
            'templateSelection' => new JsExpression('function (product_id) { return product_id.name; }'),
        ],
    ]);?>

如果型号是新的,则显示“选择...”,否则显示产品名称 因为“选项”也没有多大作用 希望这会给某人带来希望


1
投票

问题是这样的:

  'escapeMarkup' => new JsExpression('function (markup) { return markup; }'),
  'templateResult' => new JsExpression('function(address) { return address.name; }'),
  'templateSelection' => new JsExpression('function (address) { return address.name; }'),

这个插件似乎需要键“templateResult”和“templateSelection”的特定返回。

我用address.text(而不是adress.name)修改了JsExpression返回值作为指导示例:Link

然后我还修改了返回结果的 PHP 方法:

public function actionAddresses($q = NULL, $id = NULL)
{

    Yii::$app->response->format = Response::FORMAT_JSON;

    $results = array();
    if (!is_null($q)) {

        $geocoder = new GeocodingClient();
        $request = $geocoder->lookup(['address' => $q]);
        $counter = 1;
        foreach ($request['results'] as $key => $value) {
            $results['results'][] = [
                'id' => $counter,
                'text' => $value['formatted_address'], // Instead of 'name'
                'coordinate' => $value['geometry']['location']
            ];
            $counter++;
        }
    }
    return $results;
}

我希望这可以帮助有类似问题的人。


1
投票

有点晚了..但我也遇到了同样的问题..我通过分配值解决了它

  <?=
  $form->field($model, 'address')->widget(Select2::className(), [
                          'initValueText' => $model->address,
                           'value' => $model->address,
                           'options' => ['placeholder' => 'Inserta an address '],
                           'pluginOptions' => [
                                    'allowClear' => true,
                                    'minimumInputLength' => 3,
                                'ajax' => [
                                    'url' => Url::to(['register/addresses']),
                                    'dataType' => 'json',
                                    'data' => new JsExpression('function(params) { return {q:params.term}; }')
    ],
    'escapeMarkup' => new JsExpression('function (markup) { return markup; }'),
    'templateResult' => new JsExpression('function(address) { return address.name; }'),
    'templateSelection' => new JsExpression('function (address) { return address.name; }'),
],
'pluginEvents' => [
    "select2:select" => "function(e) {
                  // some function

            }",
],
   ]);
 ?>

0
投票

您使用kartik select2,在控制器中您已经为“initValueText”设置了一个值(id/ids)和名称值

$model->id = 1; // or if arrays [1,3,4,5]
$username = User::find()->select('name')->where('id' => $model->id)->scalar();

并在视图kartik中选择2

$form->field($model, 'username')->widget(Select2::className(), [
'initValueText' => $username;
...

0
投票

我也面临着同样的问题。然后我尝试在选项中输入值键,它起作用了。

<?php
 echo $form->field($model, 'test')->widget(Select2::classname(), [
                                    //'data' => ['test', 'test2'],
                                    'initValueText'=>['test','test2'],
                                    'options' => ['multiple' => true, 'value'=>['1','2']],
                                    'pluginOptions' => [
                                        'multiple' => true,
                                        'allowClear' => true,
                                        'minimumInputLength' => 1,
                                        'language' => [
                                            'errorLoading' => new JsExpression("function () { return 'Waiting for results...'; }"),
                                        ],
                                        'ajax' => [
                                            'url' => '...',
                                            'dataType' => 'json',
                                            'data' => new JsExpression('function(params) { return {q:params.term}; }')
                                        ],
                                        'escapeMarkup' => new JsExpression('function (m) { return m; }') 
                                ?>
                      

希望对某人有帮助。


0
投票

我也有同样的情况,之前的答案都没有帮助我。问题出在这个地方:

'templateSelection' => new JsExpression('function (address) { return address.name; }'),

改成这样,一切正常:

'templateSelection' => new JsExpression('function (address) { return address.name || address.text; }'),

-1
投票

我通过使用触发功能修复了这个解决方案。在下面的方法中,我们可以在 kartik select2 小部件中设置默认值。

$('#id').val(11).trigger('change'); //in val() mention the hash value of your select2 list 
© www.soinside.com 2019 - 2024. All rights reserved.