Jak vymazat proměnnou $flashes v latte šabloně
- m.brecher
- Generous Backer | 864
Napadlo mě vytvořit si malou kaskádu vykreslování $flashes v aplikaci takto:
- pro vykreslování použít jednotnou šablonku flashes.latte a tu vkládat všude, kde se bude $flashes vykreslovat
- primárně vkládat flashes.latte do šablon akcí pod formuláře které vykonaly akci
- vložit záložní flashes.latte do @layout.latte, který by se vykreslil pouze, pokud by se nevykreslil flashes.latte v šabloně akce
- nezatěžovat tím presenter a nechat na flashes.latte, ať si po prvním vykreslení data ve $flashes vynuluje
v presenteru nulování flashes funguje:
$this->flashes = []; // kde $this je $presenter
šablonu pro $flashes vkládám takto:
{include 'common\flashes.latte'}
v šabloně flashes.latte mám:
<div n:ifcontent id="scrolled-box">
<div n:foreach="$flashes as $flash" n:class="alert, 'alert-' . $flash->type">{$flash->message}</div>
</div>
tohle flashes vynuluje všude, kde se flashes.latte includuje:
{var $flashes = []}
<div n:ifcontent id="scrolled-box">
<div n:foreach="$flashes as $flash" n:class="alert, 'alert-' . $flash->type">{$flash->message}</div>
</div>
Zkusil jsem po prvním vykreslení $flashes vynulovat, ale tak přímočaře to nejde, proměnná $flashes je lokální jen pro šablonu akce, do layoutu se nulování nepřenese :(
<div n:ifcontent id="scrolled-box">
<div n:foreach="$flashes as $flash" n:class="alert, 'alert-' . $flash->type">{$flash->message}</div>
</div>
{var $flashes = []}
Zkusil jsem to obejít přes property v presenteru:
// presenter:
protected bool $flashesOn = true;
public function setFlashesOff(): void
{
$this->flashesOff = false;
}
public function isFlashesOn(): bool
{
return $this->flashesOn;
}
a latte – čtení z presenteru funguje, psaní do presenteru vyhodí „Can't use method return value in write context“
{if $presenter->isFlashesOn()}
<div n:ifcontent id="scrolled-box">
<div n:foreach="$flashes as $flash" n:class="alert, 'alert-' . $flash->type">{$flash->message}</div>
</div>
{/if}
{var $presenter->setFlashesOff()}
Tak jsem se chtěl zeptat, zda už někdo něco podobného řešil a zda by někoho nenapadlo to vyřešit nějak jednoduše a v souladu s „best practice“.
- Michal Kumžák
- Člen | 106
Mě to přijde jako celé na hlavu postavené. Tak buď to vykresluj pořád na jednom místě, například v Layoutu, nebo si to dělej všude tam kde to chceš, ale nemíchej tyto dvě varianty to dohromady. Já mám flashes dané v layoutu, mám je obalené snippetem, takže si je dokážu vykreslit i při ajaxu a nemám s tím žádný problém.
Podle mě nápad, ovládat chování z latte šablony, jde proti všemu v MVC.
- Polki
- Člen | 553
@mbrecher
Jak píše @MichalKumžák
Navíc to, co chceš dělat ty vypadá jakože chceš, aby měl třeba formulář vlastní flash message, která se zobrazí po odeslání. Nuže doporučuju si přečíst dokumentaci a naučit se něco o komponentách.
Každá komponenta má vlastní flash message, což celkem pěkně řeší tvoje problémy.
Jestli se ti to nechce číst samotnému, tak na netu jsou již k nalezení kurzy. Například na Learn2Code, nebo přímo kurzy od Davida.
- m.brecher
- Generous Backer | 864
@MichalKumžák
…
Podle mě nápad, ovládat chování z latte šablony, jde proti všemu v MVC.
Nemyslel jsem, aby šablona ovládala něco mimo šablonu. Měl jsem na mysli vykreslovací funkčnost šablony. Např. makro Latte n:ifcontent je trochu podobná funkce – kus kódu se vykreslí v závislosti na tom, jak proběhne vykreslení/nevykreslení jiného kusu kódu, je to funkce čistě uvnitř šablony a je čistě o logice vykreslení.
Flash šablonka o které sním by se uměla ve stránce vykreslit jenom jednou i kdyby se tam vložila vícekrát. Bez ovlivnění okolí. Kdyby šly proměnné mezi šablonami nějak přenést, tak je to triviální problém. Některé sny prostě zůstanou snem :)