setLayout() → Fatal error

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

Pokusil jsem se v nastavit layout pomocí funkce setLayout()

public function renderDefault()
{
    $this->setLayout('template');
}

a dostávám PHP Fatal error: Allowed memory size of 134217728 bytes exhausted…

Snažím se o použití vnořených layoutů tj.

  • templates\@layout.latte – obsahuje {include #template}
  • templates\Homepage\@template.latte – definuje {block #template} a v něm {include #content}
  • templates\Homepage\default.latte – definuje {block #content}

Pokud napíšu chybku v parametru metody (aspoň laděnka tvrdí že je to chyba):

public function renderDefault()
{
    $this->setLayout('template.latte');
}

Dostanu:"Layout not found. Missing template '…/templates/Homepage/@template.latte.latte'." a vypadá to že vše by mělo fungovat, že jsem vrták (vrtak-cz promine – kéž bych mel jeho znalosti nette) a když opravím ten string tak to pojede… ale dostanu uvedený Fatal error.

Pokud použiji v šabloně „default.latte“ – {extends '@template.latte'}, pak vše funguje ja má.
Rád bych ale ovlivňoval volbu layoutu z presenteru a pokud se nepletu, takto by to mělo fungovat.
PS: Ověřil jsem i na dnešním 2.0-dev (Nightly Build)

arron
Člen | 464
+
0
-

U chyb typu „Allowed memory size of xxxxxx bytes exhausted“ se zpravidla nekde neco zacykli…me osobne pomaha se podivat, kde se ta chyba vyhodila, je to takove prvni voditko, jaky kod se v tu chvili vlastne provadi…

To prvni nastaveni layoutu v Tvem prispevku je v poradku (nastavuje se jako layout soubor '@template.latte'). Typoval bych nejake zacykleni v includovani sablon nebo tak neco…

Tomáš Kuba
Člen | 15
+
0
-

Tak sem se na to trochu vyspal, prošel si to znovu a hledal tu smyčku. Vidím to tak, že háček je právě ve vnoření dvou layout-ů do sebe.

Jak sem uvedl výše, skládačka šablon by měla být takto:

default.latte (podle view)
   + -> @template.latte (nastaveno pomocí setLayout)
      + -> @layout.latte (nastaveno pomocí makra {extends ...} v podřízené @template.latte

Uvedené makro {extends …} jsem však napsal s parametrem auto a předpokládal, že bude automaticky hledat @layout.latte jako výchozí hodnotu. Není tomu tak – zde se Latte zacyklí.

Existuje prosím nějaký elegantnější způsob než do @template.latte napsat pokaždé {extends '../@layout.latte'}?

Abych to osvětlil blíže – rád bych do @layout.latte (ještě slovo layout napíšu 100× a už to budu umět napoprvé jako Pája) dal prakticky vše okolo tagu <body>. Do druhé vrstvy (template) bych rád dal základní „wireframing“ (drátový-rám) typicky rozmísťující bloky stránky (2 sloupce menu atd.}. No a bloky pak doplnil dle DB.

Tomáš Kuba
Člen | 15
+
0
-

Funguje i toto:

class HomepagePresenter extends BasePresenter
{
    public $auto = '../@layout.latte';
    ...
}
// -------- template --------
{extends $presenter->auto}
{block #template}
<h3>Jsem v template</h3>
    <div class="trida">
        {include #content}
    </div>
{/block}

.. ale přeci, není prosím ještě nějaký jiný trik?

arron
Člen | 464
+
0
-

A v cem je problem, kdyz v te @template.latte bude uvedeno {extends '@layout.latte'} ? Ono Nette je super, ale z prikazu $this->setLayout('template.latte'); se vazne neda poznat, ze do souboru @template.latte se ma includovat @layout.latte ;-)

Tomáš Kuba
Člen | 15
+
0
-

Máš pravdu, Nette je framework = umí hodně ale musí se umět použít :) Děkuju za pomoc a za názor.