Jak vymazat proměnnou $flashes v latte šabloně

m.brecher
Generous Backer | 735
+
-1
-

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

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

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

@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 :)

Polki
Člen | 553
+
0
-

@mbrecher
To právě řeší ty komponenty. Každá komponenta je kousek stránky, který má své vlastní FlashMessages, takže se v šabloně vykreslí flash message jen jednou a na tebou určeném místě.

Sen se stane realitou.