Smarty 模板引擎 笔记

PHP代码与HTML代码分离

  • 简单分离 使用 include "view.html"

​ controller.php 控制器

  • 写好后端代码后把前端试图文件包含过来
<meta charset="utf-8">
<?php
// header("content:text/html;charset=utf-8");
$spd = "mysql:host=127.0.0.1;port=3306;dbname=test;charset=utf8";
$username = "root";
$password = "root";
$pdo = new PDO($spd,$username,$password);


$sql = "SELECT * FROM `student`";

$PDOStatement = $pdo->query($sql);
//获取全部数据
$row = $PDOStatement->fetchAll(PDO::FETCH_ASSOC);
//获取总数
$rowData = $PDOStatement->rowCount();
// var_dump($arrData);

include "view.html";
?>

​ view.html

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>学生管理系统</title>
		<style type="text/css">
			a{
				text-decoration: none;
			}
			.pagelist{
				height: 50px;
				line-height: 50px;
				text-align: center;
			}
			.pagelist a{
				padding: 6px 10px;
				border: 1px solid #e8e8e8;
				margin: 0 3px;
			}
			.pagelist a:link,
			.pagelist a:visited{
				
			}
			.pagelist a:hover{
				background-color: #555;
				color: white;
				font-weight: bold;
				border: none;
			}
			.pagelist .current{
				background-color: #555;
				color: white;
				font-weight: bold;
				padding: 6px 10px;
				border: 1px solid #e8e8e8;
			}
			
		</style>
	</head>
	<body>
		<h1 style="width: 100%; text-align: center;">学生管理系统</h1>
		
		<div style="margin: 0 auto; width: 100%;">
			<span style="margin-bottom: 10px;display: block; margin-left: 20%;">总人数:<?php echo $rowData;?></span>
			<a  href="./add.php" style="margin-bottom: 10px;display: block; margin-left: 20%;">添加</a>
			<table border="1" style="margin: 0 auto; width: 60%;">
				<tr bgcolor="whitesmoke">
					<th>id</th>
					<th>姓名</th>
					<th>性别</th>
					<th>年龄</th>
					
					<th>学历</th>
					<th>操作</th>
				</tr>
					<?php foreach($row as $key):?>
					<tr style="text-align: center;">
						<td><?php echo $key['Id']?></td>
						<td><?php echo $key['name']?></td>
						<td><?php echo $key['sex']?></td>
						<td><?php echo $key['age']?></td>
						
						<td><?php echo $key['education']?></td>
						<td>
							
							<a href="javascript:;" onclick="goUpData(<?php echo $key['Id'];?>)">修改</a>
							<a href="javascript:;" onClick="goConfirm(<?php echo $key['Id'];?>)" >删除</a>
						</td>
					</tr>
					<?php endforeach;?>
				
			</table>
		</div>
	</body>
	<script type="text/javascript">
			function goConfirm(id){
				
				if(window.confirm("您确认要删除吗?")){
					location.href="./delete.php?id=" + id;
				} else {
					alert("您取消了");
				}
				
			}
			function goUpData(id){
				location.href="./upData.php?id="+id;
			}
	</script>
</html>

模板引擎实现原理

<?php
$name = "小明";
$age = 18;

//查找替换
$str = file_get_contents("05.html");
$str = str_replace("{","<?php echo",$str);
$str = str_replace("}","?>",$str);
file_put_contents("05.html",$str);
//包含试图文件
include "05.html";

​ 试图文件替换前

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<h1>{$name}今年{$age}岁了</h1>
	</body>
</html>

​ 替换后

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<h1><?php echo$name?>今年<?php echo$age?>岁了</h1>
	</body>
</html>

Smarty 模板引擎

  • 基本使用
    • 下载Smarty后

​ controller.php

<?php 
//包含Smarty类文件
require_once("./smarty-3.1.33/libs/Smarty.class.php");
//创建smarty类
$smarty = new Smarty();
//向试图文件赋值
$smarty->assign("name","小明");
$smarty->assign("age",24);
//显示试图文件
$smarty->display("./view.html");

​ view.html

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		姓名:{$name} <br/>
		年龄:{$age}
	</body> 
</html>

​ Smarty 配置

  • 为了防止Smarty 边界符与js css边界符{} 发生冲突

  • smarty配置边界符

    • $smarty->left_delimiter = "<{"
    • $smarty->right_delimiter = "}>"
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		姓名:<{$name}>  <br/>
		年龄:<{$age}>
	</body> 
</html>

  • Smarty 常用目录的配置

    • 设置或读取试图文件目录:$smarty->setTemplateDir(新目录路径)
    • 读取试图文件目录:$smarty->getTemplateDir()
  • Smarty 其它目录的配置

    • 编译目录的设置:$smarty->setCompileDir()
    • 编译目录的读取:$smarty->getCompileDir()
    • 配置目录的设置:$smarty->setConfigDir()
    • 配置目录的读取:$smarty->getConfigDir()
<?php 
//包含Smarty类文件
require_once("./smarty-3.1.33/libs/Smarty.class.php");
//创建smarty类
$smarty = new Smarty();
//smarty 配置
//配置边界符
$smarty->left_delimiter = "<{";
$smarty->right_delimiter = "}>";
//配置试图路径目录 
$smarty->setTemplateDir("./Home/App/view/");
//向试图文件赋值
$smarty->assign("name","小明");
$smarty->assign("age",24);
//显示试图文件  由于上面配置了试图路径 这里 ./就是以 ./Home/App/view/ 为根目录
$smarty->display("./view.html");

Smarty 中的变量

  • 普通变量
    • 所有的PHP的变量,都可以传递到试图文件中使用
    • 但是,在试图文件中,对象和资源变量,不常用
<?php 
//包含Smarty类文件
require_once("./smarty-3.1.33/libs/Smarty.class.php");
//创建smarty类
$smarty = new Smarty();
//smarty 配置
//配置边界符
$smarty->left_delimiter = "<{";
$smarty->right_delimiter = "}>";
//配置试图路径目录 
$smarty->setTemplateDir("./Home/App/view/");
//向试图文件赋值
$smarty->assign("name","小明");
$smarty->assign("age",24);
$smarty->assign("arr",array("13428888888","185-888888"));
//显示试图文件  由于上面配置了试图路径 这里 ./就是以 ./Home/App/view/ 为根目录
$smarty->display("./view.html");

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		姓名:<{$name}> <br/>
		年龄:<{$age}> <br/>
		手机: <{$arr[0]}> <br/>
		座机: <{$arr.1}> 
	</body> 
</html>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ecj2perX-1573719001411)(img/image-20191113214443080.png)]

Smarty 获取变量

$smarty.get.参数

$smarty.post.参数

$smarty.request.参数

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	get:<{$smarty.get.name}><br/>
	域名:<{$smarty.server.SERVER_NAME}><br/>
	客户端IP地址:<{$smarty.server.REMOTE_ADDR}><br/>

</body>
</html>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WcZdwTNW-1573701067731)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1573696837003.png)]

Smarty 获取PHP 预定义常量

$smarty.const.变量名

<?php
require_once("./smarty-3.1.33/libs/Smarty.class.php");

$smarty = new Smarty();

$smarty->left_delimiter = "<{";
$smarty->right_delimiter = "}>";
const HOST = "127.0.0.1";
$smarty->assign("USER","root");
$smarty->display("./view.html");
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	<!-- 获取php常量 -->
	PHP最大整数:<{$smarty.const.PHP_INT_MAX}><br/> 
	<!-- 获取自定义常量 -->
	主机名:<{$smarty.const.HOST}><br/>
	用户名:<{$USER}><br/>
</body>
</html>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-o27AmbVM-1573701067732)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1573697189410.png)]

Smarty 获取时间戳

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	当前时间戳:<{time()}> <br/>
	当前时间戳:<{$smarty.now}> <br/>
	格式化时间戳:<{$smarty.now|date_format:'%Y-%m-%d %H:%M:%S'}>
</body> 
</html>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q676fzjC-1573701067734)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1573698177867.png)]

Smarty 配置文件变量

  • 如果有一些简单的变量,就不用程序员参与了,轻度昂人员自定义并使用

  • 设置配置文件的工作目录: $smarty->setConfigDir()

  • 读取配置文件的工作路径: $Smarty->getConfigDir()

  • 配置文件的扩展名: .conf、.ini

  • 定义配置文件

    • controller.php

    • <?php 
      //包含Smarty类文件
      require_once("./smarty-3.1.33/libs/Smarty.class.php");
      //创建smarty类
      $smarty = new Smarty();
      //smarty 配置
      //配置边界符
      $smarty->left_delimiter = "<{";
      $smarty->right_delimiter = "}>";
      //配置试图路径目录 
      $smarty->setTemplateDir("./Home/App/view/");
      //配置配置文件路径
      $smarty->setConfigDir("./Home/Conf");
      $smarty->display("./view.html");
      
      
    • myConfig.conf

    • # 配置文件注释 是#
      # 变量名不需要$ 
      # 格式 属性名 = 属性值
      # 分组 使用[]
      
      [userA]
      isUser = userA
      user = root
      password = 123456
      
      [userB]
      isUser = userB
      user = root-B
      password = 123456-B
      
  • 在视图文件如何访问配置变量

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<!-- 加载Home/Conf/下的 配置文件  section使用那个分组  -->
		<{config_load file="myConfig.conf" section="userB"}>
		<!-- 读取配置属性 可以通过#属性名# 也可以通过 $smarty.config.属性名-->
		<h1>使用的是<{#isUser# }>分组</h1>
		用户名:<{#user#}> <br/>
		密 码: <{$smarty.config.password}>
	</body> 
</html>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q9SnC63q-1573817331819)(img/image-20191114193509330.png)]

  • 配置文件变量的分组

    • 使用中括号[] 可以对配置文件分组
[userA]
isUser = userA
user = root
password = 123456

[userB]
isUser = userB
user = root-B
password = 123456-B

Smarty 中的循环–foreach

  • foreach 循环的语法

{foreach $arr as $key=>$value}
	循环内容
{/foreach}
  • 输出一维数组
<?php 
//包含Smarty类文件
require_once("./smarty-3.1.33/libs/Smarty.class.php");
//创建smarty类
$smarty = new Smarty();
//smarty 配置
//配置边界符
$smarty->left_delimiter = "<{";
$smarty->right_delimiter = "}>";
//配置试图路径目录 
$smarty->setTemplateDir("./Home/App/view/");
//配置配置文件路径
$smarty->setConfigDir("./Home/Conf");
$arr = array(
	"user" => "root",
	"pass" => "123456789",
);
$smarty->assign("arr",$arr);
$smarty->display("./view.html");

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		
		<{foreach $arr as $key=>$value}>
			<{$key}>:<{$value}> <br/>
		<{/foreach}>
		
	</body> 
</html>

  • 输出二维数组
......
$arr = array(
	array("1001","小明",18),
	array("1002","小红",18)
);
$smarty->assign("arr",$arr);
$smarty->display("./view.html");
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		
		<table border="1" cellspacing="" cellpadding="">
			<{foreach $arr as $key}>
				<tr>
					<{foreach $key as $value}>
						<td><{$value}></td>
					<{/foreach}>
				</tr>
			<{/foreach}>
		</table>
		
	</body> 
</html>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vtkYwGam-1573817331823)(img/image-20191114220754198.png)]

foreach 常用属性应用

  • @key 输出当前值的索引,可能是整型索引,也可以是字符索引
  • @index 当前数组索引,从0开始计算
  • @iteration 当前循环次数,从0开始计算
  • @first 当前首次循时,值为true 输出转成1 不是首次返回 false 输出转成 空
  • @last 当前最后一次循环时,值为true 。。。同上
  • @total 是整个循环的次数,可以在foreach内部或外部使用
<?php
require_once("./smarty-3.1.33/libs/Smarty.class.php");
date_default_timezone_set("PRC");
$smarty = new Smarty();

$smarty->left_delimiter = "<{";
$smarty->right_delimiter = "}>";

$arr = array(
	"name" => "小明",
	"sex" => "男",
	"age" => 18,
	"farther" => "大明"
);

$smarty->assign("arr",$arr);

$smarty->display("./view.html");
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	<table border="1">
		<{foreach $arr as $key=>$value}>
		<!-- 通过@first进行判断输出标题 -->
		<{if $value@first}>
		<tr>
			<td>当前值</td>
			<td>当前索引</td>
			<td>当前索引值 从0开始</td>
			<td>循环次数 从0开始</td>
			<td>是否首次循环</td>
			<td>是否最后一次次循环</td>
			<td>循环次数</td>
		</tr>
		<{/if}>
			<tr>
				<td><{$value}></td>
				<td><{$value@key}></td>
				<td><{$value@index}></td>
				<td><{$value@iteration}></td>
				<td><{$value@first}></td>
				<td><{$value@last}></td>
				<td><{$value@total}></td>
			</tr>
			
		<{/foreach}>
	</table>
</body>
</html>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pCd5Zxog-1573786642372)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1573780271849.png)]

smarty -----section 循环

  • section 循环 相当于 for 循环

  • for 循环可以指定循环起点 $i= 0

  • for 循环可以指定长度 $i = 10

  • for 循环可以计算最大循环次数 $i++

  • for 自能遍历枚举数组 数组下标必须是从0开始的正整数

  • section 语法

    • <{ section name="" loop="" start="" step="" max	=""}>
          循环代码
      <{/section}>
      
    • name 代表循环的索引 相当于 $i

    • loop 指定循环的变量

    • start 指定循环的初始值,默认为0,从第一个元素开始循环

    • step指定每次循环的步长值,默认为1 相当于 $i++ 如果为负数,则倒序循环;

    • max 指定最大循环次数

    • name、loop是必填参数 其它可选填

    • 赋值时 = 可以不加 引号 “”

  • section 遍历一维数组

<?php
require_once("./smarty-3.1.33/libs/Smarty.class.php");
date_default_timezone_set("PRC");
$smarty = new Smarty();

$smarty->left_delimiter = "<{";
$smarty->right_delimiter = "}>";

$arr = array("小明","男",18,"本科");

$smarty->assign("arr",$arr);

$smarty->display("./view.html");
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	<{section name = i loop = $arr}>
		<{$arr[i]}>
	<{/section}>
</body>
</html>
  • section 遍历二维数组
......
 $arrs = array(
	array("小明","男",18,"本科"),
	array("小红","女",18,"专科"),
	array("大明","男",18,"大专")
);

....
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	<table border="1">
		<tr>
			<td>姓名</td>
			<td>性别</td>
			<td>年龄</td>
			<td>学历</td>
		</tr>
		<{section name = i loop = $arrs}>
			<tr>
				<{section name = j loop = $arrs[i]}>
					<td><{$arrs[i][j]}></td>
				<{/section}>
			</tr>
		<{/section}>
	</table>
</body>
</html>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C0O4yUyj-1573786642378)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1573782155615.png)]

section 控制步长、启始点、循环次数

.....
$arrs = array(
	1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30
);

.....
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	<{section name = i loop = $arrs start = 4  max = 5 }>
		<{$arrs[i]}>
	<{/section}>
</body>
</html>

smarty ----- if 判断

  • Smarty中的if与PHP中的if 很像。PHP 中的运算符在Smarty中都可以使用

  • 语法

    • <{if 判断条件}>
          执行代码
      <{/if}>
          --------------------------------------
      <{if 判断条件}>
           执行代码
      <{else}>
           执行代码
      <{/if}>
           --------------------------------------
      <{if 判断条件}>
           执行代码
      <{elseif 条件2}>
           执行代码
      <{elseif 条件3}>
           执行代码
      <{/if}>
      
  • if中的运算符

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZGNcSBGI-1573786642379)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1573785667855.png)]

  • smarty if 判断 各行变色、
$arrs = array(
	1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
);

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	<table width="400px" border="1">
		<{foreach $arrs as $value}>
            	<!-- 判断 余2取模 -->
			<{if $value@key is not div by 2}>
			<tr bgcolor="skyblue">
			<{else}>
			<tr>
			<{/if}>
				<td>&nbsp;</td>
				<td>&nbsp;</td>
				<td>&nbsp;</td>
				<td>&nbsp;</td>
				<td>&nbsp;</td>
			</tr>
		<{/foreach}>
	</table>
</body>
</html>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xd8Msuuj-1573786642380)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1573786339554.png)]

Smarty 常用的变量调节器

  • 变量调节器,就是变量进行格式的函数,对变量进行格式化输出
  • 语法
<{$avr|调节器1:参数1|调节器2:参数2}>
    $avr 是要修饰的变量
    | 分隔各个调节器函数
    :分隔各个函数参数
    中间不能有空格
  • upper :转成全大写,对应PHP的strtoupper()
  • lower: 转成全小写,对应PHP的 strtolower()
  • nl2br: 将\n 换行符,转成<br/> ,对应PHP的 nl2br
  • replace: 查找替换 ,对应PHP中的 str_replace()
  • date_format:时间戳格式化,对应于PHP 的 date()
  • truncate: 截取字符串,对应PHP的substr() 或 mb_substr();
....
    $text = "Hell Word!";
....
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		转大写:<{$text|upper}> <br/>
		转小写:<{$text|lower}><br/>
		查找替换-PHP方法:<{str_replace("Word","中国",$text)}> <br/>
		查找替换:<{$text|replace:'Word':"中国"}> <br/>
	</body> 
</html>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jWpSaAr3-1573824445990)(img/image-20191115195445799.png)]

  • date_format 调节器

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		转大写:<{$text|upper}> <br/>
		转小写:<{$text|lower}><br/>
		查找替换-PHP方法:<{str_replace("Word","中国",$text)}> <br/>
		查找替换:<{$text|replace:'Word':"中国"}> <br/>
		当前时间戳-PHP:<{time()}> <br/>
		当前时间戳-smarty:<{$smarty.now}> <br/>
		格式化时间戳-PHP:<{date('Y-m-d H:i:s',time())}> <br/>
		格式化时间戳-smarty:<{$smarty.now|date_format:'%Y-%m-%d %H:%M:%S'}>
	</body> 
</html>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jF2xJy2i-1573824445991)(img/image-20191115212639285.png)]

  • truncate 调节器

    • 语法

      • <{ $title|truncate:截取的字符串:代替的字符串 }>
        
      • 截取的字符串长度默认为80

      • 代替的字符串,把截取掉的字符串用什么代替,默认为…

      • 也可以用其它字符串代替

<?php 
//包含Smarty类文件
require_once("./smarty-3.1.33/libs/Smarty.class.php");
//创建smarty类
$smarty = new Smarty();
//smarty 配置
//配置边界符
$smarty->left_delimiter = "<{";
$smarty->right_delimiter = "}>";
//配置试图路径目录 
$smarty->setTemplateDir("./Home/App/view/");
$title = "把时间把金山毒霸加快圣诞节快乐就的撒记录卡时间段是萨拉肯德基季卡事登记卡老实交代";
$smarty->assign("title",$title);
$smarty->display("./view.html");

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<h1>truncate调节器</h1>
		<!-- 默认替换为... -->
		<{$title|truncate:10}> <br/>
		<!-- 替换为000 -->
		<{$title|truncate:10:"000"}>
	</body> 
</html>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wdb6J40t-1574162198542)(img/image-20191119191622818.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tEepX2Pw-1574162198545)(img/image-20191119191242659.png)]

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值