Jak zjistit html id prvku v komponentě?

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

Mám v presenteru takovýto kód:

protected function createComponentExample() {
		$form = new Form();
		$form->addText('field');	// $form['field']->getHtmlId() => frm-field
		...
		return $form;
	}

Jak nejlépe zjistit finální HTML id? Protože ve skutečnosti je HTML id prvku v komponentě je frm-example-field.

Pokud vás zajímá použití: ve formuláři využívám JS modální okno, z něhož dostávám nějaký výsledek. Ten chci vložit do určeného pole ve formuláři. Modální okno dostane jako parametr id toho cílového pole (protože ho mohu otevřít k různým polím).

Pokud to řeším nesmyslně a máte lepší řešení, pište!

hranicka
Člen | 23
+
0
-
$control->getHtmlId();

// nebo ekvivalentní výsledek

$control->htmlId;

viz. https://api.nette.org/…Control.html

BigCharlie
Člen | 283
+
0
-

Ano, to jsem zkoušel jako první. Teď jsem to zkusil ještě jednou a trochu mě mate následující chování:

protected function createComponentExample() {
	$form = new Form();
        $form->addText('field');
        \Tracy\Debugger::dump($form['field']->getHtmlId());
        return $form;
}

Tenhle kód vypíše a zároveň v HTML vygeneruje id „frm-field“. Když ale vypustím dump a podívám se na jen na vygenerované HTML id, je tam „frm-example-field“.

Proto mě zmátlo, že když jsem si id vypsal, dostal jsem něco jiného, než jsem čekal.

David Kudera
Člen | 455
+
0
-

BigCharlie napsal(a):

Ano, to jsem zkoušel jako první. Teď jsem to zkusil ještě jednou a trochu mě mate následující chování:

protected function createComponentExample() {
	$form = new Form();
        $form->addText('field');
        \Tracy\Debugger::dump($form['field']->getHtmlId());
        return $form;
}

Tenhle kód vypíše a zároveň v HTML vygeneruje id „frm-field“. Když ale vypustím dump a podívám se na jen na vygenerované HTML id, je tam „frm-example-field“.

Proto mě zmátlo, že když jsem si id vypsal, dostal jsem něco jiného, než jsem čekal.

No v každým případě by se moc na automaticky generovaných id ve formuláři spoléhat nemělo. Na fóru je o tom už někde nějaká ta diskuze.

Takže možná jestli by nebylo i jistější použít navíc

$form->getElementPrototype()->id = 'myFormId';

Edit: napsal jsem to idiot pro form.. Pro control:

$form['field']->getControlPrototype()->id = 'myControlId';

Editoval David Kudera (3. 7. 2014 14:27)

jiri.pudil
Nette Blogger | 1032
+
0
-

@BigCharlie V továrničce formulář ještě není připojený k presenteru, tedy nezná ani svůj název a pozici v komponentovém stromu. Obecně komponenty poprvé vědí o svém rodiči v metodě attached() (to by sis ten Form ale musel podědit), dalším možným řešením je zjišťovat ID až po zavolání továrničky, třeba v action* metodě:

$id = $this['example']['field']->htmlId;

@DavidKudera Na generovaná ID by se nemělo spoléhat v tom smyslu, že bys je neměl psát někde v JS natvrdo. Pokud si ho předáš třeba přes data atribut, je to ok.

David Kudera
Člen | 455
+
0
-

jiri.pudil napsal(a):

@BigCharlie V továrničce formulář ještě není připojený k presenteru, tedy nezná ani svůj název a pozici v komponentovém stromu. Obecně komponenty poprvé vědí o svém rodiči v metodě attached() (to by sis ten Form ale musel podědit), dalším možným řešením je zjišťovat ID až po zavolání továrničky, třeba v action* metodě:

$id = $this['example']['field']->htmlId;

@DavidKudera Na generovaná ID by se nemělo spoléhat v tom smyslu, že bys je neměl psát někde v JS natvrdo. Pokud si ho předáš třeba přes data atribut, je to ok.

Jj to vím, spíš jsem to psal pro jistotu, kvůli tomu, že si to id dumpoval, aby ho zjistil (a třeba i někde natvrdo napsal). Takže opravdu jen jistota ;-)

BigCharlie
Člen | 283
+
0
-

@DavidKudera @jiri.pudil Díky oběma. Dumpoval jsem to, abych se ujistil, že jsem našel tu správnou metodu – hodlám si id předat právě přes data atributy.