2016-08-02 108 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我編輯了我的答案。這將檢查我們是否有數據列表,如果有,然後設置默認值(選中),否則,它將顯示佔位符。 –