Konfliktní ID položek formuláře

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

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

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

Ještě jsem zapomněl zmínit, že nyní lze ID také manuálně nastavit:

$form->addText('name', 'Name:')->setHtmlId('moje-hezke-id');