编程语言
首页 > 编程语言> > PHP核心之模板引擎Smarty

PHP核心之模板引擎Smarty

作者:互联网

Smarty

Smarty简介

官方Smarty

<?php
require './Smarty/Smarty.class.php';
$smarty=new Smarty();
$smarty->assign('title','锄禾日当午');
$smarty->left_delimiter='{{';		//更改左界定
$smarty->right_delimiter='}}';		//更改右界定
$smarty->setTemplateDir('./templates/');	//设置模板目录
$smarty->setCompileDir('./templates_c/');	//设置混编目录
$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封装

# 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;	                                            //包含混编文件
        }                                       
	}
}
?>

演化四:文件分类存放

# Smarty.class.php
<?php
class Smarty{
	public $template_dir='./templates/';	//默认模板目录
	public $templatec_dir='./templates_c/';	//默认混编目录

	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.class.php
<?php
class Smarty{
	public $template_dir='./templates/';	//默认模板目录
	public $templatec_dir='./templates_c/';	//默认混编目录

	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变量

普通变量

# index.php
<?php
require './Smarty/Smarty.class.php';
$smarty=new Smarty();
$smarty->assign('name','Sunny');
$smarty->left_delimiter='{{';		//更改左界定
$smarty->right_delimiter='}}';		//更改右界定
$smarty->setTemplateDir('./templates/');	//设置模板目录
$smarty->setCompileDir('./templates_c/');	//设置混编目录
$smarty->display('index.html');
?>
# index.html
<body>
	姓名:{{$name}}<br>

	{{assign var='age' value='28'}}
	年龄:{{$age}}<br>
	
	{{$grade='高三8班'}}
	班级:{{$grade}}<br>
</body>

保留变量

# 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/');	//设置模板目录
$smarty->setCompileDir('./templates_c/');	//设置混编目录
$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>

配置变量

# 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>
# 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运算符

判断

# 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>不是数字</span>
	{/if}
	<hr>
	{if is_numeric($smarty.get.score)}	
		{if $smarty.get.score is even}
			<span>是偶数</span>
		{elseif $smarty.get.score is odd}
			<span>是奇数</span>	
		{/if}
	{/if}
</body>

数组

# 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>学生:{$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>

循环

for循环

# index.html
<body>
	{for $i=0 to 10 step 2}
		<div>一江春水向东流</div>
	{/for}
</body>

while循环

# index.html
<body>
	{$i=0}
	{while $i<5 }
		<div>{$i++} 一江春水向东流</div>
	{/while}
</body>

foreach

# 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

# 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>

函数

内置函数

变量修饰器

变量修饰器

# index.php
<body>
	转成大写:{'abc'|upper} <br>
	转成小写:{'ABC'|lower} <br>
	默认值:{$add|default:'地址不详'}<br>
	去除标签:{'<b>你好吗</b>'|strip_tags}<br>
	实体转换:{'<b>你好吗</b>'|escape}<br>
	日期:{$smarty.now|date_format:'%Y-%m-%d %H:%M:%S'}<br>
	多个管道连续使用:{'<b>boy</b>'|strip_tags|upper}<br>
</body>

自定义变量修饰器

# modifier.cal.php
<?php
function smarty_modifier_cal($num1,$num2,$num3){
	return $num1+$num2+$num3;
}
?>
# index.html
{10|cal:20:30}

避免Smarty解析

# index.html
<style>
	{literal}
		body{color: #FF0000;}
	{/literal}
</style>

缓存

开启缓存

缓存的更新

# index.php
<?php
require './Smarty/smarty.class.php';
$smarty=new Smarty();
$smarty->caching=true;			//开启缓存
if(date('H')>=9)
	$smarty->force_cache=true;	//强制更新缓存
$smarty->display('index.html');
?>

缓存的生命周期

$smarty->cache_lifetime=3;	//缓存的生命周期

局部不缓存

{$smarty.now nocache}
{nocache}
	{$smarty.now}
{/nocache}

缓存分页

# 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>

清除缓存

# 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集成到项目中

# 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);			//转成小写
	define('PLATFROM_NAME', $p);    //平台名常量
	define('CONTROLLER_NAME', $c);  //控制器名常量
	define('ACTION_NAME', $a);      //方法名常量
	define('__URL__', CONTROLLER_PATH.$p.DS);   //当前请求控制器的目录地址
	define('__VIEW__',VIEW_PATH.$p.DS);     //当前视图的目录地址
	define('__VIEWC__', APP_PATH.'Viewc'.DS.$p.DS); //混编目录
}
private static function initAutoLoad(){
	spl_autoload_register(function($class_name){
		//Smarty类存储不规则,所以将类名和地址做一个映射
		$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
//基础控制器
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__);   //设置模板目录
        $this->smarty->setCompileDir(__VIEWC__);	//设置混编目录
    }
}
?>
# Application/Controller/Admin/ProductsController.class.php
public function listAction(){
	// 实例化数据模型
	$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}

标签:index,php,name,smarty,html,Smarty,PHP,模板
来源: https://www.cnblogs.com/SharkJiao/p/14175820.html