Životní cyklus komponenty po redrawControl
- sucho
- Člen | 57
Zdravím
Vytvoril som si vlastné ControlMacro
kde som vytvoril funkciu preRender()
aby som v render()
metódach komponent nemusel písať stále tie
isté veci
hlavne $this->template->setFile(...);
a
$this->template->render();
a pridáva mi to beforeRender()
a afterRender()
pre
komponenty
funguje to super
ale keď v komponente použijem handle
a zavolám
$this->redrawControl()
tak sa zavolá iba render()
metóda no moja
preRender()
funkcia sa nevyvolá
a ani v payload mi nevráti snippets
keď setnem v render()
metóde komponenty
$this->template->setFile(...);
a
$this->template->render();
tak sa komponenta prekreslí ako má
hľadal som rôzne po fóre ale nikdy nikto nezodpovedal na otázku
životného cyklu komponenty
ako funguje presenter viem a poznám tu schému
videl som aj video od @DavidMatějka https://www.youtube.com/watch?…
Potreboval by som však zistiť čo sa deje po zavolaní
redrawControl()
respektíve odkiaľ sa volá render()
komponenty
Podľa mojích zistení sa volajú funkcie v takomto poradí
handle()
v komponenteredrawControl()
https://github.com/…/Control.php#L92afterRender()
v presentrirender()
v komponenteshutdown()
v presentri
Editoval sucho (31. 3. 2019 13:43)
- F.Vesely
- Člen | 369
Ten render se bude volat zde https://api.nette.org/…dge.php.html#…
Nicmene, nez delat takhle makro, tak bych si radsi udelal vlastni Traitu/BaseControl a tam mel neco jako
<?php
public function render()
{
$this->template->setFile(...);
$this->template->setParameters($this->getTemplateParameters());
$this->template->render();
}
protected function getTemplateParameters()
{
return [];
}
?>
Pak bych jen prepisoval tu metodu getTemplateParameters v jednotlivych komponentach.
- sucho
- Člen | 57
Až teraz som sa k tomu znova dostal
Vyzerá to byť fajn ale ako riešiť parametre predané do rendru a hlavne ich
default hodnoty
{control xyz, 10}
public function render($limit = 5) { ... }
Asi potom jedine takto
<?php
public function render(...$options)
{
$this->template->setFile(...);
$this->template->setParameters($this->getTemplateParameters($options));
$this->template->render();
}
protected function getTemplateParameters($options)
{
return [
'limit' => isset($options['limit']) ? $options['limit'] : 5
];
}
Editoval sucho (5. 4. 2019 20:37)
- CZechBoY
- Člen | 3608
Klasicky tohle řeším pomocí továrničky/konstruktoru/metody
komponenty.
Psáno kodem:
přes továrnu
$factory->create(/*$limit = */ 5);
nebo metodou
$factory->create()->setLimit(5);
A render metoda je bez parametrů, protože ty se nepředávají pokud se redrawuje přes ajax, což je asi tvůj případ.
Editoval CZechBoY (5. 4. 2019 22:32)