Nastavení option jako disabled u SelectBox

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

Vyskytla se mi potreba nastavit nektere polozky select boxu jako disabled, tyto polozky znam az v dobe renderovani sablony. A neobjevil jsem pro toto zadnou podporu ve tride SelectBox. Proto jsem si tridu trosku rozsiril. Myslim, ze je to uzitecna ficurka, tak se to klidne muze zaradit nekam do hlavni vetve.

Co jsem teda udelal?

Pridal jsem do tridy SelectBox privatni promennou a metodu

<?php
private $disabledKeys = array();

public function setDisabledForItemWithKey($key) {
    $this->disabledKeys[] = $key;
}
?>

a v metode getControl nekde okolo radku 220 zamenil

<?php
} elseif ($this->useKeys) {
    $dest->add((string) $option->value($key2)->selected(isset($selected[$key2]))->setText($this->translate($value2)));

} else {
    $dest->add((string) $option->selected(isset($selected[$value2]))->setText($this->translate($value2)));
}
?>

za

<?php
} elseif ($this->useKeys) {
    if (in_array($key, $this->disabledKeys)) {
        $option = Html::el('option', array('disabled' => 'disabled'));
    } else {
        $option = Html::el('option');
    }
    $dest->add((string) $option->value($key2)->selected(isset($selected[$key2]))->setText($this->translate($value2)));

} else {
    $dest->add((string) $option->selected(isset($selected[$value2]))->setText($this->translate($value2)));
}
?>

Nyni muzu v presenteru pouzit

<?php
function renderWhatever($id) {

    $this['myForm']->values = $this->model->find($id)->fetch();
    $this['myForm']['select_name']->setDisabledForItemWithKey($id);
}
?>

Moc jsem nepochytil, k cemu je $this->useKeys, takze pro uplnou funkcnost by se asi muselo poresit pripad, kdy to bude mit hodnotu false.

Editoval ibru (31. 3. 2010 17:02)

22
Člen | 1478
+
+1
-

a nestačí?:

$form	->addCheckbox('box', 'box')
        ->setValue(true)->setDisabled(true);
ibru
Člen | 9
+
0
-

22 napsal(a):

a nestačí?:

$form	->addCheckbox('box', 'box')
        ->setValue(true)->setDisabled(true);

ne, v tomhle nevidim zadnou pouzitelnost.

Mam treba hierarchii kategorii a k nim clanky. A pri vytvareni clanku chci povolit zarazeni jen do nejspodnejsi kategorie (ktera uz nema podkategorie) Ale zobrazit v select boxu chci vsechny kategorie, kvuli prehledu o celkove strukture.

norbe
Backer | 405
+
0
-

Jestli se nepletu, tak existuje problém s diabled u selectu v IE-ckach (už jsem to dlouho nezkoušel, ale minimálně v IE6 to nešlo spolehlivě zajistit kvůli neexistující podpoře). Takže to bych viděl jako hlavní důvod, proč to nejde ani nastavit…

mbskot
Člen | 42
+
0
-

cafte,
chcem sa spytat ci sa da nastavit hodnota disabled u options v selectboxe. Velmi by som to potreboval.
Da sa nejako dostat k options a nastavovat im atributy?

skusil som dumpnut selectbox:

Nette\Forms\SelectBox(18) {
   "items" private => array(2) {
      33 => "Gula gulata" (11)
      16 => "Fotogaleria" (11)
   }
   "allowed" protected => array(2) {
      33 => "Gula gulata" (11)
      16 => "Fotogaleria" (11)
   }
   "skipFirst" private => FALSE
   "useKeys" private => TRUE

Ked su tam ‚allowed items‘ nedalo by sa nejako nastavit ‚deny items‘?

Inak ako to je so setItems? ked som to skusil, tak sice options mi to pridalo, ale formular ich akoby nemal zaregistrovane a teda ani jednu z pridanych option nechcel zobrat(pripadne ak som odobral pravidlo FILLED, tak vracal NULL)

Editoval mbskot (15. 7. 2011 8:46)

Aurielle
Člen | 1281
+
0
-

Používám úspěšně následující řešení:

$arr = array(
	'item' => Nette\Utils\Html::el('option')->value('item')->setHtml('popisek'),
	'item2' => Nette\Utils\Html::el('option')->value('item2')->setHtml('popisek')->disabled(TRUE),
);

$form->addSelect('select', 'select', $arr)
// případně
$form['select']->setItems($arr);

Jen pozor, i disabled položku bude Nette akceptovat jako validní, tohle je třeba si v submit metodě ohlídat. (Testováno včera na Nette 2.0 beta)

mbskot
Člen | 42
+
0
-

jj nasiel som to od Pandy na fore, presne tak som to spravil a funguje :). A pridal som vlastne pravidlo s validacnou funkciou, ktora overovala, ci je vybrana povolena moznost.
dakujem

Matúš Matula
Člen | 257
+
0
-

tak ako vravi @norbe, tak podpora pre IE do verzie 8beta1 neexistuje, http://www.gtalbot.org/…Support.html . Ale ak ta tieto prehliadace nepalia.. :)

mbskot
Člen | 42
+
0
-

ja tie ‚vypnute moznosti‘ vyfarbim na sivo, ak by nahodou disabled nefungovalo. Snad farba napovie cloveku, ze ‚tato moznost nie je dovolena‘. A ked nie, vrati ho spat validator.