Parametry render metody v komponentě po AJAXu
- jEhLa
- Člen | 70
Dobrý den,
našel jsem zde pár diskuzí kde se to již řešilo, ale použití Multiplieru
mi v tomto případě nepříjde vhodné. Tak to zkusím znova, jestli by se to
v tomto případě nedalo řešit jinak.
Mám komponentu:
class MyFormControl extends \Nette\Application\UI\Control
{
/*...*/
protected function createComponentForm()
{
$form = new \Nette\Application\UI\Form();
$form->setRenderer(new MyFormRenderer());
$form['select'] = new DependantSelect();
$form['select']->onChange[] = function($control){
/*...*/
$this->redrawControl('formWrapper');
}
/*...*/
return $form;
}
public function render( $params = [] )
{
/*...*/
$this['form']->render($params);
}
}
Která mi vesměs jen obaluje formulář (\Nette\Application\UI\Form), získává/ukládá data a invaliduje snippet formuláře. Formulář používá můj vlastní docela komplexní FormRenderer, kterému můžu předávat spousty parametrů pro úpravu samotného formuláře. Renderer si vytváří vlastní šablonu přes TemplateFactory a taky obsahuje vlastní snippet „formWrapper“ který obaluje celý formulář.
Problém je v tom, že komponentu vytvářím v šabloně, a předávám jí info o CSS třídách pro konkrétní prvky, které komponenta rovnou předá tomu rendereru.
edit.latte
{define title}Edit xyz{/define}
{block content}
{include form.latte}
form.latte
{control myFormControl,
tabs=>true,
container-class=>'bg-dark',
options=>[
submit=>[icon-class=>'fa fa-save'],
submit_remove=>[icon-class=>'fa fa-trash']
]}
Vše funguje, až právě do změny toho „select“ controlu, který
invaliduje snippet formWrapper. Formulář se překreslí, ale na základě
toho, že mu nebyly předány žádné ty dodatčné informace
(tabs=>true,containerClass=>… apod.).
To chápu, ten kod není vůbec vykonán. Ale jediné řešení, co jsem našel
bylo přes Multiplieru. A to mi přijde docela nevhodné, abych mu předával
CSS třídy. Těch „options“ může být třeba 30. A navíc to nejsou
povinné parametry, formulář může fungovat klidně i bez nich. Jen vypadá
prostě jinak, protože používá výchozí třídy a nastavení.
Chci jen umožnit na venek pozměnit CSS třídy určitých prvků.
Jediné co mě napadá, je ten snippet přesunout přímo do šablony presenteru/rodiče: (nemůžu ani v tom form.latte, protože pak bych musel používat ještě snippetArea)
edit.latte
{define title}Edit xyz{/define}
{block content}
{snippet outerFormWrapper}{include form.latte}{/snippet}
A následně jej invalidovat z komponenty přes:
$this->getParent()->redrawControl('outerFormWrapper'); //getPresenter()
Nebo přes událost/callback:
$this->onRedraw();
Toto řešení se mi ale taky moc nezamlouvá, protože pak bych ten snippet musel dělat kolem té komponenty pokaždé, kde je použita.
Je nějaké jiné řešení? Přehlížím něco?
Děkuji za každou radu
- David Matějka
- Moderator | 6445
viz treba https://forum.nette.org/…v-renderneco#…
nebo podrobneji v https://www.youtube.com/watch?…