!!! 顶级页面模板代码
- 在模板tpl中定义{2+3*4},会计算成14;
- {$x + $y}必须紧挨着大括号,+之间有无空格关系不大;
- 模板tpl中可定义{$str = strlen($hello)},输出{$a};{$a = strlen("$hello")}可以加引号,还可以加{}
- 模板tpl中定义多维数组{assign var=foo value=array(1, array(3,4), 7)},也可以{assign var=foo value=array[1, [3,4], 7]},还可以{assign var=foo value=[0=>1, 1=>[3,4], 2=>7]},调用方式{$foo[1][1]},或者{$foo.1.1},输出4;
- Smarty3模板tpl中支持动态的变量名{assign var=foo_3 value=[0=>1, 1=>[3,4], 2=>7, 8, 12, 79]},执行{$foo_{$x}[1][1]},输出4;
- 支持对象链:
{$object->method1($x)->method2($y)}
在Php中定义如下:
class Test {
function f1()
{
echo "调用方法1.<br/>";
return $this;
}
function f2()
{
echo "调用方法2.<br/>";
}
}
$t = new Test;
$smarty->assign("t", $t);
模板tpl中可以这样引用:
{$t->f1()->f2()}
- for语句:
{for $i=0; $i<$x; $i++}
hello, {$i}<br/>
{/for}
也可以
{for $i = 0 to 3 step 1}
hello, {$i}<br/>
{/for}
{for $i = 0 to 3}
hello, {$i@iteration}, {$i@total}, {$i@first}, {$i@last}<br/>
{/for}
{foreach $myarray as $var}...{/foreach}
{while $foo}...{/while}
- 函数递归:
{function name=menu level=0}
<ul class="level{$level}">
{foreach $data as $entry}
{if is_array($entry)}
<li>{$entry@key}</li>
{menu data=$entry level=$level+1}
{else}
<li>{$entry}</li>
{/if}
{/foreach}
</ul>
{/function}
{$menu = ['item1','item2','item3' => ['item3-1','item3-2','item3-3' =>
['item3-3-1','item3-3-2']],'item4']}
{menu data=$menu}
输出:
* item1
* item2
* item3
o item3-1
o item3-2
o item3-3
+ item3-3-1
+ item3-3-2
* item4
- 代码块不缓存:
{nocache}...{/nocache}之间的代码永远不会缓存
- 模板tpl中:
{$smarty.current_dir}输出模板当前目录
11.字符串直接用于smarty中:
$smarty->display('string:This is my template, {$foo}!'); // php
{include file="string:This is my template, {$foo}!"} // template
均是直接显示出string来。
- 限定变量存储:
$tpl = $smarty->createTemplate('index.tpl',$smarty);
或$tpl = $smarty->createTemplate('index.tpl')
$tpl->assign('hello',"hello world!");
//引用模板文件
$tpl->display('index.tpl');
- 可以将在一个tpl中定义的变量的范围放大,以在其他的tpl文件中使用:
{assign var=foo value='bar'} // no scope is specified, the default 'local'
{$foo='bar'} // same, local scope
{assign var=foo value='bar' scope='local'} // same, local scope
{assign var=foo value='bar' scope='parent'}
// Values will be available to the parent object
{$foo='bar' scope='parent'} // (normally the calling template)
{assign var=foo value='bar' scope='root'}
// Values will be exported up to the root object, so they can
{$foo='bar' scope='root'} // be seen from all templates using the same root.
{assign var=foo value='bar' scope='global'}
// Values will be exported to global variable storage,
{$foo='bar' scope='global'} // they are available to any and all templates.
- 模板继承:
parent.tpl:
<html>
<head>
<title>{block name='title'}My site name{/block}</title>
</head>
<body>
<h1>{block name='page-title'}Default page title{/block}</h1>
<div id="content">
{block name='content'}
Default content
{/block}
</div>
</body>
</html>
child.tpl:
{extends file='parent.tpl'}
{block name='title'}
Child title
{/block}
grandchild.tpl:
{extends file='child.tpl'}
{block name='title'}Home - {$smarty.block.parent}{/block}
{block name='page-title'}My home{/block}
{block name='content'}
{foreach $images as $img}
<img src="{$img.url}" alt="{$img.description}" />
{/foreach}
{/block}
We redefined all the blocks here, however in the title block we used {$smarty.block.parent},which tells Smarty to insert the default content from the parent template in its place.The content block was overriden to display the image files, and page-title has also be overriden to display a completely different title.
If we render grandchild.tpl we will get this:
<html>
<head>
<title>Home - Child title</title>
</head>
<body>
<h1>My home</h1>
<div id="content">
<img src="/example.jpg" alt="image" />
<img src="/example2.jpg" alt="image" />
<img src="/example3.jpg" alt="image" />
</div>
</body>
</html>