Formulářový prvek optgroup

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
pavob
Člen | 2
+
0
-

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
+
0
-

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)

pavob
Člen | 2
+
0
-

Mockrát děkuji, funguje mi to!

wise
Člen | 161
+
0
-

Jak ho můžu odstranit? :-) potřebuju mít optgroup klikatelné, tzn. brát to jako option a nastavit class. Snažil jsem se upravit SelectBox.php, ale beze změny. Díky moc.

joe
Člen | 313
+
0
-

optgroup nejde mít klikatelné, použij klasický option, který si nastyluješ a nebo nějakou JavaScriptovou náhradu select boxu

wise
Člen | 161
+
0
-

Ano, to já vím a proto jsem chtěl upravit soubor SelectBox.php na nastylovaný option, ale jak jsem psal, nešlo mi to nebo nevím jak :)

wise
Člen | 161
+
0
-

Nevíte jak upravit optgroup v SelectBox.php tak, aby to byl option s classou?

joe
Člen | 313
+
0
-

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)

wise
Člen | 161
+
0
-

Asi jsem do toho nepronikl tak, jak jsem očekával, jak a kde zavolám tu metodu? Díky moc.

joe
Člen | 313
+
0
-

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
wise
Člen | 161
+
0
-

paráda, díky moc :-) takhle jsem to měl, ale neměl sem tam extension. Díky.