smarty的使用
来源:互联网 发布:广州市软件著作权资助 编辑:程序博客网 时间:2024/05/08 12:40
Smarty是什么{3W}?
Smarty是一个PHP的模板引擎。更明确来说,它可以帮助开发者更好地 分离程序逻辑和页面显示。最好的例子,是当程序员和模板设计师是不同的两个角色的情况,而且 大部分时候都不是同一个人的情况。
举个例子,现在你要制作一个页面来显示新闻内容。
文章内有
$headline
,$tagline
,$author
和$body
等各部分内容, 这些内容没有包括它们如何被显示的信息。 程序将它们传递给Smarty。然后,模板设计师编辑模板,使用HTML标签和 模板标签,来对这些内容进行排版显示, 如表格、DIV、背景颜色、字体大小、样式表、SVG等等。
当有一天,程序员需要改变文章数据内容的获取方式,也就是修改程序逻辑。 那么这个改变不会影响到模板设计师的工作,内容还是会传递到模板。
同样的,如果模板设计师想要完全重新设计模板,也可以做到完全不需要修改程序逻辑。
所以,程序员可以改变程序逻辑,而不需要调整模板页面; 模板设计师也可以修改模板,而不会打断程序逻辑。
业务逻辑和显示逻辑分离,是Smarty的一个设计理念。
这意味着模板可以包含部分仅作为显示用的逻辑代码。 这些显示逻辑如:包含 其他模板,交替设置表格每行的颜色, 把变量转为 大写字母, 循环遍历数组并 显示出来。
Smarty也不是无论如何也强制分离业务和显示逻辑。毕竟Smarty 无法知道谁是谁,所以,会不会把业务逻辑放到模板也是看你怎么处理。
同时,如果你希望在你的模板里没有任何的逻辑代码,你也可以 把模板写成仅剩下文字和变量。
Smarty的一些特性:
非常快速,并发性强。
比PHP内嵌到HTML中的做法要有效率的多。
无模板解析的开销,只编译一次。
仅当模板文件被修改后才会聪明地重新编译。
你可以很容易创建自己的函数 和 变量修饰器,非常具有可扩展性。
可配置的模板定界符语法{delimiter}, 你可以使用
{$foo}
,{{$foo}}
,<!--{$foo}-->
等等。条件判断语句
{if}..{elseif}..{else}..{/if}
会直接使用PHP解析,所以{if...}
后可以是简单或者较复杂的表达式。支持无限的
sections
,if
等的嵌套。内置缓存支持。
任意的模板源。
模板继承 可以轻松管理模板和内容。
插件 架构。
具体在项目中使用时:
·项目必须要包含这些文件: cache、libs(包含smarty这个class,以及调用的一些函数)templates(存放显示的模板页面)templates_c(存放所有执行过的页面的编译文件)
·使用时只需将要处理sql语句和一系列的常规操作写在根目录下的xxx.php页面,而相应的显示和布局则写在templates中的模板页面中,一般默认为:xxx.tpl
代码演示:
----------->xxx.php
#程序员编写:
//1.传递普通变量到模板页
//include 'config.php';//包含smarty系统配置文件(必含)
//$str="这是smarty传过来的数据内容";//定义字符串
//$smarty->assign("title",'这里放标题');//给变量title赋值:'这里放标题'
//$smarty->assign("content",$str);//"content"<==$str
//$smarty->display("index1.tpl");//传值,使用模板显示(把assign的数据传到模板页)
//2.传递一维数组到模板页
//include 'config.php';
//$arr=array('张三','李四','米饭');
//$smarty->assign("stu",$arr);//给变量title赋值:'这里放标题'
//$smarty->display("index2.tpl");
//3.传递二维数组(表格),数组可以从数据库里面提取
include 'config.php';
include 'mysql.php';
$db=mysql::CreateObj('localhost','root','','newsdb','gbk',0);//连接数据库通过mysql这个封装的类
$db->getData('news','*','order by id desc',10);//通过mysql这个类中的方法执行sql语句,并取出相应的数据
$rs=array();//一维数组
while ($row=$db->fetch('')) {
$rs[]=$row;//$rs:一维 --->变成---->$rs[ ] :二维数组
}
//print_r($rs);
$smarty->assign("newsRs",$rs);
$smarty->display("index3.tpl");
//echo mydate();
//4.intsert 函数,让局部不缓存
#函数一般写在目录:./libs/plugins/insert.mydate.php ,smarty_insert_mydate()
#模板页的写法:<{insert name="mydate}>
//5.模板页中的判断if
//session_start();
//$_SESSION['passed']='张三';
////define(PRICE, 1000.00);//定义常量
//include 'config.php';
//$smarty->assign("num",23);
////->display作用,对模板页中所有静态内容直接返回,模板内容运行之后返回(:包含);
//$smarty->display("index_if.tpl");
----------->xxx.tpl
#美工,前台设计人员写的页面(模板页)
//普通变量显示
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gbk">
<title><{$title}></title>
</head>
<body>
美工制作模板页:
<{$title}>
sdgsdfgsdfg,<p>
<{$content}>
sdgsdfgsdfg,<p>
</body>
</html>
//一维数组的显示
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK">
<title>Insert title here</title>
</head>
<body>
<table width='600' border='1'>
<{section loop=$stu name=s}>
<tr><td><{$stu[s]}></td></tr>
<{/section}>
</table>
</body>
</html>
//二维数组(foreach遍历)
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gbk">
<title>Insert title here</title>
</head>
<body>
<table width='700' align="center" border="1">
<{foreach from=$newsRs item=news}>
<tr>
<td><{$news.id}></td>
<td><a href="detail.php?nid=<{$news.id}>"><{$news.title}></a></td>
<td><{$news.2}></td>
<td><{$news.ndate}></td>
<td><{$news.nclicked}></td>
<td><a href="delNews.php?nid=<{$news.id}>">删除</a>||<a href="modNews.php?nid=<{$news.id}>">编辑</a></td>
</tr>
<{foreachelse}>
<tr><td>无数据!</td></tr>
<{/foreach}>
</table>
<a href="addNews.php">发布</a>
<{*模板页里面函数调用(insert所包含的内容不会被缓存):
./libs/plugins/insert.mydate.php*}>
<{insert name="mydate"}>
</body>
</html>
// if else 的显示
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gbk">
<title>Insert title here</title>
</head>
<body>
<{if $num>=100 }>
<{$num}>
<{else }>
num 的值小于100
<{/if }>
<br>=======================<br>
<{*模板页中的 session,调用的PHP页面必须加:session_start();*}>
<{if isset($smarty.session.passed) }>
<{$smarty.session.passed }>,欢迎您!
<{else }>
<a href="#"> 管理入口</a>
<{/if }>
<br>
<{$smarty.const.__FILE__ }>
<br>
================================<br>
PHP代码<br>
1. {$smarty.get.page} {* PHP方式:$_GET["page"] *} <br>
2. {$smarty.post.page} {* PHP方式:$_POST["page"] *} <br>
3. {$smarty.cookies.username} {* PHP方式:$_COOKIE["username"] *}<br>
4. {$smarty.session.id} {* PHP方式:$_SESSION["id"] *} <br>
5. {$smarty.server.SERVER_NAME} {* PHP方式:$_SERVER["SERVER_NAME"] *} <br>
6. {$smarty.env.PATH} {* PHP方式:$_ENV["PATH"]*} <br>
7. {$smarty.request.username} {* PHP方式:$_REQUEST["username"] *} <br>
要在页面中使用{$smarty.session.xx},那么,在前一个页面必须使用session_start();<br>
</body>
</html>
使用时:要注意的是思想,架构的是整个项目,包含页面的传值和处理 ,还有显示的数据。
谨记的是:有处理数据的.php就一定有对应的.tpl页面 若只是处理数据,不需要显示的话就不需要.tpl。思路要理清!
- [PHP]Smarty的使用
- CodeIgniter,smarty的使用
- smarty的使用变量
- smarty变量的使用
- smarty的配置使用
- smarty的基本使用
- smarty的使用
- smarty的配置使用
- Smarty的初步使用
- smarty模板的使用
- 【smarty】smarty保留变量的使用
- 使用自己的Smarty类
- Smarty for java的使用
- PHP的smarty使用心得!
- smarty中section的使用
- smarty的foreach使用详解
- 使用Smarty的简要配置
- smarty中section的使用
- 使用ZendStudio构建一个ZendframeWork的项目-观看韩顺平老师笔记
- CSS 中important的作用
- Ubuntu 插上耳机没有声音解决方法
- 汉诺塔的原理与实现
- 二叉查找树
- smarty的使用
- 乱世文章不值钱
- 关于vs2008上的socket链接错误问题
- [转]关于MYSQL Innodb 锁行还是锁表
- java中字符串编码的转换以及乱码后的处理总结
- Servlet中获取application对象的两种方法
- static的作用
- 优先队列stl 模板
- OpenGL学习笔记(十一)