Autor Zpráva
Tori
Profil
Pěkný večer.
Vypisuju velký objem dat z DB do několika souborů, data se ještě po cestě transformují přes Smarty šablony (pro každý soubor jiná), prostě XML export. Pro úsporu paměti se data po jednom řádku vkládají do šablon a výsledek z každé šablony se připojí do odpovídajícího souboru. Momentálně mám pro každý soubor/šablonu jednu instanci Smarty (vytvořenou přes $smarty->createTemplate) a hledám způsob, jak mít pouze jednu instanci Smarty pro n různých šablon. V dokumentaci Smarty jsem (zatím) nic takového nenašla, ale zkouším dál.

1) Je nějaký způsob, jak mít jen jednu instanci a měnit šablonu, kterou používá? Tj. místo tohoto:
foreach $files as $file
    $templates[$file.id].assign($row)
    $file.addData($templates[$file.id].fetch())
mít něco takovéhoto:
foreach $files as $file
    $template.setTpl($file.getTplName())
    $template.assign($row)
    $file.addData($template.fetch())

2) Pokud by to nešlo, je možné nějak do Smarty šablony nalít data, a místo celého výsledku načíst jen jeden konkrétní blok (určený např. pomocí {capture}). Totiž že bych pak mohla sloučit všechny šablony do jedné a jen označila jednotlivé části, a výsledný kód by pak vypadal třeba takhle:
$template.assign($row)
foreach $files as $file
    $file.addData($template.getBlockById($file.id))
Mám pocit, že tento způsob by mohl být i rychlejší (jen jedno čtení+zpracování šablony).

Budu ráda za případné rady. Použití Smarty je (kvůli různým pomocným funkcím a podmíněným blokům) nezbytné.
Tori
Profil
Ad varianta 2: Data zachycená pomocí {capture name="nazev"} se dají číst ze statického pole Smarty::$_smarty_vars['capture'], kde klíčem je název zachyceného bloku. Nicméně tohle pole je společné pro všechny instance Smarty, takže vidím riziko neúmyslného přepsání. Nahrazení řetězcem UID je pro mne trochu problém, protože součástí názvu bloku je ID z databáze, podle kterého pak identifikuju obsah. ... Snad budu mít někdy čas prozkoumat Smarty trochu do hloubky, možná přijdu na něco lepšího.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: