addSelectBox – obarvení pouze jedné položky (Nette 2)

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

Zdravim,

chci se zeptat, je možný nějak obarvit pouze jeden řádek v Selectu? Nějak nad tím dumám, ale nedaří se mi na to přijít.

Doplnim, že používám ruční vykreslování. Zajímalo by mě, jestli je možný vykreslit jednotlivý optiony ručně, to by potom nebyl problém. Jelikož tím, že tam mám pouze toto, tak to nejspíš nikdy neobarvim jednotlivě.

<td colspan="3">{input declaration}</td>

Děkuji za odpověď

Editoval Prochy (27. 10. 2012 9:16)

enumag
Člen | 2118
+
0
-

SelectBox má v sobě zabudovanou možnost že mu místo pole textových položek strčíš rovnou pole tagů <option>. Řešením tedy je, že si ty tagy připravíš při vytváření selectu sám, pomocí API třídy Html nastavíš atributy jaké potřebuješ a výsledek strčíš Selectu pomocí setItems.

Prochy
Člen | 91
+
0
-

Dobrá, tak už to mám obarvený, teď by mě ještě zajímalo, jak potom nastavit defaultní hodnotu.

Jinak přikládám způsob vyřešení prvnotního problému:

$listDeclarations = array(Html::el('option', array(
                'value' => 'Není',
                'style' => array('color:red !important;'),))
            ->add('Není'),
            Html::el('option', array('value' => 'Papírové'))
            ->add('Papírové'),
            Html::el('option', array('value' => 'Elektronické'))
            ->add('Elektronické'));

$this->addSelect('declaration', 'Prohlášení:', $listDeclarations)
        ->setDefaultValue('Papírové');

Děkuji za odpověď

EDIT Vyřešeno:
Moje chyba, nějak sem si usmyslel, že by mělo jít do setDefaultValue nastavit přímo text vybírané položky, stačilo tam dát setDefaultValue(1)

Editoval Prochy (27. 10. 2012 17:16)

Prochy
Člen | 91
+
0
-

Tak jsem se dostal až teď k testování, a objevil se někde problém, asi dělám něco špatně. Pokud odešlu formulář, tak se pokaždé vrátí hodnota jako NULL u selectu vytvořený pomocí html option.

Zde kód:

protected function createComponentTest($name){
    $list = array(Html::el('option', array(
                        'value' => 'Není',
                        'style' => array('color'=>'red'),))
                    ->add('Není'),
                    Html::el('option', array('value' => 'Papírové'))
                    ->add('Papírové'),
                    Html::el('option', array('value' => 'Elektronické'))
                    ->add('Elektronické'));

    //$listDeclarations=array('není','papírové');
    $form = new Form();
    $form->addSelect('select','select:')->setItems($list);
    $form->addSubmit('ok','ok');
    $form->onSuccess[]=callback($this,'pokus');
    return $form;
  }

  public function pokus(Form $form){
    dump($form->getValues());
  }

A hodnota select je vždy NULL ať vyberu, co vyberu. Tak by mě zajímalo, kde bych mohl mít chybu.

Děkuji za odpověď

enumag
Člen | 2118
+
0
-

Můžeš zkusit jako ‚value‘ ⇒ použít indexy 0, 1, 2?

Prochy
Člen | 91
+
0
-

Ano, to funguje, můžu se zeptat, proč ten string nefugnuje správně? Sice bych to mohl potom zpracovat podle těch indexů, ale zdá se mi to dost nešikovné.

enumag
Člen | 2118
+
0
-

Kdybys tam nedával ty options jako hotový HTML tak bys klasicky použil:

$select->setItems($pole, FALSE);

Kde důležité je to false na konci, protože řekne selectu, že nemá vracet klíče (0, 1, 2), ale hodnoty. Obávám se ale, že v případě toho předání HTML to nebude fungovat, můžeš vyzkoušet. ;-)

Prochy
Člen | 91
+
0
-

To sem už zkoušel nejde to, ale já tady nechápu, proč to nefunguje, když formulář se vykreslí takto:

<tr>
	<th><label for="frmtest-select">select:</label></th>

	<td>
<select name="select" id="frmtest-select">
<option value="Není">Není</option>
<option value="Papírové">Papírové</option>
<option value="Elektronické">Elektronické</option>
</select></td>
</tr>

Kdybych tam dal toto:

$listDeclarations=array('není'=>'není','papírové'=>'papírové');
$form = new Form();
$form->addSelect('select','select:',$listDeclarations);

Tak mi to správně vypíše Není nebo papírové a nemusí tam být ani false, proto mě zaráží, že mi skript s HTML optiony nefunguje. :-(

Editoval Prochy (30. 10. 2012 13:22)

enumag
Člen | 2118
+
0
-

V tom případě bys musel použít:

$list = array(
	'Není' => Html::el('option', array(
			'value' => 'Není',
			'style' => array('color'=>'red'),
		))->add('Není'),
	'Papírové' => Html::el('option', array('value' => 'Papírové'))->add('Papírové'),
	'Elektronické' => Html::el('option', array('value' => 'Elektronické'))->add('Elektronické'),
);

Dovolím si ale říct, že toto řešení nepodporuji. :-) Nemám rád používání polí tímto způsobem (s nečíselnými indexy).

Editoval enumag (30. 10. 2012 13:31)