在很多框架是不推薦用smarty的,因為處理太繁瑣,也會影響運行效率。但smarty給我們帶來的開發上的便利,也是顯而易見的,因此整理了一個簡化版的smarty。
1.先在bootstrap里面注冊自己的view控制器
2.在libray里件里加上Smarty.php(文章后面有下載地址)
3.在模塊中應用(我添加了一個名為Api的模塊)
我對模塊做了個小修改,增加了template文件里面放的是模板文件以.html為擴展名(smarty對文件擴展名沒有限制,不用改配置文件)
例子:
index.php
index.html
Smarty文檔
一、資源引用
res標簽
功能:返回當前模塊靜態資源url路徑
實例:{res file=css.css}
include標簽
功能:在當前模板中包含其它模板
實例:{include file=”header.html”}
二、模板變量
assign標簽
例在index.html中賦值變量
模板代碼:
{assign var=”name” value=”Tom”}
Hello,{$name}!
$smarty標簽
實例:$smarty.get $smarty.post $smarty.cookie $smarty.env $smarty.server $smarty.request $smarty.session等
三、變量調節器
default
功能:為變量設置一個默認值,當變量為空或者未分配的時候,將由默認值替代輸出
實例:{$var|default:”no title”}
truncate
功能:字符串截取。從字符串開始處截取某長度的字符。默認會在末尾追加省略號。
實例:{$content|truncate:20}
date
功能:格式化本地時間和日期。
實例:{$var|date:format}
foreach
說明:
foreach 用于處理簡單數組(數組中的元素的類型一致)。
foreach 必須和 /foreach 成對使用,且必須指定 from 和 item 屬性。
foreach 可以嵌套,但必須保證嵌套中的 foreach 名稱唯一。
foreachelse 語句在 from 變量沒有值的時候被執行。
from 屬性:指定被循環的數組,數組長度決定了循環的次數。
item屬性:單個循環項目的變量名,在循環內部使用。
name 屬性為可選屬性,可以任意指定(字母、數字和下劃線的組合)。
key:單個循環的Key值。(這行是ZC加的說明)
name 屬性如果指定,foreach循環體內會自動生成如下變量
$smarty.foreach.foreach_name.index表示本次循環索引,從0開始遞增的整數
$smarty.foreach.foreach_name.iteration表示本次的循環次數,從1開始遞增的整數
$smarty.foreach.foreach_name.first表示是否是第一次循環
$smarty.foreach.foreach_name.last表示是否是最后一次循環
$smarty.foreach.foreach_name.show表示是否有數據
$smarty.foreach.foreach_name.total表示循環總次數,也可在循環體外使用
實例1
模板代碼:
{* 該例將輸出數組 $custid 中的所有元素的值 *}
{foreach from=$custid item=curr_id}
id: {$curr_id}
{/foreach}
輸出結果為:
id: 1000
id: 1001
id: 1002
只整理了些常用的,其實還有很多功能可以查看smrty.php
下載地址:http://www.guodev.cn/wp-content/uploads/2016/08/Api.zip
道框架(framework)那么必須要提到smarty模板,在面試時你可以不會任何的框架,但是如果不會smarty模板,那么面試官會認為你在說謊,因為幾乎所有的框架都是基于或借鑒smarty。
smarty模板介紹
基于面向對象編程思想封裝的類,實現前后臺代碼分離,降低耦合度,并且為后續的分工合作開發做準備。Smarty(輕量,微小)是編譯性模板框架,體積小、速度快,支持緩存、全局站點配置等功能,是“旅行居家”開發必備神器!
使用步驟
1、在官網www.smarty.net 下載最新版,解壓,復制libs文件夾到項目目錄;
2、在對應的項目目錄下創建4個文件夾分別為模板文件夾(保存前臺頁面,必須,一般命名為templates)、編譯(自動整理前后臺頁面,從第二次訪問開始不需要重新重新整合,一般命名為templates_c,compile必須)、配置文件夾(應用于整個站點的配置)、緩存文件夾
3、測試
新建一個后臺頁面index.php
<?php
//引入核心類庫文件
include_once('libs/Smarty.class.php');
//實例化類
$smarty=new Smarty();
//定義配置
//用戶訪問的后臺頁面所有的路徑都是應該以訪問后臺頁面作為參照物!!!
$smarty->setTemplateDir('templates');//定義模板路徑
//定義編譯路徑
$smarty->setCompileDir('templates_c');
//定義配置文件路徑
$smarty->setConfigDir('config');
//定義緩存路徑
$smarty->setCacheDir('cache');
//修改默認定界符避免和JS沖突!!!
$smarty->left_delimiter='<{';
$smarty->right_delimiter='}>';
$test='我是test變量';
$smarty->assign("test",$test);//建議注冊的變量名和鍵保持一致
//注冊一個索引數組
$smarty->assign("arr1",array('a','b','c'));
//注冊一個引用數組,section無法用于引用數組
$smarty->assign("arr2",array("a"=>1,"b"=>2,"c"=>3));
//開啟調測
//$smarty->debugging=true;
//自動整理前后臺頁面
$smarty->display('index.tpl');
$smarty->assign('test1','test1');//這個變量無法使用,想一想為什么?
?>
在templates文件加新建index.tpl文件
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>無標題文檔</title>
</head>
<body>
我是網站根目錄下index.php的前臺index.tpl頁面<br />
輸出后臺變量test的值:<font color="red" style="font-weight:bold;"><{$test}></font>XXXX<br />
該變量無法輸出:<{$test1}><br />
遍歷輸出索引數組:
<{section name=i loop=$arr1}>
索引:<{$smarty.section.i.index}>值:<{$arr1[i]}>
<{sectionelse}>
沒有符合的記錄
<{/section}>
<br />
遍歷引用數組(用foeach,foreach也可以用于索引數組):
<{foreach from=$arr2 item=v key=k}>
鍵:<{$k}>值:<{$v}>
<{foreachelse}>
沒有符合的記錄集
<{/foreach}>
<br />
新版本寫法:
<{foreach $arr2 as $k=>$v}>
鍵:<{$k}>值:<{$v}>
<{/foreach}>
</body>
</html>
訪問后臺頁面!!!!!測試結果
變量解析
后臺注冊,語法 $smarty對象->assign(‘鍵’,mixed 值);
前臺在需要的位置顯示,語法 {$鍵}
開啟調測
$smarty->debugging=true;
編譯原理
smarty模板調用display函數自動整合前后臺頁面,是從templates文件夾下查找前臺地址自動把訪問的后臺php頁面和該前臺頁面替換成內嵌PHP代碼,生成編譯文件,文件名XXX.前臺模板名.tpl.php,第二次訪問自動把這個頁面相應給用戶,加快速度,只要PHP后臺代碼不改變,這個編譯頁面就不會再次生成。
上一節課我們寫好后smarty后臺的使用,這里我們看下那個index.tpl的smarty模板,
index.tpl
<html>
<head>
<title>smarty測試</title>
</head>
<body>
{extends file="./header.tpl"}
{block name="content"}
{foreach $info as $k=>$v}
{$v['name']}-{$v['age']}
{/foreach}
{myDate()}
{myInfo info="zsf"}
{myBlockInfo info="zxx"}塊中數據{/myBlockInfo}
{$name|myModifier:"修飾器"}
{/block}
{block name="footer" append}
聯系我
{/block}
</body>
</html>
header.tpl
<h1>我是通用頭部</h1>
{block name="content"}
{/block}
{block name="footer"}
<h1>我是底部</h1>
{/block}
在index.tpl中,我們使用smarty引擎自帶的方法 extends 來引入header.tpl,如果我們某個模板在其他模板中都需要使用,可以使用這個方法,比如網站公用的頂部導航或者公用的底部。通過 block 方法和name 屬性來定義一個區塊,在header.tpl中我們定義了兩個block,一個叫content,一個叫footer,我們在子模板index.tpl中重新定義了相同的名稱的塊來更改父級模板中相應塊中的內容。我們可以在子模板中使用塊時,添加append屬性,表示子模塊里的內容會在父級模板中相應塊的內容進行拼接而不是完全替換。
我們在index.tpl中使用php的foreach的方法來訪問并輸出了info數組中的內容。可以看到這里和在php中的使用完全相同。同樣功能的還有smarty提供的section方法,大家可以看下smarty手冊來試一下。
{$name|myModifier:"修飾器"}這里我們訪問到了后臺傳過來的name的值,模板中訪問php傳過來的模板中,就和在php中使用一樣,添加一個$符,這個后面的|表示修飾器,表示對這個變量進行某些處理輸出,smarty有很多自定義的修飾器,在這里我們是使用的自定義的修飾器,這個修飾器是在我們上一節課中自定義的smarty.php中定義的:
// 修飾器
function modifierInfo($str,$params){
return $str."===".$params;
}
$smarty->registerPlugin("modifier","myModifier","modifierInfo");
還有我們自定義的塊,
{myBlockInfo info="zxx"}塊中數據{/myBlockInfo}
// 塊函數
function blockInfo($info,$content,$s){
return $info['info']."------------".$content;
}
$smarty->registerPlugin("block","myBlockInfo","blockInfo");
自定義的方法
{myInfo info="zsf"}
// 普通函數
function detailInfo($info){
return "this is ".$info['info'];
}
$smarty->registerPlugin("function","myInfo","detailInfo");
注:
registerPlugin是一個smarty自定義的方法,可以用來自定義塊,函數,修飾器,使用第一個參數來進行區分,block表示定義的塊,modifier表示定義的修飾器,function表示定義的函數。第二個參數是我們在模板中使用自定義的塊(函數或修飾器)是的變量名,最后一個字符串,是我們在后臺自定義的方法,表示具體的處理邏輯,返回某些數據,這些數據會在模板中進行替換!
*請認真填寫需求信息,我們會在24小時內與您取得聯系。