Skip to content

Commit fbc0d4a

Browse files
authored
Merge pull request #24 from dasim/nested-option-items
Support for option groups loaded via ajax
2 parents edc9923 + cd0d3a4 commit fbc0d4a

2 files changed

Lines changed: 56 additions & 20 deletions

File tree

client-side/dependentSelectBox.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@
111111

112112
$.each(item.value, function (objI, objItem) {
113113
var option = $('<option>')
114-
.attr('value', objI).text(objItem);
114+
.attr('value', objI).text(objItem.value);
115115
if (data.value !== null && objI == data.value) {
116116
option.attr('selected', true);
117117
}

src/DependentData.php

Lines changed: 55 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -118,30 +118,66 @@ public function getPreparedItems($disabledItems = null)
118118
{
119119
$items = [];
120120
foreach ($this->items as $key => $item) {
121-
if (!($item instanceof Nette\Utils\Html)) {
122-
$el = Nette\Utils\Html::el('option')->value($key)->setText($item);
123-
124-
} else {
125-
$el = $item;
121+
$elements = [];
122+
if (is_array($item)) {
123+
$groupItems = [];
124+
foreach ($item as $innerKey => $innerItem) {
125+
$el = $this->getPreparedElement($innerKey, $innerItem, $disabledItems);
126+
$this->addElementToItemsList($groupItems, $el);
127+
128+
}
129+
$items[$key] = [
130+
'key' => $key,
131+
'value' => $groupItems,
132+
];
126133
}
127-
128-
// disable element
129-
if (is_array($disabledItems) && array_key_exists($key, $disabledItems) && $disabledItems[$key] === true) {
130-
$el->disabled(true);
134+
else {
135+
$el = $this->getPreparedElement($key, $item, $disabledItems);
136+
$this->addElementToItemsList($items, $el);
131137
}
138+
}
139+
return $items;
140+
}
132141

133-
$items[$key] = [
134-
'key' => $el->getValue(),
135-
'value' => $el->getText(),
136-
];
137142

138-
end($items);
139-
$lKey = key($items);
140-
foreach ($el->attrs as $attr => $val) {
141-
$items[$lKey]['attributes'][$attr] = $val;
142-
}
143+
/**
144+
* @param string $key
145+
* @param mixed $item
146+
* @param array|null $disabledItems
147+
* @return Nette\Utils\Html
148+
*/
149+
private function getPreparedElement($key, $item, $disabledItems = null)
150+
{
151+
if (!($item instanceof Nette\Utils\Html)) {
152+
$el = Nette\Utils\Html::el('option')->value($key)->setText($item);
153+
154+
} else {
155+
$el = $item;
143156
}
144157

145-
return $items;
158+
// disable element
159+
if (is_array($disabledItems) && array_key_exists($key, $disabledItems) && $disabledItems[$key] === true) {
160+
$el->disabled(true);
161+
}
162+
163+
return $el;
164+
}
165+
166+
167+
/**
168+
* @param array &$items
169+
* @param Nette\Utils\Html $el
170+
*/
171+
private function addElementToItemsList(&$items, $el)
172+
{
173+
$items[$el->getAttribute('value')] = [
174+
'key' => $el->getValue(),
175+
'value' => $el->getText(),
176+
];
177+
end($items);
178+
$lKey = key($items);
179+
foreach ($el->attrs as $attr => $val) {
180+
$items[$lKey]['attributes'][$attr] = $val;
181+
}
146182
}
147183
}

0 commit comments

Comments
 (0)