小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

PHP核心之模板引擎Smarty

 印度阿三17 2020-12-22

Smarty

Smarty簡介

  • 概念
    • 為了分工合作,模板頁面中最好不要出現(xiàn)PHP的代碼
    • 需要將表現(xiàn)和內(nèi)容相分離

官方Smarty

  • 概念

    • Smarty是用PHP編寫的優(yōu)秀的模板引擎
    • Smarty可以實現(xiàn)前端開發(fā)人員和后臺程序員分離
    • 采用Smarty編寫的程序可以獲得最大速度的提高
    • 需要實時更新的內(nèi)容和小項目不適合使用Smarty
  • 官方地址

    • www.smarty.net
  • Smarty常用屬性

    • public $left_delimiter = "{"; 左界定
    • public $right_delimiter = "}"; 右界定
    • protected $template_dir = array('./templates/'); 默認(rèn)模板目錄
    • protected $compile_dir = './templates_c/'; 默認(rèn)混編目錄
    • protected $config_dir = array('./configs/'); 默認(rèn)配置目錄
    • protected $cache_dir = './cache/'; 默認(rèn)緩存目錄
  • Smarty常用方法

    • public function setTemplateDir(){} 設(shè)置模板文件夾
    • public function setConfigDir(){} 設(shè)置配置文件夾
    • public function setCompileDir(){} 設(shè)置混編文件夾
    • public function setCacheDir(){} 設(shè)置緩存文件夾
  • 小試牛刀

    • 將libs目錄拷貝到站點(diǎn)下,改名為Smarty
    • 創(chuàng)建模板目錄templates,目錄下新建index.html
    • 創(chuàng)建混編目錄templates_c
    • 在站點(diǎn)下創(chuàng)建文件index.php
<?php
require './Smarty/Smarty.class.php';
$smarty=new Smarty();
$smarty->assign('title','鋤禾日當(dāng)午');
$smarty->left_delimiter='{{';//更改左界定
$smarty->right_delimiter='}}';//更改右界定
$smarty->setTemplateDir('./templates/');//設(shè)置模板目錄
$smarty->setCompileDir('./templates_c/');//設(shè)置混編目錄
$smarty->display('index.html');
?>
# index.html
<body>
{{$title}}
</body>

Smarty演化

演化一:Smarty生成混編文件

  • html文件
# index.html
<body>
    {$title}
</body>
  • php文件
# index.php
<?php
$title= 'Smarty';
$str=file_get_contents('./index.html');
$str=str_replace('{','<?php echo ',$str);    //替換左大括號
$str=str_replace('}',';?>',$str);    //替換右大括號
file_put_contents('./index.html.php', $str);//寫入混編文件
require './index.html.php';//包含混編文件
?>
  • 生成文件
# index.html.php
<body>
    <?php echo $title;?>
</body>
  • 相當(dāng)于代碼
<?php
    $title= 'Smarty';
?>
<body>
    <?php echo $title;?>
</body>

演化二:Smarty封裝

  • 概念
    • 由于每個頁面都要替換定界符,所以需要將替換定界符的代碼封裝起來
    • 由于封裝在類中,所有訪問的方法需要通過面向?qū)ο蟮姆绞絹碓L問
    • 需要將外部的變量賦值到對象的內(nèi)部
    • 要通過面向?qū)ο蟮姆绞皆L問
# Smarty.class.php
<?php
class Smarty{
private $tpl_var=array();
//賦值
public function assign($k,$v){
$this->tpl_var[$k]=$v;
}
/*
*作用:編譯模板
*@param $tpl string 模板的路徑
*/
public function compile($tpl){
$com_file=$tpl.'.php';                                //混編文件地址
$str=file_get_contents($tpl);
$str=str_replace('{$','<?php echo $this->tpl_var[\'',$str);//替換左大括號
$str=str_replace('}','\'];?>',$str);            //替換右大括號
file_put_contents($com_file, $str);                        //寫入混編文件
require $com_file;                                        //包含混編文件
}
}
?>
# index.html
<body>
    {$title}
</body>
# index.php
<?php
require './Smarty.class.php';
$smarty=new Smarty();
$smarty->assign('title','我的祖國');
$smarty->compile('./index.html');
?>

演化三:有條件的生成混編文件

  • 概念
    • 混編文件存在并且是最新的就直接包含,否則就重新生成
    • 板文件修改時間 < 混編文件修改時間 => 混編文件是最新的
# Smarty.class.php
<?php
class Smarty{
private $tpl_var=array();
//賦值
public function assign($k,$v){
$this->tpl_var[$k]=$v;
}
/*
*作用:編譯模板
*@param $tpl string 模板的路徑
*/
public function compile($tpl){
        $com_file=$tpl.'.php';      //混編文件地址
        //文件存在,并且模板文件修改時間<混編文件修改時間
if(file_exists($com_file) && filemtime($tpl)<filemtime($com_file))
            require $com_file;
        else{
            $str= file_get_contents($tpl);
            $str= str_replace('{$','<?php echo $this->tpl_var[\'',$str);//替換左大括號
            $str= str_replace('}','\'];?>',$str);                //替換右大括號
            file_put_contents($com_file, $str);                            //寫入混編文件
            require $com_file;                                            //包含混編文件
        }                                       
}
}
?>

演化四:文件分類存放

  • 目錄
    • 模板文件:view
    • 混編文件:viewc
    • Smarty文件:smarty.class.php
# Smarty.class.php
<?php
class Smarty{
public $template_dir='./templates/';//默認(rèn)模板目錄
public $templatec_dir='./templates_c/';//默認(rèn)混編目錄

private $tpl_var=array();
//賦值
public function assign($k,$v){
$this->tpl_var[$k]=$v;
}
/*
*作用:編譯模板
*@param $tpl string 模板的名字
*/
public function compile($tpl){
$tpl_file=$this->template_dir.$tpl;//拼接模板地址
$com_file=$this->templatec_dir.$tpl.'.php';//混編文件地址
//文件存在,并且模板文件修改時間<混編文件修改時間
if(file_exists($com_file) && filemtime($tpl_file)<filemtime($com_file))
require $com_file;
else{
$str=file_get_contents($tpl_file);
$str=str_replace('{$','<?php echo $this->tpl_var[\'',$str);//替換左大括號
$str=str_replace('}','\'];?>',$str);//替換右大括號
file_put_contents($com_file, $str);//寫入混編文件
require $com_file;//包含混編文件
}
}
}
?>
# index.php
<?php
require './Smarty/Smarty.class.php';
$smarty=new Smarty();
$smarty->template_dir='./view/';//更改模板目錄
$smarty->templatec_dir='./viewc/';//更改混編目錄
$smarty->assign('title','Sunny');
$smarty->compile('index.html');
?>

演化五:封裝編譯方法

  • 概念
    • 編譯的方法是smarty的核心方法
    • 核心方法一般是不可以直接調(diào)用,需要進(jìn)行二次封裝
# Smarty.class.php
<?php
class Smarty{
public $template_dir='./templates/';//默認(rèn)模板目錄
public $templatec_dir='./templates_c/';//默認(rèn)混編目錄

private $tpl_var=array();
//賦值
public function assign($k,$v){
$this->tpl_var[$k]=$v;
}
public function display($tpl){
require $this->compile($tpl);
}
/*
*作用:編譯模板
*@param $tpl string 模板的名字
*/
private function compile($tpl){
$tpl_file=$this->template_dir.$tpl;//拼接模板地址
$com_file=$this->templatec_dir.$tpl.'.php';//混編文件地址
//文件存在,并且模板文件修改時間<混編文件修改時間
if(file_exists($com_file) && filemtime($tpl_file)<filemtime($com_file))
return $com_file;
else{
$str=file_get_contents($tpl_file);
$str=str_replace('{$','<?php echo $this->tpl_var[\'',$str);//替換左大括號
$str=str_replace('}','\'];?>',$str);//替換右大括號
file_put_contents($com_file, $str);//寫入混編文件
return $com_file;//包含混編文件
}
}
}
?>
# index.php
<?php
require './Smarty/Smarty.class.php';
$smarty=new Smarty();
$smarty->template_dir='./view/';//更改模板目錄
$smarty->templatec_dir='./viewc/';//更改混編目錄
$smarty->assign('title','Sunny');
$smarty->display('index.html');
?>

Smarty注釋

  • 語法

    • {* *}
  • 說明

    • smarty注釋在源碼中看不見
    • 若smarty的定界符是{* *},則它的注釋是{** **}

Smarty變量

  • 概念
    • Smarty中變量有三種,普通變量、配置變量、保留變量

普通變量

  • 概念
    • 普通變量就是自定義變量
    • 自定義變量可以在PHP中定義
      • $smarty->assign('key','value');
    • 自定義變量可以在模板中定義
      • {assign var='變量名' value='值'}
    • 自定義變量的簡化寫法
      • {$key='value'}
# index.php
<?php
require './Smarty/Smarty.class.php';
$smarty=new Smarty();
$smarty->assign('name','Sunny');
$smarty->left_delimiter='{{';//更改左界定
$smarty->right_delimiter='}}';//更改右界定
$smarty->setTemplateDir('./templates/');//設(shè)置模板目錄
$smarty->setCompileDir('./templates_c/');//設(shè)置混編目錄
$smarty->display('index.html');
?>
# index.html
<body>
姓名:{{$name}}<br>

{{assign var='age' value='28'}}
年齡:{{$age}}<br>

{{$grade='高三8班'}}
班級:{{$grade}}<br>
</body>

保留變量

  • 概念

    • Smarty中有一個特殊的保留變量(內(nèi)置變量)
    • 類似于PHP中的所有的超全局變量、常量、時間等信息
  • 內(nèi)置變量

    • {$smarty.get.name} 獲取get提交的name的值
    • {$smarty.post.name} 獲取post提交的name的值
    • {$smarty.request.name} 獲取get和post提交的name的值
    • {$smarty.cookies.name} 獲取cookie中的name的值
    • {$smarty.session.name} 獲取session中的name的值
    • {$smarty.const.name} 獲取常量定義的name值
    • {$smarty.server.DOCUMENT_ROOT} 獲取服務(wù)器的虛擬根目錄地址
    • {$smarty.config.name} 獲取配置文件中的值
    • {$smarty.now} 時間戳
    • {$smarty.ldelim} 獲取左界定
    • {$smarty.rdelim} 獲取右界定
# index.php
<?php
require './Smarty/Smarty.class.php';
$smarty=new Smarty();
define('name','define value');
setcookie('name','cookie value');
$_SESSION['name']='session value';
$_POST['name']='post value';
$_GET['name']='get value';
$_REQUEST['name']='request value';
$smarty->left_delimiter='{';//更改左界定
$smarty->right_delimiter='}';//更改右界定
$smarty->setTemplateDir('./templates/');//設(shè)置模板目錄
$smarty->setCompileDir('./templates_c/');//設(shè)置混編目錄
$smarty->display('index.html');
?>
# index.html
<body>
get提交:{$smarty.get.name}<br>
post提交:{$smarty.post.name}<br>
request提交:{$smarty.request.name}<br>
常量:{$smarty.const.name}<br>
cookie的值:{$smarty.cookies.name}<br>
session的值:{$smarty.session.name}<br>
時間戳:{$smarty.now}<br>
版本號:{$smarty.version}<br>
根目錄:{$smarty.server.DOCUMENT_ROOT}<br>
左界定:{$smarty.ldelim}<br>
右界定:{$smarty.rdelim}<br>
</body>

配置變量

  • 概念

    • 從配置文件中獲取變量值,配置文件默認(rèn)的文件夾是configs
  • 流程

    • 在站點(diǎn)下創(chuàng)建配置文件夾configs
    • configs目錄下創(chuàng)建smarty.conf文件
    • index.php PHP配置頁面
    • index.html 視圖頁面
# smarty.conf
color= '#21f4b1';
size='15px';
# index.php
<?php
require './Smarty/Smarty.class.php';
$smarty=new Smarty();
$smarty->display('index.html');
?>
# index.html
{config_load file='smarty.conf'}   <!--引入配置文件-->
<style>
body{
color:{$smarty.config.color};
font-size: {#size#}
}
</style>
<body>
<span>測試文本</span>
</body>
  • 關(guān)于配置文件
    • 要使用配置文件中的值,首先必須引入配置文件,通過{config_load}標(biāo)簽引入
    • 獲取配置文件中值的方法有兩種
      • {#變量名#}
      • {$smarty.config.變量名}
    • 配置文件中的節(jié)
      • 在配置文件中,[ ]表示配置文件的段落
    • 配置文件說明
      • 全局的一定要寫在節(jié)的前面
      • 配置文件中[ ]表示節(jié)
      • 配置文件中的注釋是 #
      • 通過section引入配置文件中的段落
# smarty.conf
color= #1e6bec;
size=32px;

[spring]# 配置文件中的段落
color=#9cec1e;
size=24px;

[winter]
color=#ec1ee5;
size=56px;
# index.html
{config_load file='smarty.conf'  section='winter'}   <!--引入配置文件-->
<style>
body{
color:{$smarty.config.color};
font-size: {#size#}
}
</style>
<body>
<span>測試文本</span>
</body>

smarty運(yùn)算符

  • 概念

    • Smary中的運(yùn)算符和PHP是一樣的
    • 除此以外,Smarty還支持如下的運(yùn)算符
  • 運(yùn)算符

    • eq 相等(equal)
    • neq 不等于(not equal)
    • gt 大于(greater than)
    • lt 小于(less than)
    • lte 小于等于(less than or equal)
    • gte 大于等于(great than or equal)
    • is even 是偶數(shù)
    • is odd 是奇數(shù)
    • is not even 不是偶數(shù)
    • is not odd 不是奇數(shù)
    • not
    • mod 求模取余
    • div by 被整除
    • is [not] div by 能否被某數(shù)整除
      • {if $smarty.get.age is div by 3}...{/if}
    • is [not] even by 商的結(jié)果是否為偶數(shù)
    • is [not] odd by 商的結(jié)果是否為奇數(shù)

判斷

  • 概念

    • 在判斷中是可以使用PHP函數(shù)的
  • 語法

    • {if 條件}
    • {elseif 條件}
    • {else}
    • {/if}
# index.php
<?php
require './Smarty/Smarty.class.php';
$smarty=new Smarty();
$smarty->display('index.html');
?>
# index.html
{config_load file='smarty.conf'  section='winter'}   <!--引入配置文件-->
<style>
body{
color:{$smarty.config.color};
font-size: {#size#}
}
</style>
<body>
{if is_numeric($smarty.get.score)}
{if $smarty.get.score gte 90}
<span>A</span>
{elseif  $smarty.get.score gte 80}
<span>B</span>
{elseif  $smarty.get.score gte 70}
<span>C</span>
{elseif  $smarty.get.score gte 60}
<span>D</span>
{elseif  $smarty.get.score lt 60}
<span>E</span>
{/if}
{else}
<span>不是數(shù)字</span>
{/if}
<hr>
{if is_numeric($smarty.get.score)}
{if $smarty.get.score is even}
<span>是偶數(shù)</span>
{elseif $smarty.get.score is odd}
<span>是奇數(shù)</span>
{/if}
{/if}
</body>

數(shù)組

  • 概念
    • Smarty中訪問數(shù)組的方式有兩種
      • 數(shù)組[下標(biāo)]
      • 數(shù)組.下標(biāo)
# index.php
<?php
require './Smarty/Smarty.class.php';
$smarty=new Smarty();
$stu= array('Sunny', 'Jerry');
$emp= array('name'=>'Marry', 'sex'=>'girl');
$goods= array(
    array('name'=>'ceilphone','price'=>2560),
    array('name'=>'notebook','price'=>3600)
);
$smarty->assign('stu',$stu);
$smarty->assign('emp',$emp);
$smarty->assign('goods',$goods);
$smarty->display('index.html');
?>
# index.html
{config_load file='smarty.conf'}   <!--引入配置文件-->
<style>
body{
color:{$smarty.config.color};
font-size: {#size#}
}
</style>
<body>
<div>學(xué)生:{$stu[0]}  {$stu[1]}</div>
<div>雇員:{$emp['name']}  {$emp.sex}</div>
<div>商品:</div>
<ul>
<li>{$goods[0]['name']}</li>
<li>{$goods[0].price}</li>
<li>{$goods[1]['name']}</li>
<li>{$goods[1].price}</li>
</ul>
</body>

循環(huán)

  • 概念
    • Smarty中支持的循環(huán)有:{for} {while} {foreach} {section}
    • 對于開發(fā)來說用的最多就是{foreach}循環(huán)

for循環(huán)

  • 語法
    • {for 初始值 to 結(jié)束值 [step 步長]} {/for}
    • 默認(rèn)步長是1
# index.html
<body>
{for $i=0 to 10 step 2}
<div>一江春水向東流</div>
{/for}
</body>

while循環(huán)

  • 語法
    • {while 條件} {/while}
# index.html
<body>
{$i=0}
{while $i<5 }
<div>{$i  } 一江春水向東流</div>
{/while}
</body>

foreach

  • 概念

    • 既能遍歷關(guān)聯(lián)數(shù)組也能遍歷索引數(shù)組
  • 語法

    • {foreach 數(shù)組 as $k=>$v}
    • {foreachelse}
    • {/foreach}
  • foreach的屬性

    • @index 從0開始的索引
    • @iteration 從1開始的編號
    • @first 是否是第一個元素
    • @last 是否是最后一個元素
# index.php
<?php
require './Smarty/Smarty.class.php';
$smarty=new Smarty();
$stu= array(
    'first'=>'Sunny',
    'second'=>'Jerry',
    'third'=>'Marry',
    'forth'=>'Tommy'
);
$smarty->assign('stu',$stu);
$smarty->display('index.html');
?>
# index.html
<body>
<table border='1' bordercolor='#000' width='780'>
<tr>
<th>是否是第一個元素</th>
<th>索引</th>
<th>編號</th>
<th>鍵</th>
<th>值</th>
<th>是否是最后一個元素</th>
</tr>
{foreach $stu as $k=>$v}
<tr>
<td>
{if $v@first==1}
<span>是第一個元素</span>
{/if}
</td>
<td>{$v@index}</td>
<td>{$v@iteration}</td>
<td>{$k}</td>
<td>{$v}</td>
<td>
{if $v@last==1}
<span>是最后一個元素</span>
{/if}
</td>
</tr>
{foreachelse}
沒有輸出
{/foreach}
</table>
</body>

section

  • 概念

    • section不支持關(guān)聯(lián)數(shù)組,只能遍歷索引數(shù)組
  • 語法

    • {section name=自定義名字 loop=數(shù)組} {/section}
# index.php
<?php
require './Smarty/Smarty.class.php';
$smarty=new Smarty();
$stu= array('Sunny','Jerry','Marry','Tommy');
$smarty->assign('stu',$stu);
$smarty->display('index.html');
?>
# index.html
<body>
<table border='1' bordercolor='#000' width='780'>
<tr>
<th>是否是第一個元素</th>
<th>索引</th>
<th>編號</th>
<th>值</th>
<th>是否是最后一個元素</th>
</tr>
{section name=s loop=$stu}
<tr>
<td>{if $smarty.section.s.first ==1}是第一個元素{/if}</td>
<td>{$smarty.section.s.index}</td>
<td>{$smarty.section.s.iteration}</td>
<td>{$stu[s]}</td>
<td>{if $smarty.section.s.last==1}是最后一個元素{/if}</td>
</tr>
{sectionelse}
沒有輸出
{/section}
</table>
</body>

函數(shù)

  • 概念
    • Smarty的內(nèi)置函數(shù)就是封裝的PHP的關(guān)鍵字
    • 函數(shù)有兩種,自定義函數(shù)和內(nèi)置函數(shù)

內(nèi)置函數(shù)

  • {$var=...} 變量賦值

    • 這是{assign}函數(shù)的簡寫版
    • 你可以直接賦值給模版,也可以為數(shù)組元素賦值
  • {assign} 賦值

    • 用來在模板運(yùn)行時為模板變量賦值
  • {while} 循環(huán)

    • Smarty的{while}循環(huán)與php的while語句一樣富有彈性
  • {for} 循環(huán)

    • {for}、{forelse}標(biāo)簽用來創(chuàng)建一個簡單循環(huán)
  • {foreach} 遍歷

    • {foreach}與{section}循環(huán)相比更簡單、語法更干凈
    • 也可以用來遍歷關(guān)聯(lián)數(shù)組
  • {section} 遍歷數(shù)組

    • 支持循序索引遍歷數(shù)組中的數(shù)據(jù)(支持一次性讀取多維數(shù)組)
  • {function} 函數(shù)

    • 用來在模板中創(chuàng)建函數(shù),可以像調(diào)用插件函數(shù)一樣調(diào)用它們
  • {if} 條件

    • Smarty的{if}語句與php的if語句一樣富有彈性
  • {include} 包含

    • {include}標(biāo)簽用于在當(dāng)前模板中包含其它模板
  • {nocache} 禁止緩存

    • {nocache}用來禁止模版塊緩存

變量修飾器

變量修飾器

  • 概念
    • 變量修飾器的本質(zhì)就是PHP函數(shù),用來轉(zhuǎn)換數(shù)據(jù)
    • 將PHP的關(guān)鍵字或函數(shù)封裝成標(biāo)簽稱為函數(shù)
    • 將PHP關(guān)鍵字封裝成smarty關(guān)鍵字稱為修飾器
    • 內(nèi)部的本質(zhì)都是PHP函數(shù)或PHP關(guān)鍵字
    • |稱為管道運(yùn)算符,將前面的參數(shù)傳遞后后面的修飾器使用
# index.php
<body>
轉(zhuǎn)成大寫:{'abc'|upper} <br>
轉(zhuǎn)成小寫:{'ABC'|lower} <br>
默認(rèn)值:{$add|default:'地址不詳'}<br>
去除標(biāo)簽:{'<b>你好嗎</b>'|strip_tags}<br>
實體轉(zhuǎn)換:{'<b>你好嗎</b>'|escape}<br>
日期:{$smarty.now|date_format:'%Y-%m-%d %H:%M:%S'}<br>
多個管道連續(xù)使用:{'<b>boy</b>'|strip_tags|upper}<br>
</body>

自定義變量修飾器

  • 概念

    • 變量修飾器存放在plugins目錄中
  • 規(guī)則

    • 文件的命名規(guī)則:modifier.變量修飾器名稱.php
    • 文件內(nèi)方法命名規(guī)則:smarty_modifier_變量修飾器名稱(形參...){}
  • 例題

    • 在plugins目錄中創(chuàng)建modifier.cal.php頁面
    • 在模板中調(diào)用
      • 10作為第一個參數(shù)傳遞
      • 參數(shù)之間用冒號分隔
# modifier.cal.php
<?php
function smarty_modifier_cal($num1,$num2,$num3){
return $num1 $num2 $num3;
}
?>
# index.html
{10|cal:20:30}

避免Smarty解析

  • 概念

    • Smarty的定界符和css、js中的大括號產(chǎn)生沖突的時候
    • css、js中的大括號不要被Smarty解析
  • 方法

    • 更換定界符
    • 左大括號后面添加空白字符
    • {literal} {/literal}
      • smarty不解析{literal} {/literal}中的內(nèi)容
# index.html
<style>
{literal}
body{color: #FF0000;}
{/literal}
</style>

緩存

  • 概念
    • 緩存一般包括頁面緩存、空間緩存、數(shù)據(jù)緩存
    • smarty的緩存是頁面緩存

開啟緩存

  • 開啟緩存
    • $smarty->caching=true|1;

緩存的更新

  • 方法
    • 刪除緩存,系統(tǒng)會重新生成新的緩存文件
    • 更新了模板文件,配置文件,緩存自動更新
    • 過了緩存的生命周期,默認(rèn)是3600秒
    • 強(qiáng)制更新
# index.php
<?php
require './Smarty/smarty.class.php';
$smarty=new Smarty();
$smarty->caching=true;//開啟緩存
if(date('H')>=9)
$smarty->force_cache=true;//強(qiáng)制更新緩存
$smarty->display('index.html');
?>

緩存的生命周期

  • 語法
    • $smarty->cache_lifetime=-1 | 0 | N
      • -1:永遠(yuǎn)不過期
      • 0:立即過期
      • N:有效期是N秒,默認(rèn)是3600秒
$smarty->cache_lifetime=3;//緩存的生命周期

局部不緩存

  • 不緩存的方法
    • 變量不緩存 {$變量名 nocache}
    • 整個塊不緩存 {nocache} {/nocache}
{$smarty.now nocache}
{nocache}
{$smarty.now}
{/nocache}

緩存分頁

  • 概念

    • 通過識別id來緩存分頁、集合
  • 語法

    • $smarty->display(模板,識別id)
# index.php
<?php
require './Smarty/smarty.class.php';
$smarty=new Smarty();
$smarty->caching=1;
$smarty->display('index.html',$_GET['pageno']);
?>
# index.html
<body>
這是第{$smarty.get.pageno}頁
</body>

緩存集合

  • 概念
    • 每個組合都會產(chǎn)生緩存
# index.php
<?php
require './Smarty/smarty.class.php';
$smarty=new Smarty();
$smarty->caching=1;
$color=$_GET['color'];
$size=$_GET['size'];
$smarty->display('7-demo.html',"$color|$size");
?>
# index.html
<body>
顏色:{$smarty.get.color}<br>
大?。簕$smarty.get.size}<br>
</body>

清除緩存

  • 語法
    • $smarty->clearCache(模板,[識別id]) 清除緩存
    • $smarty->clearAllCache(); 清除所有緩存
# index.php
<?php
require './Smarty/smarty.class.php';
$smarty=new Smarty();
//$smarty->clearCache('7-demo.html',1);
//$smarty->clearCache('7-demo.html','red|10');
//$smarty->clearCache('7-demo.html');
$smarty->clearAllCache();//清除所有緩存
?>

將smarty集成到項目中

  • 流程
    • 將smarty拷貝到Lib目錄下
    • 實現(xiàn)smarty類的自動加載
    • 創(chuàng)建混編目錄,并且定義混編目錄地址
      • Viewc 為混編目錄
    • 由于前后臺都要啟動模板,所以應(yīng)該在基礎(chǔ)控制器中實例化smarty
    • 在控制器中使用smarty
    • 在模板中更改
# Framework/Core/Framework.class.php
private static function initRoutes(){
$p=$_GET['p']??$GLOBALS['config']['app']['dp'];
$c=$_GET['c']??$GLOBALS['config']['app']['dc'];
$a=$_GET['a']??$GLOBALS['config']['app']['da'];
$p=ucfirst(strtolower($p));
$c=ucfirst(strtolower($c));//首字母大寫
$a=strtolower($a);//轉(zhuǎn)成小寫
define('PLATFROM_NAME', $p);    //平臺名常量
define('CONTROLLER_NAME', $c);  //控制器名常量
define('ACTION_NAME', $a);      //方法名常量
define('__URL__', CONTROLLER_PATH.$p.DS);   //當(dāng)前請求控制器的目錄地址
define('__VIEW__',VIEW_PATH.$p.DS);     //當(dāng)前視圖的目錄地址
define('__VIEWC__', APP_PATH.'Viewc'.DS.$p.DS); //混編目錄
}
private static function initAutoLoad(){
spl_autoload_register(function($class_name){
//Smarty類存儲不規(guī)則,所以將類名和地址做一個映射
$map=array(
'Smarty' => LIB_PATH.'Smarty'.DS.'Smarty.class.php'
);
$namespace= dirname($class_name);   //命名空間
$class_name= basename($class_name); //類名
if(in_array($namespace, array('Core','Lib')))   //命名空間在Core和Lib下
$path= FRAMEWORK_PATH.$namespace.DS.$class_name.'.class.php';
elseif($namespace=='Model')     //文件在Model下
$path=MODEL_PATH.$class_name.'.class.php';
elseif($namespace=='Traits')    //文件在Traits下
$path=TRAITS_PATH.$class_name.'.class.php';
elseif(isset($map[$class_name]))
$path=$map[$class_name];
else   //控制器
$path=CONTROLLER_PATH.PLATFROM_NAME.DS.$class_name.'.class.php'; 
// $path=__URL__.$class_name.'.class.php';
if(file_exists($path) && is_file($path))
require $path;
});
}
# Framework/Core/Controller.class.php
<?php
//基礎(chǔ)控制器
namespace Core;
class Controller{
    protected $smarty;
    use \Traits\Jump;
    
    public function __construct() {
        $this->initSession();
        $this->initSmarty();
    }
    //初始化session
    private function initSession(){
        new \Lib\Session();
    }
    //初始化Smarty
    private function initSmarty(){
        $this->smarty=new \Smarty();
        $this->smarty->setTemplateDir(__VIEW__);   //設(shè)置模板目錄
        $this->smarty->setCompileDir(__VIEWC__);//設(shè)置混編目錄
    }
}
?>
# Application/Controller/Admin/ProductsController.class.php
public function listAction(){
// 實例化數(shù)據(jù)模型
$model= new \Model\ProductsModel();
$list= $model->select();
// 加載視圖
require __VIEW__.'products_list.html';
$this->smarty->assign('list',$list);
$this->smarty->display('products_list.html');
}
# Application/View/Admin/products_list.html
{foreach $list as $rows}
<tr>
<td>{$rows['proID']}</td>
<td>{$rows['proname']}</td>
<td>{$rows['proprice']}</td>
<td><a href="index.php?p=Admin&c=Products&a=del&proid={$rows['proID']}" onclick="return confirm('確定要刪除嗎')">刪除</a></td>
<td><a href="index.php?p=Admin&c=Products&a=edit&proid={$rows['proID']}">修改</a></td>
</tr>
{/foreach}
來源:https://www./content-1-795151.html

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多