扒掉Smarty的裤衩儿
来源:互联网 发布:邮箱大师 for mac 编辑:程序博客网 时间:2024/04/28 21:38
一、什么是smarty?
smarty是一个使用PHP写出来的模板PHP模板引擎,可以理解成是一个用php编写的类。它提供了逻辑与外在内容的分离,简单的讲,目的就是要使用PHP程序员同美工分离,使用的程序员改变程序的逻辑内容不会影响到美工的页面设计,美工重新修改页面不会影响到程序的程序逻辑。
二、smarty优点:
1. 速度:采用smarty编写的程序可以获得最大速度的提高,这一点是相对于其它的模板引擎技术而言的。
2. 编译型:采用smarty编写的程序在运行时要编译成一个非模板技术的PHP文件,这个文件采用了PHP与HTML混合的方式,在下一次访问模板时将WEB请求直接转换到这个文件中,而不再进行模板重新编译(在源程序没有改动的情况下
3. 模板中可以使用if/elseif/else/endif。在模板文件使用判断语句可以非常方便的对模板进行格式重排。
4. 缓存技术:smarty选用的一种缓存技术,它可以将用户最终看到的HTML文件缓存成一个静态的HTML页,当设定smarty的cacheing属性 为true时,在smarty设定的cachetime期内将用户的WEB请求直接转换到这个静态的HTML文件中来,这相当于调用一个静态的HTML文 件。
5. 插件技术:smarty可以自定义插件。插件实际就是一些自定义的函数。
三、不适合使用smarty的地方:
1. 需要实时更新的内容。例如像股票显示,它需要经常对数据进行更新,这类型的程序使用smarty返而会使模板处理速度变慢。
2. 小项目。小项目因为项目简单而美工与程序员兼于一人的项目,使用smarty返而会丧失php开发迅速的优点。
四、smarty配置:
1基本配置
require_once(“include/smarty/Smarty.class.php”);
$smarty = new smarty;
$smarty->left_delimiter = '{{';
//定义替换符号
$smarty->right_delimiter = '}}';
//定义替换符号
$smarty->caching = true;
//设置cache有效
$smarty->template_dir = FNAME."templates/";
//模版文件存放路径
$smarty->cache_dir = FNAME."cache/";
//缓存存放路径
$smarty->config_dir = FNAME."configs/";
//smarty配置文件存放路径
2高级配置
require_once 'include/smarty/Smarty.class.php';
$smarty = new smarty;
$smarty->left_delimiter = '{{';
//定义替换标记
$smarty->right_delimiter = '}}';
//定义替换标记
$smarty->debugging = false;
//关闭掉调试控制台
$smarty->force_compile = false;
//强迫编译变量,强迫Smarty每次调用(重新)编译模板
$smarty->compile_check = true;
//每次调用PHP应用程序,Smarty 会试着查看自上次编译时间以来,当前模板是否被修改过.如果修改过了,它会重新编译那个模板.
$smarty->caching = true;
//设置cache有效
$smarty->compile_dir = FNAME."templates_c/";
//smarty编译后的文件存放路径
$smarty->template_dir = FNAME."templates/";
//模版文件存放路径
$smarty->cache_dir = FNAME."cache/";
//缓存存放路径
$smarty->config_dir = FNAME."configs/";
//smarty配置文件存放路径
$smarty->plugins_dir = FNAME."phpcode/include/smarty/smartyActive/"; //自定义函数路径,默认在smarty/plugs下
$smarty->cache_lifetime = 600;
//定义模板缓存有效时间段的长度
$smarty->config_overwrite = false;
//如果设该变量为真,则从配置文件中读取出来的变量将会互相覆盖.否则,变量将会放到一个数组中
五、smarty在模板中的使用:
本节通过几个实例来讲一讲smarty的使用,smarty模板通常使用.tpl来标识,也可以将扩展名直接写成.html。
实例1:
先来看一个简单的例子。
<html>
<head>
<title>{{$webtitle}}</title>
</head>
<body>
<-- Begin assign --><br>
{{$name}}
<br>
{{literal}}
{{李四}}
{{/literal}}
<br>
<-- End assign -->
{{include file="foot.html"}}
</body>
</html>
上边的这个例子是一个html模板,其中:
1. {{include file="xxx.html"}}使用此句将一个模板文件包含到当前页面中,例子中将在网站中公用事的head.html与foot.html进行了包 含,你可以这样想,使用这一句将xxx.html中的内容全部复制在当前语句处。当然,你不使用这一句也可以,将XXX.html中的内容复制到当前语句 处也是完全可以了。
2.{{$name}}: 模板变量,smarty中的核心组成,采用smarty定义的左边界符{{与右边界符}}包含着、以PHP变量形式给出,在smarty程序中将使用 $smarty->assign("name", "张三");将模板中的$name替换成“张三”三个字。
3.当有类似{{李四}}这样的特殊标记不希望被smarty替换时,需要这样来标识
{{literal}}{{李四}}{{/literal}}这样位于{{literal}}与{{/literal}}之间的内容就不会被smarty解析。
整个实例源程序如下:
<?
include_once("include/config.inc.php");
$smarty->assign("webtitle","smarty");
$smarty->assign("name","张三");
$smarty->display("index.html");
?>
foot.html
<hr>
<center> CopyRight(C) by {{$smarty.now}}</center>
<hr>
index.html
<html>
<head>
<title>{{$webtitle}}</title>
</head>
<body>
<-- Begin assign --><br>
{{$name}}
<br>
{{literal}}
{{李四}}
{{/literal}}
<br>
<-- End assign -->
{{include file="foot.html"}}
</body>
</html>
实例2:
这个例子是综合使用smarty模板参数的一个例子,这些参数用来控制模板的输出,只选出其中几个,其它的参数可以去看参考。
<html>
<head>
<title>{{$webtitle}}</title>
</head>
<body style="font-size:12px">
1. 第一句首字母要大写:{{$str1|capitalize}}<br>
2. 第二句模板变量 + 张三:{{$str2|cat:"张三"}}<br>
3. 第三句输出当前日期:{{$str3|date_format:"%Y年%m月%d日"}} <br>
4. 第五句要让它缩进8个空白字母位,并使用"*"取替这8个空白字符:<br>
{{$str4|indent:8:"*"}}<br>
5. 第六句把YMF@163.com全部变为小写:{{$str5|lower}}<br>
6. 第七句把变量中的name替换成:张三:{{$str6|replace:"name":"张三"}}<br>
7. 截取字符串,并用"..."代替:{{$str7|truncate:8:"...":true}}<br>
8.去除html标签:
{{$str8|strip_tags}}
</body>
</html>
tplpar.php
<?
include_once("include/config.inc.php");
$smarty->assign("webtitle","smarty参数例子");
$smarty->assign("str1", "my name is zhang san");
$smarty->assign("str2", "我的名字叫:");
$smarty->assign("str3", time());
$smarty->assign("str4", "前边8个*");
$smarty->assign("str5", "YMF@163.com");
$smarty->assign("str6", "this is name,this is name");
$smarty->assign("str7", "一起研究smarty吧");
$smarty->assign('str8', "Blind Woman Gets <font face=/"helvetica/">New Kidney</font> from Dad she Hasn't Seen in <b>years</b>.");
$smarty->display("tplpar.html");
?>
实例3.
smarty中的函数应用
<html>
<head>
<title>{{$webtitle}}</title>
</head>
<body style="font-size:12px">
1.html_checkboxes函数
<br>
{{html_checkboxes name="id" options=$cust_checkboxes checked=$customer_id separator="<br />"}}
<br>
2.html_radios函数
<br>
{{html_radios name="id" options=$cust_radios checked=$customer_id separator="<br />"}}
<br>
3.html_options函数
<br>
<select name=customer_id>
{{html_options options=$cust_options selected=$customer_id}}
</select>
<br>
4.html_select_date函数(默认形式)
<br>
{{html_select_date}}
<br>
5.html_select_date函数(可处理形式)
<br>
{{html_select_date prefix="StartDate" start_year="-5" end_year="+1" display_days=true month_format="%m" day_format="%d" field_order="YMD" }}
<br>参数说明:prefix 下拉框的name前缀,如该下拉框的name分别为StartDateYear
StartDateMonth
StartDateDay<br>
start_year
开始的年份,为当前年份-5<br>
end_year
结束年份,为当前年份+1<br>
display_days 是否显示日的选择,同理会有display_month
display_year<br>
month_format
月份的显示格式<br>
day_format
日期的显示格式<br>
field_order 下拉框的顺序,即年月日的排列顺序<br>
6.接收变量函数<br>
$smarty.get.id:接收get过来的id的值{{$smarty.get.id}}<br>
$smarty.post.id:接收post过来的id的值{{$smarty.post.id}}<br>
$smarty.request.id:接收request过来的id的值{{$smarty.request.id}}<br>
$smarty.cookies.id:接收cookie中名为id的值{{$smarty.cookies.id}}<br>
$smarty.session.id:接收session中名为id的值{{$smarty.session.id}}<br>
$smarty.const.FNAME:取出php中定义名为FNAME的常量:{{$smarty.const.FNAME}}<br>
$smarty.now:取出当前UNIX时间戳:{{$smarty.now}}<br>
</body>
</html>
tplfunction.php
<?
include_once("include/config.inc.php");
$smarty->assign("webtitle","smarty函数例子");
//html_checkbox函数
$smarty->assign('cust_checkboxes', array(
1000 => 'Joe Schmoe',
1001 => 'Jack Smith',
1002 => 'Jane Johnson',
1003 => 'Charlie Brown'));
$smarty->assign('customer_id', 1001);
//html_radios函数
$smarty->assign('cust_radios', array(
1001 => 'Joe Schmoe',
1002 => 'Jack Smith',
1003 => 'Jane Johnson',
1004 => 'Charlie Brown'));
$smarty->assign('customer_rid', 1001);
//html_options 函数
$smarty->assign('cust_options', array(
1001 => 'Joe Schmoe',
1002 => 'Jack Smith',
1003 => 'Jane Johnson',
1004 => 'Charlie Brown'));
$smarty->assign('customer_id', 1001);
$smarty->display("tplfunction.html");
?>
实例4
模版控制应用,模版中的控制一般有一下几种常用函数:section、foreach、if elseif else,这个例子讲一下他们的用法。
<html>
<head>
<title>{{$webtitle}}</title>
</head>
<body style="font-size:12px">
1.section的用法(php数组key必须从0开始)<br>
<table>
{{section name=c_sec loop=$customer}}
<tr bgcolor="{{cycle values='#eeeeee,#d0d0d0'}}">
<td>{{$smarty.section.c_sec.index}}</td>
<td>id:{{$customer[c_sec].id}}</td>
<td>name:{{$customer[c_sec].name}}</td>
</tr>
{{/section}}
<tr><td colspan="3">共有{{$smarty.section.c_sec.total}}个用户</td></tr>
</table>
<br>
2.foreach的用法<br>
<table>
{{foreach key=key name=outer item=contact from=$customer}}
<tr>
<td>{{$key}}</td>
<td>{{$contact.id}}</td>
<td>{{$contact.name}}</td>
</tr>
{{/foreach}}
</table>
<br>
3.if,elseif,else的用法<br>
<table>
<tr>
<td>{{if $exam eq 0}}exam=0{{elseif $exam eq 1}}exam=1{{else}}exam=????{{/if}}<td>
</tr>
</table>
<br>
4.section 嵌套(需要php数组为四维)
<table>
{{section name=s_sec loop=$sort}}
<tr bgcolor="{{cycle values='#eeeeee,#d0d0d0'}}">
<td>{{$smarty.section.s_sec.index}}</td>
<td>id:{{$sort[s_sec].id}}</td>
<td>name:{{$sort[s_sec].name}}</td>
</tr>
<tr><td width="10px"> </td><td colspan="2">
<table width="100%">
{{section name=sub_sec loop=$sort[s_sec].sub}}
<tr bgcolor="{{cycle values='#eeeeee,#d0d0d0'}}">
<td>{{$smarty.section.sub_sec.index}}</td>
<td>id:{{$sort[s_sec].sub[sub_sec].id}}</td>
<td>name:{{$sort[s_sec].sub[sub_sec].name}}</td>
</tr>
{{/section}}
</table>
</td></tr>
{{/section}}
</table>
5.模版文件中引用php代码,采用{php}作为标记
{{php}}
for($i=0;$i<5;$i++){
echo $i."<br>";
}
{{/php}}
</body>
</html>
tplcontrol.php
<?
include_once("include/config.inc.php");
$smarty->assign("webtitle","smarty控制例子");
$customer =array(
0 => array("id"=>'1000',"name"=>'Joe Schmoe'),
1 => array("id"=>'1001',"name"=> 'Jack Smith'),
2 => array("id"=>'1002',"name"=> 'Jane Johnson'),
3 => array("id"=>'1003',"name"=> 'Charlie Brown')
);
$smarty->assign('customer',$customer);
//if
else if
else
$exam = 1;
//section 树型结构数组
$sort =array(
0 => array(
"id"=>'1000',
"name"=>'分类A',
"sub"=>array(
0 => array(
"id"=>"1",
"name"=>"A1"
),
1=> array(
"id"=>"2",
"name"=>"A2"
),
2 => array(
"id"=>"3",
"name"=>"A3"
),
3=> array(
"id"=>"4",
"name"=>"A4"
)
)
),
1 => array(
"id"=>'1001',
"name"=> '分类B',
"sub"=>array(
0 => array(
"id"=>"1",
"name"=>"B1"
),
1=> array(
"id"=>"2",
"name"=>"B2"
),
2 => array(
"id"=>"3",
"name"=>"B3"
),
3=> array(
"id"=>"4",
"name"=>"B4"
)
)
),
2 => array(
"id"=>'1002',
"name"=> '分类C',
"sub"=>array(
0 => array(
"id"=>"1",
"name"=>"C1"
),
1=> array(
"id"=>"2",
"name"=>"C2"
)
)
),
3 => array(
"id"=>'1003',
"name"=> '分类D',
"sub"=>array(
0 => array(
"id"=>"1",
"name"=>"D1"
)
)
)
);
$smarty->assign("sort",$sort);
$smarty->assign('exam',$exam);
$smarty->display("tplcontrol.html");
?>
六、 Smarty缓存的应用
1.使用缓存
首先保证$smarty->caching=true,这样smarty生成的缓存文件就放入了设置的cache_dir文件夹中。
2.清除缓存
clear_all_cache();//清除所有缓存
clear_cache('index.tpl');//清除index.tpl的缓存
clear_cache('index.tpl',cache_id);//清除指定id的缓存
3. 建立缓存目录分级
用于解决缓存文件过大的问题
$smarty->use_sub_dirs = true;
七、 smarty自建函数
定义规则:如文件名称为function.dataop.php,则文件内部的函数名称必须为
smarty_function_dataop。
实例1
编写函数smarty_function_dataop,用来显示常用的下拉框,如:身份、职业等。
<?php
function smarty_function_dataop($params, &$smarty)
{
if (!isset($params['key'])) {
$smarty->trigger_error("checkid: missing 'key' parameter");
return '';
}
$ret='';
$key=strtolower($params['key']);
switch($key)
{
case "jobpos":
$data=array(
"-1"=>"请选择",
"100"=>'工程师',
"101"=>'IT人士'
);
$show=$data;
break;
case "hangye":
$data=array(
"-1"=>"请选择",
"142"=>'外企',
"100"=>'国营企业',
"101"=>'国家机关'
);
$show=$data;
break;
case "prov":
$data=array(
"999"=>"-----"
,
"100"=>"北京"
,
"101"=>"辽宁"
);
$show=$data;
break;
}
if($params[op]=='show')
{
foreach($data as $k=>$v)
if($params['value']==$k)
$ret.="$show[$k] ";
}
elseif($params[op]=="select")
{
foreach($data as $k=>$v){
if($params['value']==$k)
$ret.="<option value='$k' selected>$show[$k]</option>";
else
$ret.="<option value='$k'>$show[$k]</option>";
}
}
elseif($params[op]=="radio"){
foreach($data as $k=>$v){
if($params['value']==$k)
$ret.="<input type='radio' value='$k' checked>$show[$k];
else
$ret.="<input type='radio' value='$k'>$show[$k]</option";
}
}
elseif($params[op]=="checkbox"){
foreach($data as $k=>$v)
if($params['value']==$k)
$ret.="<input type='checkbox' value='$k' checked>$show[$k]";
else
$ret.="<input type='checkbox' value='$k'>$show[$k]</option>";
}
return $ret;
return '';
}
?>
tplactive.html
<html>
<head>
<title>{{$webtitle}}</title>
</head>
<body style="font-size:12px">
1.自定义函数,smarty_function_dataop<br>
<table><tr><td>
<select name="prov">
{{dataop value='100' op='select' key='prov'}}
</select>
</td></tr></table>
<br>
<table><tr><td>
{{dataop op='radio' value='100' key='jobpos'}}
</td></tr></table>
<br>
<table><tr><td>
{{dataop op='checkbox' value='100' key='hangye'}}
</td></tr></table>
<br>
</body>
</html>
实例2
编写块函数smarty_block_translate, 用来控制定义的块中的内容等。
<?
function smarty_block_translate ($params, $content, &$smarty, &$repeat)
{
if (isset($content)) {
if($params[lang] == "en"){
$translation = "This is a example for block";
}
else{
$translation = "这是一个block的例子";
}
return $translation;
}
//将该函数注册到{{translate}}......{{/translate}}这个block中
$smarty->register_block('translate', 'smarty_block_translate');
}?>
do_translation.html
<?
{{translate lang='en' key='hr' a="1"}}Hello, world!{{/translate}}
- 扒掉Smarty的裤衩儿
- 扒扒我的微信朋友圈
- 扒的vector
- 套残理员呢?弹簧的游扒
- 扒扒这些年学过的编程语言
- Qt的model中一裤衩函数的总结
- 尴尬的央视大楼(大裤衩) --- 转载
- 转:非常形象的裤衩投资论!KPCB周炜
- 企鹅扒了中移动的内裤
- 【源码】网上随意扒的源码
- 扒光tp后的一些感想
- 扒来的mac快捷键总会
- 扒谱大杂烩-都是前辈写的
- 如何扒出Momentum的背景
- 防止你的代码被扒
- 什么是smarty,Smarty的优点?
- 邮箱扒头像来告诉你怎么写简单的脚本扒图
- 邮箱扒头像来告诉你怎么写简单的脚本扒图
- 手动写DataTable
- smarty中foreach,section循环注意点及include,insert,literal等用法
- JAVA的String和byte[]的关系
- 优化PHP代码的40条建议
- 在CSDN 上拖的图表
- 扒掉Smarty的裤衩儿
- 2007年度感动中国人物颁奖词
- 内生型经济增长
- VS 2005中的强类型名SN
- JSP指令[三]-------Taglib
- 深入剖析JSP和Servlet对中文的处理
- struts的ActionMessages消息机制
- log4net的配置与使用(1)
- C#中String.Format的使用