模板引擎是用于把模板文件和数据内容合并在一起的程序,便于网站开发有利于代码分离和维护,了解一个模板最好知道其工作原理,以便于实现一通万通。
模板文件一般是HTML xml js等类型文件,如果不用模板引擎若要把数据显示在网页上,我们需要在php中输出HTML,而使用模板则只要把数据交给模板引擎程序即可,然后告诉它用哪个模板文件,自然就会把数据和页面结合以后返回或输出,模板至少有以下功能1.把数据提供给模板引擎的功能。2.指定模板的功能。3.输出结果的功能。一般来说为了方便程序员们使用模板引擎,开发者都会把它的功能在一定程度上封装起来,封装成一个类,实例化之后得到一个对象,即模板引擎对象,一个对象有其属性和方法,smarty对象的属性和方法在smarty手册上查找,首先说说其方法,assign 把数据提交给模板的方法。没有单独的指定模板文件的方法已经合并到输出的方法中,输出的方法有两个 display 直接输出 fetch 返回合并好的HTML代码,对于输出我们主要用到的是assign 因为我们显示的数据往往是多样性的,可能是一个量,可能是一个数组量也可能是多维数组,在不同的情况下应该如何正确提交给smarty是一个问题,提交后如何对应显示也是个问题,smarty引擎使用的解释方法是先把HTML文件转化为php文件,然后在赋值各个量,并且执行这个php文件,对应不同的数据格式,它有一套固定的书写方式,需要我们用这种书写方式在模板文件上做对应的标记,smarty默认使用的模板标记符是一对{},比如{$a}这个标记等效于echo $a;在php中我们需要有对应的赋值过程,$smarty->assign("a","值");如果我们有多个量进行赋值,一个个这样写就很麻烦,smarty为我们考虑了这一点,例如我们从数据库里读出一个文章,要显示在页面的内容有标题内容作者时间,数据结构大体是这样的
array([id]=>1,['title']=>"标题",…);
我们的模板需要有几个对应的标记,例如
値を一つ一つ代入するのは面倒、assignメソッドは配列の直接代入をサポート、$rows = データベースから読み込んだデータ、
$smarty->assign($rows);smartyはデータインデックスを取得し、1つずつ自動的に値を割り当てますが、このとき変数の競合を避けるために、値を割り当てたいと考えています。配列の形式で直接 ( など)
$rows = データベースから読み取られたデータ、
$smarty->assign("rows",$rows);
テンプレート内のタグが {$rows} の場合、出力時には phpphp の echo配列と同じように、配列 のみが表示されます。 具体的な出力量はecho $rows['title'];smartyで指定された記号はピリオドです、{$rows.title}、この方法はと似ています echo $rows['title']
各テンプレートには、対応する記述ルールがあります。次に記事のリストを表示したい場合、mysqlが10のデータを返すと仮定します。プログラミングの考え方によれば、結果の計算プロセスは次のようになっていると仮定します。 リーリー これが出力を次のようにしたい場合 まず第一に、これらは複数の量であり、もちろん配列を使用します
リーリー
最初にデータを配列に入れてから、
smartyに一度に渡します。このようにして、list変数には2次元配列が含まれます。すべての値が表示されます。最良の方法は出力をループすることです。また、smartyはループ用のマーカー、sectionとforeachを提供します セクションマークの形式
{セクション名=このループの名前 ループ=
データボリューム名} {/セクション} {セクション名=i ループ=$list}
{/セクション}
上記のコードは for ループによく似ていますが、ここでの iは $i 内の for$i ではなく、単にこのループの名前です, $list[ループ名]この書き方では、毎回配列から数量を取得することができます 先ほども述べたように、$listは2次元配列であり、です。 $list[i] は引き続き配列を取得します。 別の書き方は foreach です 構文は次のとおりです:
{foreach key=index item=value
from=代入変数}
{$key}:{$item}
{/foreach}
{foreach item=v from=$list}
循环list变量每个量赋值到v里,然后从变量v里面指定要显示的索引,除了循环标记外,它还给我们提供了一些常用的语法标记,例如包含文件,条件判断,我们知道HTML不能包含文件,比如网页头部,但smarty提供了{include}的标记,可以像php一样包含文件,例如{include file="文件路径"} 这个标记格式是固定的,而且这个路径必须在模板引擎指定的路径下,而条件判断的语法和php一样是if条件判断,语法如下
{if变量==值或量}
为真时显示的值
{else}
为假是显示的值
{/if}
也可以不写else只有为真时显示的内容,例如常见的一种情况是网页上有一个登陆口登录前显示的是表单登录后显示的是用户信息,假设一个量已经赋值给模板了比如 $username 用户登录这个量就有用户名没有登录这个量就是空的,我们可以这样写
{if $username !=""}
欢迎{$username}
{else}
请先登录
{/if}
我们只要在php把这个变量准备好,并赋值给smarty即可除了这些标记外还有的标记自行参考手册,
其次就是变量调节器了,很多时候我们从数据库中得到的数据,都要小小的处理下才输出的,比如日期格式,只显示年月日即可再如输出的内容里的换行要换成
才能在页面显示对应的样子,这个时候我们可以使用smarty自带的变量调节器,格式如下
{要输出的变量|调节器名:参数}
假如内容部分在显示的时候把所有的换行显示为
只需要如下写法
{$content|nl2br}
日期的格式化可以用date_format 例如手册上
index.php: <span>$smarty</span> = <span>new</span><span> Smarty; </span><span>$smarty</span>->assign('yesterday', <span>strtotime</span>('-1 day'<span>)); </span><span>$smarty</span>->display('index.tpl'<span>); index</span>.tpl:<span> {</span><span>$smarty</span>.now|<span>date_format} {</span><span>$smarty</span>.now|date_format:"%A, %B %e, %Y"<span>} {</span><span>$smarty</span>.now|date_format:"%H:%M:%S"<span>} {</span><span>$yesterday</span>|<span>date_format} {</span><span>$yesterday</span>|date_format:"%A, %B %e, %Y"<span>} {</span><span>$yesterday</span>|date_format:"%H:%M:%S"<span>} OUTPUT</span>:<span> Feb </span>6, 2001<span> Tuesday</span>, February 6, 2001 14:33:00<span> Feb </span>5, 2001<span> Monday</span>, February 5, 2001 14:33:00
实在不行我们可以用php处理好之后再进行赋值。
下面写上配置
<?<span>php </span><span>define</span>("ROOT",<span>str_replace</span>('\\','/',<span>dirname</span>(<span>__FILE__</span>)).'/');<span>//</span><span>定义根路径 //加载smarty类</span> <span>require</span> ROOT.'lib/smarty.class.php'<span>; </span><span>$samrty</span> = <span>new</span> smarty();<span>//</span><span>实例化一个smarty类 //配置各种目录</span> <span>$smarty</span> ->setTemplateDir(ROOT.'templates/'<span>) </span>->setCompileDir(ROOT.'templates_c'<span>) </span>->setPluginsDir(ROOT.'plugins/'<span>) </span>->setCacheDir(ROOT.'cache/'<span>) </span>->setConfigDir(ROOT.'configs/'<span>); </span><span>$smarty</span>->caching = <span>false</span>;<span>//</span><span>是否开启缓存</span> <span>$smarty</span>->left_delimiter = '<{';//<span>设置左右 防止和js css 等发生冲突 </span><span>$smarty</span>->right_delimiter = '}>'<span>; </span>?>