Jak zjistit html id prvku v komponentě?
- BigCharlie
- Člen | 283
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!
- BigCharlie
- Člen | 283
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
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
@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
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 vaction*
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
@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.