Použití template vícekrát

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

Pokušel jsem se rozesílat hromadnou korespondenci. (šabloně vždy předám jiné data) A narazil jsem na následující problém. Když si vytvořím template dám do něho data a vyrendruji, tak je vše v pořádku. Když to ovšem udělám znovu a vyrendruji ho, tak na mě vyletí chyba. (nastane pouze pokud požívám dědičnost šablon, tzn. prozatím jsem do toho templatu nacpal opravdu celý e-mail i s doctype atd.)

V presenteru:

/* ... */
foreach($prijemci AS $prijemce){
  $template = $this->createTemplate();
  $template->data = $prijemce; /* Pole */
  $template->odhlasitLink = $this->link("//bulletin:vypovedet",$prijemce->EmailHash);
  $template->domuLink = $this->link("//Uvod:");
  $template->setFile($dir."index.phtml"); /* $dir - definuje se někde dřív */

  // Odešleme informační email
  $mailer = new MyMailer;
  $mailer->body = $template->__toString();
/* ... */
  unset($mailer,$template);
/* ... */
}

Tato hláška se objeví u každé definice block-u. (je zde pouze jeden) Ale jak je zmíněno výše, první cyklus je v proběhne v pořádku, druhý a každá další vyhodí toho a na výstupu __toString() je prázdno.

 Warning: reset() [function.reset]: Passed variable is not an array or object in D:\01Data\htdocs\01Vyvoj\claudie_rev81\www\app\temp\cache-Nette.Template%002a680e2ce5dde15d3b413e5eda0050471.%40mail-doctype.phtml.php on line 31
Warning: call_user_func() [function.call-user-func]: First argument is expected to be a valid callback in D:\01Data\htdocs\01Vyvoj\claudie_rev81\www\app\temp\cache-Nette.Template%002a680e2ce5dde15d3b413e5eda0050471.%40mail-doctype.phtml.php on line 31

Řádek 31 v tempech:

<?php call_user_func(reset($_cb->blks['title']), $template->getParams()) ?>

V šabloně:

{extends ../@mail-doctype.phtml}
{block #body}
  Obsah
{/block}

@mail-doctype.phtml

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
  <title>{block #title}{/block}</title>
  {block #head}{/block}
</head>
<body>
  {block #body}
    <!-- Content of the page -->
  {/block}
</body>
</html>

//EDIT: /sloučeno s dalším příspěvkem/

Je to bug nebo feature? (popřípadě, pokud je to feature, jak vykonat výše popsanou věc)

P.S.: Já osobně na tuhle věc nespěchám, ale dozvěděl jsem se tady na fóru, že David připravuje nový Template (resp. prý dokonce jen čeká na commit), tak jenom by to chtělo zkontrolovat, jestli ten nový Template také dělá tuhle věc. ;)

Požito poslední nette (rev. 334 ze dne 5. 6. 2009); PHP 5.2.9

Editoval honzakuchar (8. 6. 2009 19:38)

Honza Kuchař
Člen | 1662
+
0
-

Ahoj, četl to někdo? Prosím vyzkoušejete a prosím řekněte mi, jestli je chyba někde u mě nebo je to tedy chyba v Template. Popřípadě nevíte o nějakém triku, jak tuhle chybu obejít? Díky

edke
Člen | 198
+
0
-

Ja len tak strelim od boku, mas pre tu sablonu nastavene:

$template->oldLayoutMode = false;
Honza Kuchař
Člen | 1662
+
0
-

Mam. Ale to by nemelo mit vliv. Protože se mi ta template po prvé vygeneruje v pořádku a po každé další vyhodí warning a vrátí prázdný string.

Papoušek
Člen | 16
+
0
-

Zdravím, mám stejný problém.

V jedné části webu používám komponentu a v druhé potřebuji těch komponent zobrazit více na jedné stránce. Když komponenty vykresluji, první se vykreslí v pořádku, ty další skoční na výše zmíněné hlášce.

Co s tím?

David Grudl
Nette Core | 8229
+
0
-

Přetrvává ten problém? Nepodařilo se mi ho nasimulovat.

Honza Kuchař
Člen | 1662
+
0
-

Mě už teď taky ne. Zdá se to být v pořádku.

//EDIT: testovací kód: (v šabloně je dovjnásobná dědičnost)

for($i=1;$i<=10;$i++){
    $template = $this->createTemplate();
    $template->setFile(APP_DIR.'/templates/Homepage/mail.phtml');
    $template->test = $i;

    $mail = new Mail();
    $mail
        ->addTo("yyy@xxx")
        ->setFrom("yyy@xxx")
        ->setBody($template)
        ->send();

    $this->flashMessage($i.". mail byl odeslán!");
}

Editoval honzakuchar (21. 9. 2009 23:50)