Životní cyklus komponenty po redrawControl

sucho
Člen | 57
+
0
-

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í

Editoval sucho (31. 3. 2019 13:43)

F.Vesely
Člen | 362
+
+5
-

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
+
0
-

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 | 3599
+
+3
-

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)