1
|
|
|
<?php |
2
|
|
|
/** |
3
|
|
|
*## TbChosen class file. |
4
|
|
|
* |
5
|
|
|
* @author Yaroslav Molchan <[email protected]> |
6
|
|
|
*/ |
7
|
|
|
|
8
|
|
|
/** |
9
|
|
|
*## Chosen wrapper widget |
10
|
|
|
* |
11
|
|
|
* @see http://harvesthq.github.com/chosen |
12
|
|
|
* |
13
|
|
|
* @package booster.widgets.forms.inputs |
14
|
|
|
*/ |
15
|
|
|
class TbChosen extends CInputWidget { |
16
|
|
|
|
17
|
|
|
/** |
18
|
|
|
* @var TbActiveForm when created via TbActiveForm. |
19
|
|
|
* This attribute is set to the form that renders the widget |
20
|
|
|
* @see TbActionForm->inputRow |
21
|
|
|
*/ |
22
|
|
|
public $form; |
23
|
|
|
/** |
24
|
|
|
* @var array @param data for generating the list options (value=>display) |
25
|
|
|
*/ |
26
|
|
|
public $data = array(); |
27
|
|
|
|
28
|
|
|
/** |
29
|
|
|
* @var |
30
|
|
|
*/ |
31
|
|
|
public $options; |
32
|
|
|
|
33
|
|
|
/** |
34
|
|
|
*### .init() |
35
|
|
|
* |
36
|
|
|
* Initializes the widget. |
37
|
|
|
*/ |
38
|
|
|
public function init() |
39
|
|
|
{ |
40
|
|
|
$this->normalizeData(); |
41
|
|
|
|
42
|
|
|
$this->normalizeOptions(); |
43
|
|
|
|
44
|
|
|
$this->addEmptyItemIfPlaceholderDefined(); |
45
|
|
|
|
46
|
|
|
$this->setDefaultWidthIfEmpty(); |
47
|
|
|
} |
48
|
|
|
|
49
|
|
|
/** |
50
|
|
|
*### .run() |
51
|
|
|
* |
52
|
|
|
* Runs the widget. |
53
|
|
|
*/ |
54
|
|
|
public function run() |
55
|
|
|
{ |
56
|
|
|
list($name, $id) = $this->resolveNameID(); |
57
|
|
|
|
58
|
|
|
if ($this->hasModel()) { |
59
|
|
|
if ($this->form) { |
60
|
|
|
echo $this->form->dropDownList($this->model, $this->attribute, $this->data, $this->htmlOptions); |
61
|
|
|
} else { |
62
|
|
|
echo CHtml::activeDropDownList($this->model, $this->attribute, $this->data, $this->htmlOptions); |
63
|
|
|
} |
64
|
|
|
} else { |
65
|
|
|
echo CHtml::dropDownList($name, $this->value, $this->data, $this->htmlOptions); |
66
|
|
|
} |
67
|
|
|
|
68
|
|
|
$this->registerClientScript($id); |
69
|
|
|
} |
70
|
|
|
|
71
|
|
|
/** |
72
|
|
|
*### .registerClientScript() |
73
|
|
|
* |
74
|
|
|
* Registers required client script for chosen. It is not used through bootstrap->registerPlugin |
75
|
|
|
* in order to attach events if any |
76
|
|
|
* |
77
|
|
|
* @param $id |
78
|
|
|
* |
79
|
|
|
* @throws CException |
80
|
|
|
*/ |
81
|
|
|
public function registerClientScript($id) { |
82
|
|
|
|
83
|
|
|
Booster::getBooster()->registerPackage('chosen'); |
84
|
|
|
|
85
|
|
|
$options = !empty($this->options) ? CJavaScript::encode($this->options) : ''; |
86
|
|
|
|
87
|
|
|
ob_start(); |
88
|
|
|
echo "$('#{$id}').chosen({$options})"; |
89
|
|
|
|
90
|
|
|
Yii::app()->getClientScript()->registerScript(__CLASS__ . '#' . $this->getId(), ob_get_clean() . ';'); |
91
|
|
|
} |
92
|
|
|
|
93
|
|
|
private function setDefaultWidthIfEmpty() |
94
|
|
|
{ |
95
|
|
|
if (empty($this->options['width'])) { |
96
|
|
|
$this->options['width'] = '100%'; |
97
|
|
|
} |
98
|
|
|
} |
99
|
|
|
|
100
|
|
|
private function normalizeData() |
101
|
|
|
{ |
102
|
|
|
if (!$this->data) |
|
|
|
|
103
|
|
|
$this->data = array(); |
104
|
|
|
} |
105
|
|
|
|
106
|
|
|
private function addEmptyItemIfPlaceholderDefined() |
107
|
|
|
{ |
108
|
|
|
if (!empty($this->htmlOptions['placeholder'])) |
109
|
|
|
$this->options['placeholder'] = $this->htmlOptions['placeholder']; |
110
|
|
|
|
111
|
|
|
if (!empty($this->options['placeholder']) && empty($this->htmlOptions['multiple'])) |
112
|
|
|
$this->prependDataWithEmptyItem(); |
113
|
|
|
} |
114
|
|
|
|
115
|
|
|
private function normalizeOptions() |
116
|
|
|
{ |
117
|
|
|
if (empty($this->options)) { |
118
|
|
|
$this->options = array(); |
119
|
|
|
} |
120
|
|
|
} |
121
|
|
|
|
122
|
|
|
private function prependDataWithEmptyItem() |
123
|
|
|
{ |
124
|
|
|
$this->data = array('' => '') + $this->data; |
125
|
|
|
} |
126
|
|
|
} |
127
|
|
|
|
This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.
Consider making the comparison explicit by using
empty(..)
or! empty(...)
instead.