2016-08-02 107 views
1

我正在使用Yii2的高级模板。每当select2'占位符'被分配一个值时,小部件将不显示初始值。我可以通过使用['placeholder' => $placeholder]解决这个问题,并且每当初始值存在时将该变量设置为NULL。但是,如果占位符为NULL并且显示初始值,则allowClear不起作用。我究竟做错了什么?Yii2 kartik-v select2小部件allowClear和占位符无法正常工作

检视:

use kartik\select2\Select2; 

<?= $form->field($profile, 'associationSelect')->widget(Select2::classname(), [ 
    'data' => $associationList, 
    'language' => 'en', 
    'theme' => 'krajee', 
    'options' => ['placeholder' => 'Select Association ...'], 
    'pluginOptions' => ['allowClear' => true], 
])->label(''); ?> 

控制器:

$associationArray = Association::find()            
    ->select('association, id') 
    ->indexBy('id') 
    ->orderBy('association') 
    ->all(); 
$associationList = ArrayHelper::map($associationArray, 'id', 'association'); 

$ associationList是例如{[1] => “association1” 的阵列,[2] =>“association2,[3]。 ..“}。
$profile->associationSelect由控制器用密钥预先填充。我的问题是,小部件总是显示'Select Association ...',无论$profile->associationSelect是否被填充。我只希望占位符显示$associationSelect是否为空,因为占位符应该如何工作。如果我留下占位符为空(NULL),则清除选项(“x”)显示在窗口小部件中,但不会清除文本(即单击时不会执行任何操作)。

+0

作为一条评论。我不使用那个小部件,我更喜欢使用常规下拉列表提示第一个值,添加类“select2”并使用这个库:https://github.com/select2/select2/blob/master/LICENSE.md。任何使用kartik-v的优势? – Eduardo

+0

@Eduardo看起来像是一样的。 Kartik小部件为select2提供Yii2包装器。请参阅https://github.com/select2/select2。 – SM0827

回答

1

问题是'associationSelect'是一个内部属性而不是db属性。我切换到一个数据库属性,它工作得很好。

<?= $form->field($profile, 'association')->widget(Select2::classname(), [       
    'data' => ArrayHelper::map(Association::find()->orderBy('id')->all(), 'id', 'association'), 
    'language' => 'en', 
    'theme' => 'krajee', 
    'options' => ['placeholder' => 'Select ...',], 
    'pluginOptions' => ['allowClear' => true], 
])->label(''); ?> 
3

我或者没有完全理解你的问题,或者我认为我只通过一些改变就解决了你的问题。我在这里放了几个不同的东西,所以你可能不需要其中的一些。

/* 
* $profile->associationSelect: data list and assigned default value by key: 2 (third element). 
* With this line, your select2 will have a default chosen value from data list. 
* Remove this (1) line to show placeholder instead. 
*/ 
if (!empty($associationList)) { 
    $form->associationSelect = 2; 
    echo $form->field($profile, 'associationSelect')->widget(Select2::classname(), [ 
     'data' => $associationList, 
     'language' => 'en', 
     'theme' => 'krajee', 
     'options' => [ 
      'placeholder' => $associationList[3] // Placeholder will show 4th element from data list (we do have a list) 
     ], 
     'pluginOptions' => [ 
      'allowClear' => true 
     ], 
    ]); 
} else { 
    echo $form->field($profile, 'associationSelect')->widget(Select2::classname(), [ 
     'data' => $associationList, 
     'language' => 'en', 
     'theme' => 'krajee', 
     'options' => [ 
      'placeholder' => 'Please select a value' // Placeholder will be default text since we don't have a list. 
     ], 
     'pluginOptions' => [ 
      'allowClear' => true 
     ], 
    ]); 
} 

您可以选择所需的选项(无论是使用默认选定值还是仅使用占位符)。在这两种情况下,你都可以使用allowClear,你不会得到任何错误(当然,如果正确的话)。

+0

这不是我理解占位符的工作方式。当然,我可能是错的:-)。我希望占位符显示“选择关联...”,除非$ profile-> associationSelect预填充了来自数据库的值,在这种情况下,它应显示该值并给我选项以清除它。如果我如上所示实现占位符,它将显示正确的值,但文本将显示为浅灰色,并且我没有明确的选项,因为它毕竟只是一个占位符。看到我上面更新的代码。我希望这是有道理的。 – SM0827

+0

@ SM0827如果我理解正确,您的数据只包含2个选项(带有键1或2),并且您想要显示其中一个选项,如果该列表不是空的?你喜欢哪一个? –

+0

@ SM0827我编辑了我的答案。这将检查我们是否有数据列表,如果有,然后设置默认值(选中),否则,它将显示占位符。 –