程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> Smarty模板引擎技術二,smarty模板引擎

Smarty模板引擎技術二,smarty模板引擎

編輯:關於PHP編程

Smarty模板引擎技術二,smarty模板引擎


Smarty模板引擎技術

作用:載入一個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}

運行效果:

 

7、strip內建函數

作用:去除空格符和換行符

示例代碼:

{strip}
<table>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
<td>4</td>
<td>5</td>
</tr>
</table>
{/strip}

使用前:

 

 

 

 

 

 

使用後:

8、section、sectionelse內建函數(二維數組,)

作用:遍歷數組

基本用法:

{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}

  • 參數詳解:start    循環的起始索引

         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    輸出的文本

9、html_radios自定義函數

示例代碼:

{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

  • $template_dir        模板目錄    默認是:templates
  • $compile_dir        編譯目錄    默認是:templates_c
  • $config_dir        配置目錄    默認:configs
  • $cache_dir        緩存目錄    默認:cache
  • $left_delimiter    左定界符    默認:{
  • $right_delimiter    右定界符    默認:}

 

以上變量都有默認行為。

  • $caching            是否開啟緩存
  • $cache_lifetime    緩存的生命周期:默認3600s
  • $debugging        開啟調試模板
  • $php_handling    是否允許在模板中引入php

3、常用方法

  • assign 向模板中傳遞變量
  • assignByRef    分配變量到模板文件(按引用傳遞)
  • append         追加變量

$Smarty->append('var1','小明');
$Smarty->append('var1','25');
$Smarty->append('var1','男
');

  • appendByRef追加不同的數據到模板的數組變量中(按引用傳遞)
  • clearAllAssign     清除模板中所有變量

$Smarty->clearAllAssign(); //清除所有模板變量

  • clearAssign 清除指定的變量

$Smarty->clearAssign('title');

  • clearCache     清除緩存
  • configLoad     配置加載

$Smarty->configLoad('config.conf','class2');

  • clearConfig    清除配置內容

$Smarty->clearConfig('name');

  • display        指定渲染模板

$Smarty->display('index_3.tpl');

加載模板文件

渲染模板

顯示模板

  • fetch        捕獲模板但是不輸出

 

加載模板文件

渲染(將標簽替換為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";
}

[待補充]

  • templateExists 判斷模板文件是否存在    

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緩存相關細節

$Smarty->isCached('index_4.tpl')
				

  • 基本語法:isCached(templatesName); 檢測模板文件的緩村文件是否存在
  • 參數說明:模板文件名稱

//清除所有緩存
$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()第二個參數,來實現,單頁面,多緩存。

11、緩存集合

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}

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved