Home > Article > Backend Development > Smarty template engine technology 2, smarty template engine_PHP tutorial
Function: Load a php file and assign the content of the loaded file to a variable
Note: This built-in function can only be used in 2.0. If used, SmartyBC.class.php must be instantiated.
Sample code:
Index.php
include 'Smarty/SmartyBC.class.php';
//InstantiationSmartyClass
$Smarty = new SmartyBC();
$Smarty->assign('name','Xiao Ming');
$Smarty->display('index.tpl');
index.tpl
<code><span><strong><em><span>{*<span>include_php</span></span>内建函数<span>*}<br/></span></em><span>{<span>include_php <span>file=<span>"date.php" <span>assign=<span>"date"<span>}<br/>{<span>$<span>date}</span></span></span></span></span></span></span></span></span></strong> </span></code>
Function: When the built-in functions of Smarty are not enough, you can expand the functions by inserting the built-in function.
Basic syntax: Create an index.php file
insert_Custom function name($arg){
echo $arg[variable defined in template]
}
Index.tpl file
{insert name=Custom function name Custom parameters... }
Sample code:
Index.php
function insert_func($arg){
echo $arg['title'];
}
function insert_date($arg){
echo $arg['say']."The weather is great today. , the current time is ".date('Y-m-d H:i:s',time());
echo '0c6dc11e160d3b678d68754cc175188a';
echo $arg['zhangsan']."The weather is great today. The time is now".date('Y-m-d H:i:s',time());
}
index.tpl template
{insert name="func" title='PHP is the best language in the world '}
de4f204c22aa49b61d034d4d1c141761
{insert name="date" say='Lao Wang said:' zhangsan='Hahaha:'}
Sample code:
{if $age >= 18}
This person is not a minor
{elseif $age == '14'}
This person is 14 years old
{else}
This person is a minor
{/if }
Sample code:
2f6cf198573244fe78eecd9fd558f8d0inSmarty we use {ldelim}if{rdelim}Perform conditional judgment4012831e3a2eefbc2deb929316c89eb7
Function: Any content in this tag will not be parsed by the Smarty template engine
Sample code:
{literal}
{*Hi, I am an annotator *}
{assign var='age' value="14"}
{/literal}
Operation effect:
Function: Native PHP code can be used in this tag.
Sample code:
{*PHPBuilt-in functions*}
{php}
echo date('Y-m-d h:i:s',time());
echo 'e4a2a72a754c8620bdcb175364a13854';
echo "I am at php Contents in built-in functions";
{/php}
Operation effect:
Function: Remove spaces and newlines
Sample code:
{strip}
9165d36ec14ba7d18a98f23a81a3fdee
3eb2936c9305cc2be5df05da3bdc6bbf
7ecace41b01a1f52d639e469e10446dd173d77725263331dc04e36c3ee69285dd
7ecace41b01a1f52d639e469e10446dd273d77725263331dc04e36c3ee69285dd
7ecace41b01a1f52d639e469e10446dd3td> ;
7ecace41b01a1f52d639e469e10446dd473d77725263331dc04e36c3ee69285dd
7ecace41b01a1f52d639e469e10446dd573d77725263331dc04e36c3ee69285dd
8118d48bb9f0e18103a0521c0d06ab0e
5c753628223b66373bca8cc5a80b907f
{/strip}
Before use:
After use:
Function: Traverse the array
Basic usage:
{section loop=$arr name="index"}
{$ arr[index]}
e4a2a72a754c8620bdcb175364a13854
{/section}
Parameter details: loop needs to traverse the array
Name The index of the current loop
Extended use 1: Use start step max
{section loop=$arr1 name="index" start="0" step="1" max="5"}
{$arr1[index]}
e4a2a72a754c8620bdcb175364a13854
{/section}
Step The amount added each time through the loop
Max the maximum number of loops
Extended use 2: sectionelse
Function: Determine whether the looped array is empty. If it is empty, execute the following content.
Example code:
{*sectionBuilt-in functions*}
{section loop=$arr1 name="index" start="0" step ="1" max="5"}
{$arr1[index]}
e4a2a72a754c8620bdcb175364a13854
{sectionelse}
2f6cf198573244fe78eecd9fd558f8d0): There is no array or the array is empty4012831e3a2eefbc2deb929316c89eb7
{/section}
Example code:
Index.php
$arr3 = array(array('name'=>'小明','age'=>25,'sex'=>'未知'),
array('name'=>'老王','age'=>26,'sex'=>'男'),
array('name'=>'老李','age'=>27,'sex'=>'你猜')
);
Index.tpl
{section loop=$arr3 name="index" }
{$arr3[index]['name']} |
{$arr3[index]['age']} |
{$arr3[index]['sex']} |
3920ce5276c6eb5a59f696e88f61d521
{/section}
运行效果:
拓展内容:
<code><span><strong>当前索引: <span><span>{<span>$<span>smarty.section.index.index} <span>->><br/></span></span></span></span>当前索引的前一个:<span>{<span>$<span>smarty.section.index.index_prev}<span>->><br/></span></span></span></span>当前索引的下一个:<span>{<span>$<span>smarty.section.index.index_next}<span>->><br/></span></span></span></span>当前所循环的次数<span> <span><span>{<span>$<span>smarty.section.index.iteration}<span>->><br/></span></span></span></span>判断当前是否第一次<span><span>: <span>{<span>$<span>smarty.section.index.first}<span>->><br/></span></span></span></span></span>判断当前是否最后一次:<span>{<span>$<span>smarty.section.index.last}<span>->> </span></span></span></span></span></span></span></span></strong></span></code>
循环的总次数:{$smarty.section.index.total}->>
运行效果:
示例代码:
{counter start='10' }
8e65074e4ab6377e7a2bb1d633810020
{counter}
8e65074e4ab6377e7a2bb1d633810020
{counter print=false}
8e65074e4ab6377e7a2bb1d633810020
{counter skip=2}
8e65074e4ab6377e7a2bb1d633810020
{counter}
8e65074e4ab6377e7a2bb1d633810020
运行效果:
基本语法:{cycle values=参数1,参数2,参数3}
示例代码:
{*cycleRealize color change of each row*}
8e65074e4ab6377e7a2bb1d633810020
697171e4e10446b800d41612e9316331
5fa60ebbd660b2996c732b4c499f9436
7ecace41b01a1f52d639e469e10446ddMy first {counter start='1' skip='1'} cycle73d77725263331dc04e36c3ee69285dd
8118d48bb9f0e18103a0521c0d06ab0e
d655ae91cba949cb66159382ab420099
7ecace41b01a1f52d639e469e10446ddI The {counter} loop73d77725263331dc04e36c3ee69285dd
8118d48bb9f0e18103a0521c0d06ab0e
d655ae91cba949cb66159382ab420099
7ecace41b01a1f52d639e469e10446ddMyth{counter} cycle73d77725263331dc04e36c3ee69285dd
8118d48bb9f0e18103a0521c0d06ab0e
d655ae91cba949cb66159382ab420099
7ecace41b01a1f52d639e469e10446dd Myth{counter}Loop73d77725263331dc04e36c3ee69285dd
8118d48bb9f0e18103a0521c0d06ab0e
e6aaccf385c218455467ade01656f20d
7ecace41b01a1f52d639e469e10446dd My first {counter} loop73d77725263331dc04e36c3ee69285dd
8118d48bb9f0e18103a0521c0d06ab0e
d655ae91cba949cb66159382ab420099
7ecace41b01a1f52d639e469e10446dd My number{counter} cycles73d77725263331dc04e36c3ee69285dd
8118d48bb9f0e18103a0521c0d06ab0e
< ;/table>
{debug}
Operation effect:
Function: Capture the contents of a file and assign it to a variable
Sample code:
{fetch file="shi.txt" assign="text"}
{fetch file="date.php" assign="php"}
{*变量调节器
{$text|变量调节器名称:参数1:参数2}
*}
{$php}
8e65074e4ab6377e7a2bb1d633810020
{$text|nl2br}
运行效果:
<code><span><strong>{<span>html_image <span>file=<span>"1.jpg"<span>}</span></span></span></span></strong> </span></code>
参数:file 图片资源的路径
运行效果:
作用:生成一个表格,将数据遍历进去
示例代码:
{html_table loop=$arr cols="3"}
参数说明:loop 要循环遍历的数组
Cols 指定表格列数
作用:生成一组多选框
示例代码:
{html_checkboxes name = 'job'
values = $arr
checked = $arr2
output = $arr3
separator = "|"
}
参数说明: name 对应多选框中的name属性
Values 对应多选框中你的value属性
Checked 选中指定的多选框
Output 控制文本内容
Separator 连接符
运行效果:
{待补充}
示例代码:
<code><span><strong><<span>select <span>style=<span>"<span>width: <span>100<span>%;<span>"<span>><br/> <span>{<span>html_options <span>values = <span>$<span>arr<br/> selected = <span>'GO'<br/> <span>output = <span>$<span>arr3<br/> }<br/><span></<span>select<span>></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></strong><span> </span></span></code>
参数说明:values 下拉框选项的值
Selected 指定被选中的下拉选项,注意:必须和value的值对应
Output 输出的文本
示例代码:
<code><span><strong>{<span>html_radios <span>values = <span>$<span>arr<br/> checked = <span>'nodejs'<br/> <span>output = <span>$<span>arr3<br/> separator = <span>"|"<br/><span>}</span></span></span></span></span></span></span></span></span></span></strong> </span></code>
参数说明:values 单选框的值
Checked 指定默认被选中的单选框
Output 输出的文本
Separator 连接符
运行效果:
{待补充}
实例代码:
{section loop=$arr4 name="index" }
{html_image file="./img/{$arr4[index]}.jpg"}
8e65074e4ab6377e7a2bb1d633810020
{/section}
SMARTY_DIR
以上变量都有默认行为。
$Smarty->append('var1','Xiao Ming');
$Smarty->append ('var1','25');
$Smarty->append('var1','Male');
$Smarty->clearAllAssign(); // Clear all template variables
$Smarty->clearAssign('title') ;
$Smarty->configLoad('config.conf','class2');
$Smarty->clearConfig('name') ;
$Smarty->display('index_3.tpl');
Load template file
Rendering template
Show template
Load template file
Render (replace tags with php code) template file
We can implement static technology through fetch.
Index_3.php file
/*
* If any Static files are loaded, and if there is no static file, a static file is generated.
* */
if(!is_file( './html/index_3.html')){
$html = $Smarty->fetch('index_3.tpl');
file_put_contents('./html/index_3.html',$html);
echo ' There are no static files here';
include "./html/index_3.html";
}else{
echo 'There are static files here ';
include "./html/index_3.html";
}
[To be added]
if($Smarty->templateExists('index_4.tpl')){
$Smarty->display('index_3.tpl');
}else{
echo ' Diaoyou, the template file is not there~';
}
Added: How to read array, object in smarty template.
{*多维数组*}
{$var[0]['name']}
{*一位数组*}
{$var['name']}
{*获取对象属性*}
{$std->name}
8e65074e4ab6377e7a2bb1d633810020
{*获取对方法*}
{$person->speak()}
Index3.php文件
$std
= new StdClass();
class person{
function __construct(){}
function speak(){
echo '你猜猜我谁?';
}
}
$person = new person();
$std->name = '张二明';
概念:一般在我们项目中,有一部分数据并不是实时更新的,但是,有又必须实时访问。如果不使用缓存技术的话,每访问一次,得查询一次或者多次数据库,那么会给数据造成很高的I/O开销。会增加服务器的压力。
用户端缓存原理:
服务器缓存原理:
//开启缓存
$Smarty->caching = true;
//设置缓存文件的生命周期
$Smarty->cache_lifetime = '7200';
缓存文件由编译文件而来。
编译文的内容何时变化?
思路:设置一个生命周期只有30秒的缓存文件,定义一个变量,在模板中使用该变量。然后打开index.php.
然后修改该变量的值。等待。。。30
<code><span><strong>$Smarty<span>->isCached(<span>'index_4.tpl'<span>)</span></span></span></strong> </span></code>
<code><span><span><strong><em>//</em></strong></span><span><strong><em>清除所有缓存<br/><span><span>$<span>Smarty->clearAllCache();<br/><span>//</span></span></span><span>清楚某模板缓存文件<br/></span></span></em><span>$Smarty<span>->clearCache(<span>'index_4.tpl'<span>);</span></span></span></span></strong> </span></span></code>
在Smarty的缓村是全局缓存,如果开启缓存,访问整个页面的数据都会被缓存,如果页面中有一些动态数据需要修改,如何处理?
如何处理页面中动态显示的数据部分呢?
<code><span><strong><span>$Smarty<span>->assign(<span>'shige'<span>,<span>'</span></span></span></span></span>《再别康桥》<span>'<span>,<span>true<span>);</span></span></span></span></strong> </span></code>
<code><span><strong>{<span>nocache<span>}<br/> {<span>$<span>title}<br/>{/<span>nocache<span>}</span></span></span></span></span></span></strong> </span></code>
如何解决一个模板文件,动态显示不同的内容。
实际场景:譬如一个电商网站的商品详细页,会动态的根据URL上的参数,改变该页面的内容。
那么这种情况如何实现缓存呢?
http://localhost:63354/Smarty/Smarty02/index5.php?goods_id=1
http://localhost:63354/Smarty/Smarty02/index5.php?goods_id=2
http://localhost:63354/Smarty/Smarty02/index5.php?goods_id=3
http://localhost:63354/Smarty/Smarty02/index5.php?goods_id=250
在Smarty中,我们通过设置display()第二个参数,来实现,单页面,多缓存。
http://localhost:63354/Smarty/Smarty02/index5.php?goods_id=1&cate_id=15
http://localhost:63354/Smarty/Smarty02/index5.php?goods_id=1&cate_id=15
http://localhost:63354/Smarty/Smarty02/index5.php?goods_id=1&cate_id=15
http://localhost:63354/Smarty/Smarty02/index5.php?goods_id=1&cate_id=15
我们通过给display()方法设置第二个参数实现缓存集合(通过|分割)
<code><span><span><strong>$Smarty</strong></span><span><strong>->display(<span>'index_5.tpl'<span>,<span>$_GET<span>[<span>'goods_id'<span>].<span>'|'<span>.<span>$_GET<span>[<span>'cate_id'<span>]);</span></span></span></span></span></span></span></span></span></span></span></span></strong> </span></span></code>
示例代码:
<code><span><strong><span>//</span><span>定义一个函数用于字符串替换</span><span> </span></strong></span></code>
<code><span><strong><span>function <span>check<span>(<span>$tpl_output<span>, <span>$smarty<span>){<br/> <span>$tpl_output <span>= <em>str_replace</em>(<span>'</span></span></span></span></span></span></span></span></span></span>苍井空<span><span>'<span>,<span>'</span></span></span>张某某<span>'<span>,<span>$tpl_output<span>);<br/> <span>return <span>$tpl_output<span>;<br/>} </span></span></span></span></span></span></span></span></strong></span></code>
<code><span><strong><span>//</span><span>通过注册过滤器,实现模板中的字符串过滤</span></strong><span><strong><br/><span>$Smarty<span>->registerFilter(<span>"output"<span>,<span>"check"<span>);</span></span></span></span></span></span></strong> </span></span></code>
通过模板继承实现页面精细化拆分
示例代码:
Parent.tpl文件
<code><span><span><strong>{<span>extends <span>file=<span>"parent.tpl"<span>}<br/>{<span>block <span>name=<span>'content'<span>}<br/> </span></span></span></span></span></span></span></span></strong></span><span><strong>偶哈呦,哈哈哈哈<br/> <span><<span>hr<span>><br/><span>{/<span>block<span>}</span></span></span></span></span></span></strong> </span></span></code>
Child.tpl文件
<code><span><span><strong>{<span>extends <span>file=<span>"parent.tpl"<span>}<br/>{<span>block <span>name=<span>'content'<span>}<br/> </span></span></span></span></span></span></span></span></strong></span><span><strong>偶哈呦,哈哈哈哈<br/> <span><<span>hr<span>><br/><span>{/<span>block<span>}</span></span></span></span></span></span></strong> </span></span></code>