Do czego można używać {capture} w Smarty?
Kategoria: php/db
Ostatnio takie pytanie zadał mi znajomy podczas rozmowy na gg. Początkowo zdziwiło mnie to trochę, ale po głębszym zastanowieniu doszedłem do wniosku, że faktycznie ciężko z głowy podać przykłady sensownego użycia {capture}. Rzuciłem okiem do ostatniego projektu i znalazłem dwa najważniejsze użycia {capture} w Smarty:
* tworzenie treści popupów (HTML),
* tworzenie elementów wielokrotnego użycia.
W przypadku pierwszym przykład jest dość prosty:
{capture name="prodinfo"}
<table>
<tr><th>Nazwa</th><td>{$item.product.name}</td></tr>
<tr><th>Kod</th><td>{$item.product.code}</td></tr>
<tr><th>Cena</th><td>{$item.product.price}</td></tr>
</table>
{/capture}
a poniżej używamy utworzonego HTMLa jako paramteru (powinno być właściwie
text=$smarty.apture.prodinfo|replace:’”‘:’”‘}, żeby uniknąć problemów w javascript):
<a href="/Procucts/1/"
{popup text=$smarty.capture.prodinfo}>Product 1</a>
W drugim przypadku jest coś takiego (występuje w {foreach item=i}):
{capture name="pid"}pid-{$pro.id}-{$i.month}-{$i.year}{/capture}
<a href="javascript:ShowProduct( '{$smarty.capture.pid}' ); ">
Pokaż produkt X</a>
co tworzy link do “jakiegoś produktu” - ta część zaś składa się z elementów tabeli dotyczących podsumowania samego produktu,
jak i wszystkich jego elementów:
<tr id="{$smarty.capture.prodid}" style="display: none;">
<a href="/asdfasdf/">Wszystko dotyczące produktu X</a>
</td></tr>
<tr id="{$smarty.capture.prodid}-0">...</tr>
<tr id="{$smarty.capture.prodid}-1">...</tr>
...
</tr>
Przy czym javascriptowa funkcja ShowProductAndInfo() pobiera początek “id” dla zarówno linii produktu jak i pozostałych linii (robię for() od zera aż do pierwszego nie znalezionego elementu).
To najczęstsze moje użycie {capture} – a do czego Ty używasz {capture}?


2008-09-21 13:08
Podam przykład z OPT, który posiada identyczną instrukcję. Wiadomo, że wygenerowanie URL-a za pomocą routera pochłania trochę czasu. Dlatego gdy musiałem ten sam adres wyświetlić w kilku miejscach, generowanie opakowywałem w , a wynik wyświetlałem później wszędzie tam, gdzie był mi potrzebny.