metoda BaseControl::getHtmlId() změní hodnotu id – chyba ve frameworku?
- m.brecher
- Generous Backer | 871
Ahoj,
Potřebuji si předat htmlId prvku formuláře pro použití ve vlastním Javascriptu do šablony. Nette formuláře přidělují prvkům formuláře htmlId automaticky podle schématu frm-formName-controlName.
Podle dokumentace se htmlId prvku získá metodou getHtmlId():
https://api.nette.org/…Control.html#…
Presenter:
public function createComponentNodeForm(): Form
{
$form = new Form;
$controlArticle = $form->addSelect('article_id', 'Článek', $items); // automaticky vygenerované htmlId = frm-nodeForm-article_id
$articleHtmlId = $controlArticle->getHtmlId(); // volání této metody změní htmlId = frm-article_id
.....
}
Získání htmlId sice funguje, získám hodnotu frm-article_id, která je i ve vykresleném html kódu formuláře, ale došlo ke změně této hodnoty, kterou Nette formulář automaticky generoval před použitím metody getHtmlId() frm-nodeForm-article_id.
Sice to funguje, ale může dojít při použití více formulářů na stránce k duplicitě html atributů id.
Usuzuji, že je to chyba v Nette formulářích.
- m.brecher
- Generous Backer | 871
Ahoj,
tak jsem trochu experimentoval a přišel jsem na to, proč asi metoda getHtmlId() vynechá v id elementu jméno formuláře:
public function createComponentMyForm(): Form
{
$form = new Form;
$form->addSelect('article', 'Článek', $items); // automaticky vygenerované htmlId = frm-nodeForm-article_id
$htmlId = $form['article']->getHtmlId(); // frm-article_id, formulář ještě nemá přiděleno jméno
.....
$form->onAnchor[] = function($form){
$htmlId = $form['article']->getHtmlId(); // frm-myForm-article_id, formulář už má přiděleno jméno
};
}
Html id prvku formuláře vytváří Nette automaticky s použitím jména formuláře. Jméno formuláře je k dispozici až po připojení formuláře jako komponenty do formuláře. Proto metoda $control->getHtmlId() v továrně formuláře vrací id bez jména formuláře. Nette potom toto zkrácené htmlId použije při vykreslování, aby nedošlo k chybě.
Pokud by vadilo, že htmlId je zkrácené – což obvykle nijak nevadí, můžeme jej získat až v události anchor formuláře.