Matoucí atribut id u formulářů
- jtousek
- Člen | 951
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
$form->getElementPrototype()->id = 'formular'
mi funguje
jak v poslední revizi 0.9, tak 1.0.
- toka
- Člen | 253
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.