3.Smarty3:基本语法

本文详细介绍了Smarty模版引擎的基本语法,包括模版注释、变量应用、表达式使用及函数调用等内容,并提供了丰富的实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


smarty模版中的使用的语法大致为两种:1.变量 2.函数。一般来说好的做法时最低限度地使用模版语法,将其专注于表现外在的内容。如果语法太过于复杂,则最好将与外在表现无关的后台处理通过插件或调节器交给PHP处理。说明一下:以下每个实例我使用的定界符为<{}>.


1. 模版注释

包围在定界标记”{” 和 “}”之间的都是注释内容,可以包括一行或多行。与html中的”<–! HTML注释–>”不同,
smarty注释内容不会出现在用户浏览页面的源代码中看到,因此推荐在使用smarty模版时采用Samrty注释方式。

<{*这里是注释内容*}>

2. 模版中的变量应用

不管是什么类型的变量,通通由assign()方法来赋给模版。但是注意,在Samrty模版中的变量预设是全局的,也就是说分配一次就够了,如果分配多次则以最后分配为主进行覆盖

2.1 在PHP中使用一些复杂变量

Smarty3中引入了PHP原生风格访问关联数组,既可以通过$arr[‘name’]也可以通过$arr.name访问

以下为实例说明
testSmarty.php

<?php
include '../Smarty/Smarty.class.php';
$smarty = new Smarty();
$smarty->left_delimiter='<{';
$smarty->right_delimiter='}>';

$arr1 = array('中国','英国','美国');
$arr2 = array('china'=>'中国','uk'=>'英国','us'=>'美国');
$arr3 = array('china'=>array('北京','上海','广州'),'uk','us'=>'美国');
$arr4 = array('china'=>'中国','英国','us'=>'美国');

$smarty->assign('str','常智');//字符串
$smarty->assign('int' , 1432);//整型
$smarty->assign('float',12.3);//浮点型
$smarty->assign('bool_true',true);//boolean型
$smarty->assign('bool_false',false);//boolean false型

$smarty->assign('arr1',$arr1);
$smarty->assign('arr2',$arr2);
$smarty->assign('arr3',$arr3);
$smarty->assign('arr4',$arr4);
$smarty->assign('arr5',$arr5);
$smarty->display('testSmarty.html');

testSamrty.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Samrty变量使用</title>
</head>
<body>
<hr/>
<h4>-------------字符串---------------</h4>
<p><{$str}></p>
<hr/>

<h4>-------------整型---------------</h4>
<p><{$int}></p>
<hr/>

<h4>-------------浮点型---------------</h4>
<p><{$float}></p>
<hr/>

<h4>-------------bool型---------------</h4>
<p>true:<{$bool_true}> false:<{$bool_false}></p>
<hr/>

<h4>-------------一维索引数组---------------</h4>
<p><{$arr1[0]}> || <{$arr1[2]}></p>
<hr/>
<h4>-------------一维关联数组---------------</h4>
<p><{$arr2.china}> || <{$arr2['uk']}>||</p>
<hr/>
<h4>-------------二维数组中一维数组元素为索引数组的---------------</h4>
<p><{$arr3.china[0]}> ||<{$arr3['china'][1]}> </p>
<hr/>
<h4>-------------既有关联又有索引的一维数组---------------</h4>
<p><{$arr4.china}> || <{$arr4[0]}></p>
<hr/>
<h4>-------------二维数组 Smarty3 foreach的使用----------</h4>
<{*smarty3 foreach新用法*}>
<{foreach $arr2 as $k => $v}>
    <p>key=<{$k}>||value=<{$v}></p>
<{/foreach}>
<h4>-------------二维数组 旧foreach的使用,不建议使用---------</h4>
<{foreach from = $arr2 item=v key=k}>
    <p>key=<{$k}>||value=<{$v}></p>
<{/foreach}>

</body>
</html>

2.2 在模版中应用表达式

smarty3几乎在所有地方都支持表达式,如果安全策略允许,表达式中可以包含PHP函数,对象方法及属性

{$x+$y}
{$foo = strlen($bar)}
{assign var =foo value=$x+$y}
{$foo = myfunct(($x+$y)*3)}
{$foo[$x+3]}

2.3 在双引号中嵌入变量

在smarty模版中可以识别嵌入双引号中的变量,只要此变量只包含数字、字母、下划线或中括号[].**对于其他符号(句号,对象相关的等),此变量必须使用两个反引号”`”包住。
另外在Smarty3中。Samrty的标签可以作为其他标签的值,并且Samrty的标签还可以在双引号中使用,PHP的函数也可以在双引号中使用**。

{func var="test $foo test"} {*在双引号中嵌入标量类型的变量*}
{func var="test $foo[0] test"}{*索引数组嵌入*}
{func var="test $foo['var'] test"}{*关联数组嵌入*}
{func var="test `$foo.bar` test"}{*嵌入对象中的成员时将变量用反引号包住*}

{$foo={counter}+3} {*smarty标签也可以作为其他标签的值*}
{$foo="this is message {counter}"} {*smarty标签也可以在双引号中使用*}
{$func var="variable foo is {if !$foo} not {/if} defined"}{*smarty的块标签也可以在双引号中使用*}
{$func var="time is {time()}"}{* PHP 函数执行结果在双引号中使用*}

2.4 smarty模版中的可变变量

在smarty3中又新增了PHP可变变量的机制。即模版变量名可以是一个表达式

$foo_{$bar}
$foo_{$x+$y}
$foo_{$bar}_buh_{$blar}

3. 模版中函数的应用

在模版中直接调用函数的方式和在PHP调用形式一样,但是不推荐使用。
在模版里分为Smarty内置函数和自定义函数两种,内置函数在Smarty内部工作,不能修改,自定义函数通过插件机制起作用,可以修改。Smarty中常用的函数分为:函数、块函数、变量调节器,详解后面的博客会讲到

3.1 函数

Smarty的函数使用和HTML独立元素标签非常相似,当然这是专门为了方便美工了。

{*html标签格式*}
<input type="text" name="username" value="admin">
{*samrty函数格式,确实和html标签的使用一样*}
{funcname attr1="var1" attr2="val2" attr3="val3"}
{config_load file="colors.conf"}

3.2 块函数

相当于html的闭合标签元素,在执行时会将块中的内容回传到该函数中,并结合属性处理和输出。后面提到的自定义块函数时会更加清楚。

{*内置块函数nocache和if的使用*}
{nocache}
    {$smarty.now|date_format}
{/nocache}

{if $bool}
    It's true;
{else}
    It's false;
{/if}

3.3 属性

Smarty函数的属性和html标签的属性很像。静态数值不需要加引号,但是字符串建议使用引号。可以使用普通smarty变量,也可以使用带变量调节器的变量作为属性值。它们也不用加引号。甚至可以使用PHP函数返回值和复杂表达式作为属性值,它们也不需要加引号。

{include file="header.tpl" nocache} {*使用boolean属性,nocache=true*}
{include file=$includeFile}{*使用变量作为属性值*}
{include file=#includeFile# title="My Title"}{*配置文件中的变量作为属性值*}
{assign var=foo value={counter}}{*使用smarty函数结果作为属性值*}
{assign var=foo value=substr($bar,2,5)}{*使用PHP函数结果作为属性值*}
{assign var=foo value=$bar|strlen}{*使用变量调节器处理的结果作为属性值*}
{assign var = foo value=$buh+$bar|strlen}{*使用复制的表达式作为属性值*}
<select name="company_id">
{html_options options=$companies selected = $company_id}{*使用数组作为属性值*}
</select>

4. 忽略Samrty解析

忽略Smarty解析很有必要,由于JavaScript和css代码使用了Smarty默认定界符一样的”{“和”}”符号。当然避免出现这种情况的好习惯是把JavaScript/CSS代码分离出来保存为独立的文件。再由HTML代码链接引入。这样做也有助于浏览器缓存脚本。当然如果要把Samrty变量、方法嵌入到JavaScript/CSS中,可以通过一下三种方法。

  1. 在smarty3中,如果使用”{“和”}”大括号里面包含有空格,那么整个{}内容将会被忽略。不过可以通过设置Smarty类属性$auto_literal=false;来取消这种规则.

    • 可以修改定界符’{‘和’}’
        $smarty->left_delimiter="<{";
        $smarty->right_delimiter="}>";
    
    • Smarty 内置的{literal}…{/literal}块函数,块中的内容可以被忽略使用模版语法解析。也可以使用{ldelim},{rdelim}标签或者{$smarty.ldelim}和{$smarty.rdelim}变量来忽略个别大括号.例如:
<script>
//以下大括号的内容会被Smarty忽略,因为它们里面有空格
function myfun(){
    alert("smarty");
}

//由于使用{literal}..{/literal}块函数,下面内容会保持原义输出
{literal}
function fun2(){alert("smarty")};
{/literal}
</script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值