smarty 模板技术/引擎
第一讲 全面掌握 smarty 1 smarty 基本介绍 快速入门 localhost/smarty/Code/
快速体验,smarty 和 MVC 开发模式整合,原理图如下
以上从分层到 MVC 告一段落,存在一些问题:权限问题,登录无法挡住用户直接访问其
他页面,需要 session 的知识,这个 mvc 改造不够纯正,需要用到模板技术,使用框架
原来的 mvc 出现的问题 最严重的一个问题很明显,不管是登录处理控制器——登录验证
合法后要展示 emplist 列表信息还是点击修改用户后跳转到修改界面。只要这个界面需要显
示大量信息,就必须在该界面调用 model 里面的方法展示数据,因为大数据量不能通过控
制器传递【没有使用框架模板】,只能通过 header location ur 传递少量几个参数,也无法
传递数组甚至对象。解决这个问题就要用到模板结束,此模板以 smarty 来演示解决原理过
程
优点
Smarty 还可以用在 model1 模式
更加规范的 mvc 模式使用 smarty 模板技术实现数据输入,数据处理和数据的显示完全分离
效果
Emp.tpl(这个文件默认放在 templates 目录下)
代码:
SqlHelper.class.php
<?php
//提供一个操作数据库的工具类(SqlHelper).[提供 curd]
class SqlHelper{
var $dbName = "smartytest";
var $host = "localhost";
var $userName = "root";
var $userPass = "root";
var $conn;
function __construct(){
$this->conn = mysql_connect($this->host, $this->userName, $this->userPass);
if (!$this->conn) die ("连接数据库失败".mysql_error());
mysql_query("set names utf8");
//选择数据库
mysql_select_db($this->dbName, $this->conn) or die("连接数据库失败");
}
//提供统一查询函数 dql(select) dml(update,delete,insert)
//接收一个 sql 语句,完成该语句.
//$sql select * from emp
function execute_dql($sql){
$res=mysql_query($sql) or die ("查询失败".mysql_error());
//mysql_close($this->conn);
return $res;
}
//提供一个执行 dml(update delete insert)语句
function execute_dml($sql){
$b=mysql_query($sql,$this->conn) or die("dml 语句错误".mysql_error());
if(!$b){ return 0;//0 表示失败
}else{
if(mysql_affected_rows($this->conn)>0)
//有行数受到影响
return 1;//有行数被影响
else return 2;//没有行数影响
}
}
//因为分页功能是一个通用的功能.所有也一个函数来处理
//$sqls $sqls1 ="select count(*) cun from 表名";
// $sqls2 ="select * from 表名 limt ..."
function execute_dql_page($sqls, $fenyePage){
//"select count(*) from emp"
$res = $this->execute_dql2($sqls[0]);
$fenyePage->pageCount = ceil($res[0]['count(*)']/($fenyePage->pageSize));
//echo $fenyePage->pageCount;
$fenyePage->rowCount = $res[0]['count(*)'];
//操作数据库..
//echo '----'.$sqls[1];
$fenyePage->res = $this->execute_dql2($sqls[1]);
//这里我们能不能把 navigator 处理.
//显示上一页的超链接
if ($fenyePage->pageNow >1){
$pre_page = $fenyePage->pageNow - 1;
$fenyePage->navigator.= "<a href='{$fenyePage->goUrl}?
pageNow={$pre_page}'>上一页</a> ";
}
//显示一页
if ($fenyePage->pageNow < $fenyePage->pageCount){
$next_page = $fenyePage->pageNow + 1;
$fenyePage->navigator.= "<a href='{$fenyePage->goUrl}?
pageNow={$next_page}'>下一页</a> ";
}
$start = floor(($fenyePage->pageNow-1)/10)*10+1;
if ($start > 1){
$pre_start = $start - 1;
$fenyePage->navigator.="<a href='{$fenyePage->goUrl}?
pageNow=$pre_start'><<<</a> ";
}
//显示 10 超链接
for($index=$start; $start<$index+10 && $start<=$fenyePage->pageCount; $start++){
$fenyePage->navigator.="<a href='{$fenyePage->goUrl}?
pageNow=$start'>$start</a> ";
}
//如果 $pageNow 如是是 1 2 3 4 5 6 7 8 9 10 >>>11
if ($fenyePage->pageNow < $fenyePage->pageCount) {
$fenyePage->navigator.="<a href='{$fenyePage->goUrl}?
pageNow=$start'>>>></a> ";
}
$fenyePage->navigator.= " 当 前 第 {$fenyePage->pageNow} 页 / 共 {$fenyePage-
>pageCount}页";
//表单
$fenyePage->navigator.= "<form action='{$fenyePage->goUrl}' method='get'
onsubmit='return checkPageNow()' />";
$fenyePage->navigator.= " 请 输 入 页 数 :<input type='text' id='pageNow'
onkeyup='return checkPageNow()' name='pageNow'/>";
$fenyePage->navigator.= "<input type='submit' value='go'>";
$fenyePage->navigator.= "</form>";
}
//完成查询功能的函数
function execute_dql2($sql){
//echo 'sql='.$sql;
//exit();
//如何记录日志,这里可以记录所有执行的 sql
//file_put_contents("d:/mylog.txt",$sql."\r\n",FILE_APPEND);
//$sql="select count(*) from emp";
$res=mysql_query($sql,$this->conn) or die("查询失败".mysql_error());
//立即释放资源.
$arr = array();
//$res=>$arr;
while ($row= mysql_fetch_assoc($res)){
//$row [ $row['empid'] $row['name'] ]
//$row 一维数组
$arr[] = $row;
}
//可以立马释放资源(这里是 ok!)
mysql_free_result($res);
//关闭的动作,我们单独处理.,不能马上关闭原因,是因为可能使用通过一
//$sqlHelper 可以掉哟过多次 execute_dql2
//mysql_close($this->conn);
return $arr;
}
//关闭连接
/* function my_close(){
if (!empty($this->conn)) mysql_close($this->conn);
} */
public function close_connect(){
if(!empty($this->conn)) mysql_close($this->conn);
}
//提供一个完成 dml 函数,一会再写.
}
?>
login.php
<html>
http://localhost/smarty/class1/login.php
<head>
<h1>用户登录界面</h1>
<form action="LoginController.php" method="post">
i d: <input type="text" name="adminid"/><br/><br/>
pwd: <input type="password" name="passwd" /><br/><br/>
<input type="submit" value="登录"/>
</form>
</head>
</html>
LoginController.php
<?php
require_once 'EmpModel.class.php';
require_once './libs/Smarty.class.php';
//获取用户 id 和密码
$admid=@$_POST['adminid'];
$passwd=@$_POST['passwd'];
// echo $admid." -- ".$passwd;
// 这里应当去数据库去验证
if($admid==="110" && $passwd==="123"){
// 如果这里有一个数组,怎样传给 empList.php 去显示 1)session 2)cookie 很麻烦如
特定格式、限制大小 3)模板技术
$arr=array("宋江","阎婆惜");
//这里我们如何去得到所有的用户信息
//传统写法
$empModel=new EmpModel;
$arr=$empModel->showEmpList();
// echo "<pre>";
// print_r($res);
// echo "</pre>";