Proměnné ze šablony komponenty

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

Ahoj, potreboval bych v presenteru ziskat nejlepe vsechny promenne, ktere v komponente posilam do templaty. Tedy v komponente nastavim

$this->template->promenna = 1;

a pak se k ni chci dostat z presenteru, ve kterem je komponenta instanciovana.
Zkousel jsem

$this['nazev_komponenty']->template->getParams();

ale tam moje promenne nejsou.

Diky za pomoc.

Filip Procházka
Moderator | 4668
+
0
-

Jestli je plníš v render(), tak logicky musíš nejdříve zavolat ty metody :)

jerry90
Člen | 19
+
0
-

Ty metody by mely byt uz zavolane. Z presenteru se na ty promenne ptam az v afterRender

jerry90
Člen | 19
+
0
-

Jde mi o to, ze potrebuji na konci zivotniho cyklu poslat JSONResponse se vsemi promennymi sablony a sablon vsech jejich komponent. Jak bych toho docilil ? Potrebuju nejake misto v zivotnim cyklu za vykreslenim komponent, coz afterRender zjevne neni (paradoxne).
Diky moc

Editoval jerry90 (22. 12. 2011 15:56)

Filip Procházka
Moderator | 4668
+
0
-

Šablona se totiž „vykreslí“ lazy po „odeslání“ TextResponse.

Nejdříve se zavolají události presenteru startup, action, signal, beforeRender, render, afterRender a pak se celý object Template obalí do objektu TextResponse. Ten se vrací do Application a ta teprve odpověď odešle a response s šablonou se vykreslí.

jerry90
Člen | 19
+
0
-

Aha, a nenapada te nejake reseni, jak udelat to co potrebuju ?

Peter
Člen | 12
+
0
-

A nestačí tohle? (Jak HosipLan naznačoval posledním odkazem.)

<?php
$this['nazev_komponenty']->template->render();
$this['nazev_komponenty']->template->getParams();
?>
jerry90
Člen | 19
+
0
-

to funguje, ale to se bude volat render() dvakrat. A to muze zpusobovat problemy ne ?

Filip Procházka
Moderator | 4668
+
0
-

To rozhodně bude způsobovat problémy :)

protected function renderDefault()
{
	ob_start();
	$this->template->render();
	ob_end_clean();

	$this->sendResponse(new TemplateParametersResponse($this));
}
use Nette\Application\UI;

class TemplateParametersResponse extends Nette\Object implements \Nette\Application\IResponse
{
	private $parameters = array();

	public function __construct(UI\PresenterComponent $component)
	{
		$this->addComponent($component);
		foreach ($component->getComponents(TRUE, 'Nette\Application\UI\PresenterComponent') as $child) {
			$this->addComponent($child);
		}
	}

	/**
	 * @param \Nette\Application\UI\PresenterComponent $component
	 */
	public function addComponent(UI\PresenterComponent $component)
	{
		if (!$component->getReflection()->hasMethod('getTemplate')) {
			return;
		}

		$template = $component->getTemplate();
		if (!$template instanceof \Nette\Templating\Template) {
			return;
		}

		$this->parameters[$component->getUniqueId() ? : 'presenter'] = $template->getParameters();
	}

	/**
	 * Sends response to output.
	 * @return void
	 */
	public function send(Nette\Http\IRequest $httpRequest, Nette\Http\IResponse $httpResponse)
	{
		$httpResponse->setHeader('Content-Type: application/json');
		echo json_encode($this->parameters);
	}
}

Editoval HosipLan (22. 12. 2011 17:12)

jerry90
Člen | 19
+
0
-

Tak jsem to poplet, bohuzel ani tvoje reseni mi nefunguje, pokud explicitne nezavolam render(), tak tam ty promenne porad nejsou :(

jerry90
Člen | 19
+
0
-

Koukam, ze jsi mezitim kod opravil. Ted uz mi to dava vetsi smysl, ale pada mi to na

$this->template->render();

Template file name was not specified.

Filip Procházka
Moderator | 4668
+
0
-

Aha, tak to bude problém, protože soubor se nastavuje až v sendTemplate a tahle metoda rovnou zabije presenter.

jerry90
Člen | 19
+
0
-

Vyresil jsem to tak, ze jsem tam zkopiroval cast kodu z metody sendTemplate():

if ($template instanceof Nette\Templating\IFileTemplate && !$template->getFile()) { // content template
             $files = $this->formatTemplateFiles();
             foreach ($files as $file) {
                 if (is_file($file)) {
                     $template->setFile($file);
                     break;
                 }
             }
}