Pristup k promennym z latte sablon
- drasha
- Člen | 10
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
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ě.
- David Matějka
- Moderator | 6445
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
- Jan Tvrdík
- Nette guru | 2595
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
@JanTvrdík n, vsechny parametry se extrahuji na zacatku provadeni sablony do promennych: https://github.com/…Compiler.php#L135