Matoucí atribut id u formulářů

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

Není to tak dávno, co Nette začalo nastavovat ID formulářů i jednotlivých formulářových elementů pro vlastní potřebu. Zřejmě se to využívá pro validaci na straně klienta.

Bohužel toto se ukazuje jako dvojsečná zbraň, protože např. nelze udělat tohle:

<?php
$form->getElementPrototype()->id = 'formular';
?>

Jak je vidět, tato vlastnost Nette spoustu lidí mate, jen za poslední dny se tohle téma řešilo tady a tady.

Proto navrhuji, aby Nette pro svou potřebu nepoužívalo atribut ID, ale třeba data-nette-id je-li to možné.

Sám jsem si téhle vlastnosti Nette dobře vědom a ID pro formuláře tak jako tak nepoužívám, jen se mi zdá, že se to řeší na fóru až moc často.

David Grudl
Nette Core | 8218
+
0
-

$form->getElementPrototype()->id = 'formular' mi funguje jak v poslední revizi 0.9, tak 1.0.

jtousek
Člen | 951
+
0
-

Pardon moje chyba.

<?php
$this->addTextArea('address', 'Adresa')
	->getControlPrototype()->id = 'test'; //nefunguje

$this->addTextArea('address', 'Adresa')
	->setHtmlId('test'); //tohle samozřejmě funguje, ale je to trochu nestandardní
?>
toka
Člen | 253
+
0
-

jtousek napsal(a):

Pardon moje chyba.

<?php
$this->addTextArea('address', 'Adresa')
	->getControlPrototype()->id = 'test'; //nefunguje

$this->addTextArea('address', 'Adresa')
	->setHtmlId('test'); //tohle samozřejmě funguje, ale je to trochu nestandardní
?>

Proč by mělo být setHtmlId('...') nestandardní? Konkrétně k formuláři je ke změně id třeba přistupovat pomocí getElementPrototype('...') např. jak uvedl David: $form->getElementPrototype()->id = 'formular'. U textarea je třeba nastavit id správně jak elementu, tak i labelu. Jenže label nemá vlastnost id ale for.

Musel bys udělat „něco“ podobného následujícímu:

// nasledujici kod samozrejme nefunguje :-)
$form['address']->getLabelPrototype()->for = 'test';   // potrebujeme prepsat for, aby fungoval element label korektne
$form['address']->getElementPrototype()->id = 'test';  // potrebujeme prepsat id, aby na nej odkazoval label

Pokud by byl použit $form['address']->getControlPrototype()->id = 'test', tak by měl ze své funkce upravit id, ale má upravit for a id – A k tomuto účelu slouží právě setHtmlId('...').

Toť můj pohled na věc.

jtousek
Člen | 951
+
0
-

@toka: Aha, díky moc za vysvětlení. :) V tom případě je tohle téma zbytečné, můžete ho zamknout nebo smazat.

westrem
Člen | 398
+
0
-

toka napsal

Super! Dufam, ze ludkovia co zacinaju s Nette uz konecne pochopia, ze to nie je bug ale feature, mozno by bolo dobre zmienit sa o tom vo FAQ/Dokumentacii formularov?

redhead
Člen | 1313
+
0
-

Určitě to napsat do dokumentace a navíc mě napadlo u tohodle atributu vyhazovat výjimku, ať použije setHtmlId(), protože takhle to nic neudělá (projde to) a pak se diví, že to tam není.

toka
Člen | 253
+
0
-

westrem napsal(a):

toka napsal

Super! Dufam, ze ludkovia co zacinaju s Nette uz konecne pochopia, ze to nie je bug ale feature, mozno by bolo dobre zmienit sa o tom vo FAQ/Dokumentacii formularov?

O tom ať rozhodnou jiní, třeba vrtak :-D

Patrik Votoček
Člen | 2221
+
0
-

doplněno do skeletonu k dokumentaci…