Skip to content


{capture} is used to collect the output of the template between the tags into a variable instead of displaying it. Any content between {capture name='foo'} and {/capture} is collected into the variable specified in the name attribute.

The captured content can be used in the template from the variable $ where "foo" is the value passed in the name attribute. If you do not supply the name attribute, then "default" will be used as the name ie $smarty.capture.default.

{capture}'s can be nested.


Attribute Name Required Description
name Yes The name of the captured block
assign No The variable name where to assign the captured output to
append No The name of an array variable where to append the captured output to

Option Flags

Name Description
nocache Disables caching of this captured block


Be careful when capturing {insert} output. If you have $caching enabled and you have {insert} commands that you expect to run within cached content, do not capture this content.


{* we don't want to print a div tag unless content is displayed *}
{capture name="banner"}
{capture "banner"} {* short-hand *}
  {include file="get_banner.tpl"}

{if $smarty.capture.banner ne ""}
<div id="banner">{$smarty.capture.banner}</div>

This example demonstrates the capture function.

{capture name=some_content assign=popText}
{capture some_content assign=popText} {* short-hand *}
The server is {$my_server_name|upper} at {$my_server_addr}<br>
Your ip is {$my_ip}.
<a href="#">{$popText}</a>

This example also demonstrates how multiple calls of capture can be used to create an array with captured content.

{capture append="foo"}hello{/capture}I say just {capture append="foo"}world{/capture}
{foreach $foo as $text}{$text} {/foreach}

The above example will output:

I say just hello world

See also $smarty.capture, {eval}, {fetch}, fetch() and {assign}.