Pristup k promennym z latte sablon

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

Ahoj,

prakticky zacinam s nette a uplne si rvu vlasy nad necim, co je nejspis banalita, ale v dokumentaci na to nemuzu natrefit.

Na strankach, co pripravuji potrebuju generovat formular na zaklade externi definice, ktera je v jsonu. Ta nejenom popisuje, jaka policka by mela byt pritomna, ale taky jake je jejich logicke usporadani. Moje predstava byla ta, ze v presenteru data rozparsuju, policka pridam podle potreby do formu a pak v latte sablone na zaklade tech rozparsovanych dat upravim vizualni stranku.

Neco ve stylu:

presenter.php:

<?php
function createComponentTestForm()
{
  $form = new Nette\Application\UI\Form();

  ...
  $desc = json_decode(file_get_contents(...));
  ...
  $form->addText($desc["group1"]["item1"]["id"], $desc["group2"]["item1"]["label"]);
  ...

  return $form;
}
?>

default.latte:

{block #content}
  {form testForm}
    {foreach $desc["group1"] as $item}
      {label $item["id"]}{input $item["id"]}
    {/foreach}
  {/form}
{/block}

Akorat, ze mi tohle nefunguje, protoze mi to hazi error, zepromenna $desc neni nadefinova. Takze bych se chtel zeptat, jake promenne muzu v latte sablonach pouzivat a co mam udelat pro to, abych mel v sablone tu rozparsovanou definici pristupnou.

Diky.

Jan Tvrdík
Nette guru | 2595
+
0
-

Rychlý fix je $this->template->desc = $desc, ale není to úplně ideální. Možná ti někdo vysvětlí, jak to udělat pořádně.

drasha
Člen | 10
+
0
-

Ahoj,

tak tento rychly fix nepomaha. Porad mi to vraci ‚Undefined variable desc‘. Kdyz si prohlidnu promenne, tak desc najdu tady:

$presenter->response->source->desc

Akorat takto k tomu samozrejme nejde pristoupit. Takze ma otazka zni… jak se k tomu z latte dostanu?

Diky.

David Matějka
Moderator | 6445
+
+3
-

V sablone muzes pristoupit k promennym, ktere jsi poslal pres $this->template->.. = .., viz treba https://doc.nette.org/…n/presenters .. ty tam muzes poslat z nekolika mist "zivnotniho cyklu presenteru:https://doc.nette.org/…n/presenters .. v createComponent, jak radi Honza, to nepujde, jelikoz to se vola az dle potreby – v tomto pripade az pri vykresleni.

A idealni je plnit sablonu v nektere z render metod – tedy beforeRender a afterRender pro veci, ktere jsou spolecne pro vsechny akce presenteru. A v renderDefault (nebo renderXX dle akce) pro veci souvisejici s akci. Muzes to posilat i z action*, ale neni to idealni.

Idealne to bude vypadat nejak takto:

class XXXPresenter extends Presenter
{
	protected $desc;

	public function actionDefault()
	{
		$this->desc = json_decode(file_get_contents(...));
	}

	public function renderDefault()
	{
		$this->template->desc = $this->desc;
	}

	function createComponentTestForm()
	{
	  $form = new Nette\Application\UI\Form();


	  $desc = $this->desc;
	  ...
	  $form->addText($desc["group1"]["item1"]["id"], $desc["group2"]["item1"]["label"]);
	  ...

	  return $form;
	}

}

Ty data se musi nacist uz v action, jelikoz pri zpracovani formulare dochazi k zavolani action, pak zpracovani formulare a az pak render. (v ramci zivotniho cyklu je to na urovni handle metod)

Jako dalsi krok si to nacitani tech dat presun nekam do modelove tridy a bude asi i dobre to cachovat

drasha
Člen | 10
+
0
-

Diky moc, tohle uz funguje jak ma.

Jan Tvrdík
Nette guru | 2595
+
0
-

createComponent, jak radi Honza, to nepujde,

To nechápu, vždyť před prvním použít $desc v šabloně má {form testForm}, to nestačí? Jinak řešit to v createComponent je samozřejmě blbost.

David Matějka
Moderator | 6445
+
0
-

@JanTvrdík n, vsechny parametry se extrahuji na zacatku provadeni sablony do promennych: https://github.com/…Compiler.php#L135