Smarty
Smarty簡介
- 概念
- 為了分工合作,模板頁面中最好不要出現(xiàn)PHP的代碼
- 需要將表現(xiàn)和內(nèi)容相分離
官方Smarty
-
概念
- Smarty是用PHP編寫的優(yōu)秀的模板引擎
- Smarty可以實現(xiàn)前端開發(fā)人員和后臺程序員分離
- 采用Smarty編寫的程序可以獲得最大速度的提高
- 需要實時更新的內(nèi)容和小項目不適合使用Smarty
-
官方地址
-
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生成混編文件
# index.html
<body>
{$title}
</body>
# 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>
<?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='值'}
- 自定義變量的簡化寫法
# 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ù)
判斷
-
概念
-
語法
{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)
# 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} 賦值
-
{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} 禁止緩存
變量修飾器
變量修飾器
- 概念
- 變量修飾器的本質(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>
自定義變量修飾器
-
概念
-
規(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的緩存是頁面緩存
開啟緩存
緩存的更新
- 方法
- 刪除緩存,系統(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}
緩存分頁
-
概念
-
語法
$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>
緩存集合
# 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)建混編目錄,并且定義混編目錄地址
- 由于前后臺都要啟動模板,所以應(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
|