Konfliktní ID položek formuláře
- mkrause
- Člen | 20
V praxi jsme narazili na problém s tím, že pokud se formuláře generují odděleně (konkrétně v našem případě opět na AJAXový požadavek ze stránky), mají konfliktní ID a tudíž nefunguje javascriptová validace. Prozatím jsme to vyřešili drobnou úpravou konstruktoru třídy FormControl, kde namísto stávajícího
$this->htmlId = str_replace('%', self::$idCounter++, self::$idMask);
používáme
$form = $this->getForm();
if ($form && $form->getName()) {
$prefix = preg_replace('/[^\\w]/', '_', $form->getName()) . '-';
} else {
$prefix = '';
}
$this->htmlId = $prefix . str_replace('%', self::$idCounter++, self::$idMask);
Nevíme, jestli je to systémové řešení (především proto, že nám není úplně jasný význam a tedy i potenciální obsah atributu $name třídy Component – v některých jejích potomcích se předává parametrem nazvaným $id, v jiných je to $name, a nakonec se asi při generování formuláře asi vůbec nepoužije).
Editoval mkrause (27. 5. 2008 14:02)
- David Grudl
- Nette Core | 8228
mkrause napsal(a):
V praxi jsme narazili na problém s tím, že pokud se formuláře generují odděleně (konkrétně v našem případě opět na AJAXový požadavek ze stránky), mají konfliktní ID a tudíž nefunguje javascriptová validace.
V „nových“ formulářích se ID generuje jiným způsobem, právě aby
se zabránilo těmto kolizím. Čítač FormControl::$idCounter
jsem úplně zrušil a místo něj se do masky FormControl::$idMask
vkládá identifikátor jména. Je to vlastně podobné řešení tvá
úprava.
Nevíme, jestli je to systémové řešení (především proto, že nám není úplně jasný význam a tedy i potenciální obsah atributu $name třídy Component – v některých jejích potomcích se předává parametrem nazvaným $id, v jiných je to $name, a nakonec se asi při generování formuláře asi vůbec nepoužije).
Parametr $id byl asi nějaký historický relikt…
- David Grudl
- Nette Core | 8228
Ještě jsem zapomněl zmínit, že nyní lze ID také manuálně nastavit:
$form->addText('name', 'Name:')->setHtmlId('moje-hezke-id');