metoda BaseControl::getHtmlId() změní hodnotu id – chyba ve frameworku?

m.brecher
Generous Backer | 717
+
0
-

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 | 717
+
+1
-

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.