DependentSelectBox
| Datum verze | 17.11.2010 |
|---|---|
| GitHub | https://github.com/Foowie/DependentSelectBox |
| Download | používejte raději GitHub ! |
| Demo | demo |
| Forum thread | http://forum.nette.org/…e-selectboxy |
| Autor | Daniel Robenek |
| Licence | MIT |
Jedná se o komponentu SelectBox, jejíž stav závisí na
jiné. Hodnoty se aktualizjí buď ajaxově, nebo při vypnutém JS pomocí
SubmitButton.
Pro PHP 5.2 stačí odstranit z hlaviček
namespace a use
Použití komponenty
Registrace:
\Nette\Forms\FormContainer::extensionMethod("addDependentSelectBox", "DependentSelectBox\DependentSelectBox::formAddDependentSelectBox");
Přidání do formuláře:
$form->addDependentSelectBox("NAZEV_KOMPONENTY", "LABEL_KOMPONENTY", RODICOVSKA_KOMPONENTA, CALLBACK_PRO_DATA);
neboli
$form->addDependentSelectBox("select2", "Výběr 2", $form["select1"], array($this, "getValuesSelect2"));
... a přidání invalidace snippetu pro ajax
if($this->isAjax())
$form["select2"]->addOnSubmitCallback(array($this, "invalidateControl"), "NAZEV_SNIPPETU");
A metoda vracející data může vypadat nějak takto:
public function getValuesSelect2($form, $dependentSelectBoxName) {
$select1 = $form["select1"]->getValue();
return dibi::query("SELECT id, nazev FROM table WHERE zavislost=%i", $select1)->fetchPairs("id", "nazev");
}
Takto napojené komponenty mohou být i ve stromové struktuře.
Nezapomeňte připojit formulář již v konstruktoru
pomocí $form = new AppForm($this, $name);. Pokud toto neuděláte,
mohou se vyskytnout problémy při využití metody skipFirst
u rodičovského SelectBoxu !
Popis vlastností
Vlastnosti a metody třídy DependentSelectBox:
$disableChilds= zneaktivnit komponenty bez hodnoty nebo automaticky vybrat první hodnotu? (viz demo)$disabledHtmlClass= Html class pro neaktivní komponentu$emptyValueTitle= Title pro zatím nevybranou hodnotu v select boxu$disabledItemTitle= Title pro neaktivní komponentu$autoSelectRootFirstItem= Má se vybrat automaticky první hodnota (pokud není) v rodičovském select boxu? (Doporučuju ano)refresh()= Rekonstrukce komponentsetDisabledValue(array($key => $value))= Nastaví hodnotu při neaktivním select boxusetLeaveFirstEmpty(true)= Při$disableChilds== true zůstává vždy možnost vybrat i prázdný prvek
Vlastnosti a metody pomocné třídy
FormControlDependencyHelper, která vytváří tlačítko ke
komponentě (tlačítko se vytváří k rodičovské komponentě):
$buttonSuffix= Suffix názvu tlačítka vzhledem k názvu komponenty$controlClass= HTML class komponenty. Tlačítku se přiřadí $controlClass.$buttonSuffix$buttonText= …$buttonPosition= Pozice tlačítka. Viz konstanty ve třídě
Místo závislé komponenty se v konstruktoru může předat instance
třídy FormControlDependencyHelper.
Závislosti mohou být i na více prvcích. Místo jednoho prvku se tak při registraci předá pole prvků.
$form->addDependentSelectBox("select3", "Výběr 3", array($form["select1"], $form["select2"]), array($this, "getValuesSelect3"));
JavaScript – závislosti
Ještě něco málo k JS. v souboru
jquery.nette.dependencyselectbox.js jsou k nastavení hodnoty
controlClass a buttonSuffix které by měly být
stejné jako ve třídě FormControlDependencyHelper. Funkce
hideSubmits by měla zařizovat skrývání tlačítka. V základu
je nastaveno skrývání celého řádku tabulky. V případě vlastního
renderování formuláře je nutno tuto část změnit. Pro skrývání
tlačítek i po ajaxovém požadavku je nutno v doplňku Ajax s jQuery
přidat jako poslední řádek funkce success
$.dependentselectbox.hideSubmits(); Tento doplněk dále závisí
na js doplňku – Ajaxové
formuláře .
JsonDependentSelectBox
Přidán JsonDependentSelectBox, který posílá v odpovědi
jen potřebná data. Místo $form->addDependentSelectBox
použijte $form->addJsonDependentSelectBox a ideálně
v metodě beforeRender přidejte volání
JsonDependentSelectBox::tryJsonResponse($presenter);. O zbytek je
postaráno ;)
Enjoy
Připojené soubory
- dependent-select-box.zip 328 kB
Komentáře 
Endrju | 16. 11. 2010, 14:51 | comment
Ještě druhá možnost:
FormContainer::extensionMethod("FormContainer::addDependentSelectBox", 'DependentSelectBox_formAddDependentSelectBox');
PS: nešlo editovat, ani smazat komentář…
uestla | 15. 6. 2011, 23:31 | comment
Endrju se zjevně překlepl v druhém argumentu metody, kde má být čtyřtečka místo podtržítka – správně tedy:
FormContainer::extensionMethod('FormContainer::addDependentSelectBox',
'DependentSelectBox::formAddDependentSelectBox');
Jack06 | 26. 9. 2011, 14:12 | question
Zajímalo by mě, když mám tento addon a mám 2 závislé selectboxy a chci aby se objevili postupně, jak to udělat. Nyní to je tak, potom co vyberu z prvního selectu data, tak se mi objeví oba dva závislé selectboxy, já bych chtěl aby se mi zobrazil jen daný závislý selectbox
Příklad: REGIONY – OKRESY – MESTA (vyberu region, zobrazí se okres, vyberu okres, zobrazí se město. Díky
Morlok | 16. 1. 2012, 23:41 | comment
Ja mam spraveny DependentForm, kde do formulara pridavam klasicke elementy (select, checkboxlist, radiolist, text…), zavyslost nastavujem nejak takto:
$depForm->addDependent(‚inter‘, ‚id_service‘, callback);
pricom v callbacku kludne mozem pridavat nove prvky formularu (mozno by to zvladlo o i dalsi dependency v callbacku pridat). Zatial to funguje cez snippety.
Schmutzka | 9. 2. 2012, 2:18 | comment
V případě nějakých úspěchů můžete zkusit návod v Kuchařce – http://wiki.nette.org/…visly-select

Endrju | 16. 11. 2010, 14:46 | comment
Připomínka: Pokud používáte PHP 5.2, musíte registrovat takto:
Object::extensionMethod() by pak totiž volala nativní PHP funkci get_called_class(), která je ale dostupná až ve verzi PHP 5.3