Formulářový prvek optgroup
- pavob
- Člen | 2
Dobrý den,
jde ve frameworku nějak vytvořit u formulářů prvek optgroup?
Potřebuji například vytvořit seznam s výběrem okresů roztříděných podle krajů, které nemají jít vybrat:
<select name="okres" id="okres">
<optgroup label="Hlavní město Praha">
<option value="1">Praha 1</option>
<option value="2">Praha 2</option>
<option value="3">Praha 3</option>
.
.
.
</optgroup>
<optgroup label="Středočeský kraj">
<option value="11">Benešov</option>
<option value="12">Beroun</option>
.
.
.
</optgroup>
atd.
Děkuji.
Editoval pavob (28. 10. 2010 16:14)
- MilanLempera
- Člen | 11
Třeba takhle
$countries = array(
'eu' => array(
'cs' => 'česko',
'sk' => 'slovensko',
),
'en' => 'USA'
);
$form->addSelect('country', 'Zeme:', $countries);
Editoval MilanLempera (28. 10. 2010 17:25)
- joe
- Člen | 313
Už jsem to kdysi dělal, vytvoř si novou třídu, co bude dědit Nette\Forms\Controls\SelectBox a bude mít atribut
/** @var array */
private $classes = array();
pak metodu
/**
* Set html classes for items
* @param array $arr (key => class)
*/
public function setClassesForItems(array $arr) {
if(!is_array($arr)) {
throw new InvalidArgumentException("Classes have to be in a (associative) array.");
}
$this->classes = $arr;
return $this;
}
a pak přepiš metodu getControl()
/**
* Generates control's HTML element.
* @return Html
*/
public function getControl()
{
$control = parent::getControl();
if ($this->skipFirst) {
reset($this->items);
$control->data('nette-empty-value', $this->useKeys ? key($this->items) : current($this->items));
}
$selected = $this->getValue();
$selected = is_array($selected) ? array_flip($selected) : array($selected => TRUE);
$option = Html::el('option');
foreach ($this->items as $key => $value) {
if (!is_array($value)) {
$value = array($key => $value);
$dest = $control;
} else {
$dest = $control->create('optgroup')->label($key);
}
foreach ($value as $key2 => $value2) {
if ($value2 instanceof Html) {
if(isset($this->classes[$key2])) {
$option->class = $this->classes[$key2];
} else {
unset($option->class);
}
$dest->add((string) $value2->selected(isset($selected[$key2])));
} else {
$key2 = $this->useKeys ? $key2 : $value2;
$value2 = $this->translate($value2);
if(isset($this->classes[$key2])) {
$option->class = $this->classes[$key2];
} else {
unset($option->class);
}
$dest->add((string) $option->value($key2 === $value2 ? NULL : $key2)->selected(isset($selected[$key2]))->setText($value2));
}
}
}
return $control;
}
Pak zavoláš tu metodu setClassesForItems
a ten parametr bude
pole (klic v option ⇒ nazev tridy)
Editoval joe (17. 7. 2011 0:27)
- joe
- Člen | 313
Máš vytvořenou tu třídu, například ClassesSelectBox
,
s těma změnama jak jsem psal (dědí od SelectBox
)
Pomocí „extension methody“ přídáš k formuláři možnost použití tohoto nového prvku, tak jako to je například tady.
Tzn. nějak takhle
// budoucí metoda Form::addClassesSelectBox()
function Form_addClassesSelectBox(Form $_this, $name, ... )
{
return $_this[$name] = new ClassesSelectBox( ... );
}
Form::extensionMethod('Form::addClassesSelectBox', 'Form_addClassesSelectBox'); // v PHP 5.2
//Form::extensionMethod('addClassesSelectBox', 'Form_addClassesSelectBox'); // v PHP 5.3
pak budeš moci ve svém formuláři psát
$form->addClassesSelectBox('mujSelectBoxSeTridama' ... );
$form['mujSelectBoxSeTridama']->setClassesForItems( ... ); // sem přiřadíš to pole s těma třídama