作用:載入一個php文件,將載入的文件的內容賦值給一個變量
注意:該內建函數只能在2.0中使用,如果使用的話,必須得實例化SmartyBC.class.php
示例代碼:
Index.php
include 'Smarty/SmartyBC.class.php';
//實例化Smarty類
$Smarty = new SmartyBC();
$Smarty->assign('name','小明');
$Smarty->display('index.tpl');
index.tpl
{*include_php內建函數*}
{include_php file="date.php" assign="date"}
{$date}
作用:當Smarty內置的功能不夠使用時,可以通過insert內建函數拓展功能。
基本語法:index.php文件中創建一個
insert_自定義函數名($arg){
echo $arg[模板中定義的變量]
}
Index.tpl文件
{insert name=自定義函數名稱 自定義參數… }
示例代碼:
Index.php
function insert_func($arg){
echo $arg['title'];
}
function insert_date($arg){
echo $arg['say']."今天天氣好棒的說,現在的時間是".date('Y-m-d H:i:s',time());
echo '<br>';
echo $arg['zhangsan']."今天天氣好棒的說,現在的時間是".date('Y-m-d H:i:s',time());
}
index.tpl模板
{insert name="func" title='PHP是世界上最好的語言'}
<hr>
{insert name="date" say='老王說:' zhangsan='哈哈哈:'}
示例代碼:
{if $age >= 18}
此人非未成年
{elseif $age == '14'}
此人14歲
{else}
此人是未成年
{/if}
示例代碼:
<b>在Smarty中我們使用{ldelim}if{rdelim}進行條件判斷</b>
作用:在該標簽中的任何內容都不會受Smarty模板引擎解析
示例代碼:
{literal}
{*嗨,我是一個注釋*}
{assign var='age' value="14"}
{/literal}
運行效果:
作用:在該標簽中可以使用原生的PHP代碼。
示例代碼:
{*PHP內建函數*}
{php}
echo date('Y-m-d h:i:s',time());
echo '<br>';
echo "我在php內建函數中的內容";
{/php}
運行效果:
作用:去除空格符和換行符
示例代碼:
{strip}
<table>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
<td>4</td>
<td>5</td>
</tr>
</table>
{/strip}
使用前:
使用後:
作用:遍歷數組
基本用法:
{section loop=$arr name="index"}
{$arr[index]}
<br>
{/section}
參數詳解:loop 要遍歷數組
Name 當前循環的索引
拓展使用1:使用start step max
{section loop=$arr1 name="index" start="0" step="1" max="5"}
{$arr1[index]}
<br>
{/section}
Step 每次循環增加的數量
Max 最大的循環次數
拓展使用2:sectionelse
作用:判斷循環的數組是否為空,如果為空的話,則執行後面的內容。
實例代碼:
{*section內建函數*}
{section loop=$arr1 name="index" start="0" step="1" max="5"}
{$arr1[index]}
<br>
{sectionelse}
<b>):沒有數組或者數組為空</b>
{/section}
實例代碼:
Index.php
$arr3 = array(array('name'=>'小明','age'=>25,'sex'=>'未知'),
array('name'=>'老王','age'=>26,'sex'=>'男'),
array('name'=>'老李','age'=>27,'sex'=>'你猜')
);
Index.tpl
{section loop=$arr3 name="index" }
{$arr3[index]['name']} |
{$arr3[index]['age']} |
{$arr3[index]['sex']} |
<hr/>
{/section}
運行效果:
拓展內容:
當前索引: {$smarty.section.index.index} ->>
當前索引的前一個:{$smarty.section.index.index_prev}->>
當前索引的下一個:{$smarty.section.index.index_next}->>
當前所循環的次數
{$smarty.section.index.iteration}->>
判斷當前是否第一次: {$smarty.section.index.first}->>
判斷當前是否最後一次:{$smarty.section.index.last}->>
循環的總次數:{$smarty.section.index.total}->>
運行效果:
示例代碼:
{counter start='10' }
<hr>
{counter}
<hr>
{counter print=false}
<hr>
{counter skip=2}
<hr>
{counter}
<hr>
運行效果:
基本語法:{cycle values=參數1,參數2,參數3}
示例代碼:
{*cycle實現各行換色*}
<hr>
<table width="100%">
<tr red,green,yellow"}">
<td>我的第{counter start='1' skip='1'}次循環</td>
</tr>
<tr red,green,yellow"}">
<td>我的第{counter}次循環</td>
</tr>
<tr red,green,yellow"}">
<td>我的第{counter}次循環</td>
</tr>
<tr red,green,yellow"}">
<td>我的第{counter}次循環</td>
</tr>
<tr red,green,yellow"}">
<td>我的第{counter}次循環</td>
</tr>
<tr red,green,yellow"}">
<td>我的第{counter}次循環</td>
</tr>
</table>
{debug}
運行效果:
作用:捕獲一個文件的內容,然後賦值給一個變量
示例代碼:
{fetch file="shi.txt" assign="text"}
{fetch file="date.php" assign="php"}
{*變量調節器
{$text|變量調節器名稱:參數1:參數2}
*}
{$php}
<hr>
{$text|nl2br}
運行效果:
{html_image file="1.jpg"}
參數:file 圖片資源的路徑
運行效果:
作用:生成一個表格,將數據遍歷進去
示例代碼:
{html_table loop=$arr cols="3"}
參數說明:loop 要循環遍歷的數組
Cols 指定表格列數
作用:生成一組多選框
示例代碼:
{html_checkboxes name = 'job'
values = $arr
checked = $arr2
output = $arr3
separator = "|"
}
參數說明: name 對應多選框中的name屬性
Values 對應多選框中你的value屬性
Checked 選中指定的多選框
Output 控制文本內容
Separator 連接符
運行效果:
{待補充}
示例代碼:
<select >
{html_options values = $arr
selected = 'GO'
output = $arr3
}
</select>
參數說明:values 下拉框選項的值
Selected 指定被選中的下拉選項,注意:必須和value的值對應
Output 輸出的文本
示例代碼:
{html_radios values = $arr
checked = 'nodejs'
output = $arr3
separator = "|"
}
參數說明:values 單選框的值
Checked 指定默認被選中的單選框
Output 輸出的文本
Separator 連接符
運行效果:
{待補充}
實例代碼:
{section loop=$arr4 name="index" }
{html_image file="./img/{$arr4[index]}.jpg"}
<hr>
{/section}
SMARTY_DIR
以上變量都有默認行為。
$Smarty->append('var1','小明');
$Smarty->append('var1','25');
$Smarty->append('var1','男');
$Smarty->clearAllAssign(); //清除所有模板變量
$Smarty->clearAssign('title');
$Smarty->configLoad('config.conf','class2');
$Smarty->clearConfig('name');
$Smarty->display('index_3.tpl');
加載模板文件
渲染模板
顯示模板
加載模板文件
渲染(將標簽替換為php代碼)模板文件
我們可以通過fetch實現靜態技術。
Index_3.php文件
/*
* 如果有靜態文件則加載靜態文件,如果沒有靜態生成一個靜態文件。
* */
if(!is_file('./html/index_3.html')){
$html = $Smarty->fetch('index_3.tpl');
file_put_contents('./html/index_3.html',$html);
echo '這裡是沒有靜態文件';
include "./html/index_3.html";
}else{
echo '這裡是有靜態文件';
include "./html/index_3.html";
}
[待補充]
if($Smarty->templateExists('index_4.tpl')){
$Smarty->display('index_3.tpl');
}else{
echo '矮油,模板文件不在哦~';
}
補充:如何在smarty模板中讀取數組,對象。
{*多維數組*}
{$var[0]['name']}
{*一位數組*}
{$var['name']}
{*獲取對象屬性*}
{$std->name}
<hr>
{*獲取對方法*}
{$person->speak()}
Index3.php文件
$std
= new StdClass();
class person{
function __construct(){}
function speak(){
echo '你猜猜我誰?';
}
}
$person = new person();
$std->name = '張二明';
概念:一般在我們項目中,有一部分數據並不是實時更新的,但是,有又必須實時訪問。如果不使用緩存技術的話,每訪問一次,得查詢一次或者多次數據庫,那麼會給數據造成很高的I/O開銷。會增加服務器的壓力。
用戶端緩存原理:
服務器緩存原理:
//開啟緩存
$Smarty->caching = true;
//設置緩存文件的生命周期
$Smarty->cache_lifetime = '7200';
緩存文件由編譯文件而來。
編譯文的內容何時變化?
思路:設置一個生命周期只有30秒的緩存文件,定義一個變量,在模板中使用該變量。然後打開index.php.
然後修改該變量的值。等待。。。30
$Smarty->isCached('index_4.tpl')
//清除所有緩存
$Smarty->clearAllCache();
//清楚某模板緩存文件
$Smarty->clearCache('index_4.tpl');
在Smarty的緩村是全局緩存,如果開啟緩存,訪問整個頁面的數據都會被緩存,如果頁面中有一些動態數據需要修改,如何處理?
如何處理頁面中動態顯示的數據部分呢?
$Smarty->assign('shige','《再別康橋》',true);
{nocache}
{$title}
{/nocache}
如何解決一個模板文件,動態顯示不同的內容。
實際場景:譬如一個電商網站的商品詳細頁,會動態的根據URL上的參數,改變該頁面的內容。
那麼這種情況如何實現緩存呢?
http://localhost:63354/Smarty/Smarty02/index5.php?goods_id=1
http://localhost:63354/Smarty/Smarty02/index5.php?goods_id=2
http://localhost:63354/Smarty/Smarty02/index5.php?goods_id=3
http://localhost:63354/Smarty/Smarty02/index5.php?goods_id=250
在Smarty中,我們通過設置display()第二個參數,來實現,單頁面,多緩存。
http://localhost:63354/Smarty/Smarty02/index5.php?goods_id=1&cate_id=15
http://localhost:63354/Smarty/Smarty02/index5.php?goods_id=1&cate_id=15
http://localhost:63354/Smarty/Smarty02/index5.php?goods_id=1&cate_id=15
http://localhost:63354/Smarty/Smarty02/index5.php?goods_id=1&cate_id=15
我們通過給display()方法設置第二個參數實現緩存集合(通過|分割)
$Smarty->display('index_5.tpl',$_GET['goods_id'].'|'.$_GET['cate_id']);
示例代碼:
//定義一個函數用於字符串替換
function check($tpl_output, $smarty){
$tpl_output = str_replace('蒼井空','張某某',$tpl_output);
return $tpl_output;
}
//通過注冊過濾器,實現模板中的字符串過濾
$Smarty->registerFilter("output","check");
通過模板繼承實現頁面精細化拆分
示例代碼:
Parent.tpl文件
{extends file="parent.tpl"}
{block name='content'}
偶哈呦,哈哈哈哈
<hr>
{/block}
Child.tpl文件
{extends file="parent.tpl"}
{block name='content'}
偶哈呦,哈哈哈哈
<hr>
{/block}