陈力:传智播客古代 珍宝币 泡泡龙游戏开发第51讲:PHP中smarty模板技术介绍

陈力:传智播客古代 珍宝币 泡泡龙游戏开发第51讲:PHP中smarty模板技术介绍

 smarty模板技术PHP程序设计中必须掌握的知识,本文结合贵阳网站建设中的案例介绍了基于smarty技术的员工列表的设计。本节陈力:传智播客古代 珍宝币 泡泡龙游戏开发第51讲:PHP中smarty模板技术介绍

一、smarty模板技术介绍
    Smarty是聪明的意思。本文介绍为什么要使用模板技术、smarty安装和使用。MVC是一种开发模式,要求数据输入、处理、显示强制分离。由于MVC开发不是很完美。本节从显示员工列表例子入手进行介绍。

二、没有采用smarty模板技术的员工列表实例
    实例:通过登录验证,把员工列表显示出来。了解smarty怎样和MVC整合。
原理图:

软件设计,smarty技术

登录界面:

软件设计,smarty模板技术


     图解:login.php是登录界面,提供了用户ID和密码的输入框,loginController是登录控制器,主要验证输入的用户ID和密码是否正确,如果正确则显示员工列表,如果不正确则返回login.php继续输入新的用户ID和密码。在验证的时候,要调用AdminModel.class.php这个类,这个类再调用sqlHelper.class.php数据操作类进行数据库操作。
    一个设计优良的网站通常不允许用户直接对xxmodel.php进行访问!
创建数据库和表:
先创建一个数据库empdb。
create table admin
(
admid tinyint unsigned primary key, /*管理员id*/
 passwd char(32) not null, /*密码*/
name varchar(64) not null 

create table emp(
empid int unsigned primary key auto_increment,
name varchar(64) not null,
passwd varchar(64) not null,
email varchar(64) not null,
grade tinyint default 1,
sal float default 0)
添加测试数据:
insert into emp (name, passwd, email, grade, sal) values(‘xiaoming1’,md5(‘123’),’admin@sohu.com’,1,5000)
insert into admin values(100,md5('123'),'admin');

login.php(显示登录界面)源程序设计代码:
<html>
<head>
<h1>用户登录界面</h1>
<form action="LoginController.php" method="post">
id:<input type="text" name="adminid"/><br/>
pwd:<input type="password" name="passwd" /><br/>
<input type="submit" value="登录"/>
</form>
</head>
</html>
EMpMolde.php(处理员工数据请求)程序设计代码:
<?php
 require_once 'SqlHelper.class.php';
 class EmpModel {
  //从库里取数据信息
  public function showEmpList(){
   $sql="select * from emp";
   $sqlHelper=new SqlHelper;
   $res=$sqlHelper->execute_dql2($sql);//要调用反回数组的方法.
   $sqlHelper->my_close();
   return $res;//返回数组
  }
 }
?>
LoginController.php(处理登录请求的控制器)源代码如下:
<?php
 //获取用户id和密码
 $admid=@$_POST['adminid'];
 $passwd=@$_POST['passwd'];
 //echo $admid."--".$passwd;
    //应该到数据库验证,本处只简单判断一下即可.
 if($admid=="100" && $passwd=="123"){
        //比如有一个数组$arr=array("张三","李四","王王");//怎样显示呢.
        //如果这里有一个数组,该怎样传给Emplist进行处理,怎么办.可以用session,Cookie或者拼接成字符串进行处理.但都很麻烦.
  //在这里通过一个模板技术把数组传过去,
  header("Location: EmpList.php");
 }else{
  header("Location: login.php");
 }
?>

EmpList.php(显示员工列表界面)源代码为:
<h1>用户列表</h1>
<?PHP
  require_once 'Empmodel.class.php';
  //传统方法
  $empmodel=new EmpModel();
  $res=$empmodel->showEmpList();
  echo "<pre>";
  print_r($res);
  echo "</pre>"
?>

SqlHelper.class.php(数据操作工具)源程序设计代码:
<?php
//提供一个操作数据库的工具类(SqlHelper).[提供curd]
class SqlHelper {
 var $dbName = "empdb";
 var $host = "localhost";
 var $userName = "root";
 var $userPass = "123456";
 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>&nbsp;&nbsp;";
  }
  //显示一页
  if ($fenyePage->pageNow < $fenyePage->pageCount) {
   $next_page = $fenyePage->pageNow + 1;
   $fenyePage->navigator .= "<a href='{$fenyePage->goUrl}?pageNow={$next_page}'>下一页</a>&nbsp;&nbsp;";
  }
  $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>&nbsp;";
  }
  //显示10超链接
  for($index = $start; $start < $index + 10 && $start <= $fenyePage->pageCount; $start ++) {
   $fenyePage->navigator .="<a href='{$fenyePage->goUrl}?pageNow=$start'>$start</a>&nbsp;";
  }
  //如果 $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>&nbsp;";
  }
  $fenyePage->navigator .= "当前第{$fenyePage->pageNow}页/共{$fenyePage->pageCount}页";
  //表单
  $fenyePage->navigator .= "<form action='{$fenyePage->goUrl}' method='get' οnsubmit='return checkPageNow()' />";
  $fenyePage->navigator .= "请输入页数:<input type='text' id='pageNow' οnkeyup='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 );
  }
 }
//提供一个完成 dml函数,一会再写。
}
?>
运行login.php,输入用户ID100,输入密码为123后,可以看到$res变量返回了用户数据。当然这是按传统的MVC方法来实现的功能。

三、采用smarty模板技术的员工列表实例
    下面通过模板技术来实现这些功能。
步骤1:Login.php源代码保持不变。
步骤2: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=="100" && $passwd=="admin"){
  $empModel=new EmpModel;
  $res=$empModel->showEmpList();
  // echo "<pre>"; print_r($res); echo "</pre>";
    // 这里我们使用模板技术把$res的数据分配给界面。
 //1编写一个模板文件,并放到固定的位置供调用。通常放在templates下。
 //2之后在给tpl文件分配要显示的结果集或者是其它文件。引入smarty库,将Smarty解压后的libs放到目录中。
 // 3在这个文件开头引用smarty类的文件,创建一个smarty对象.
  $smarty=new Smarty();//Smarty通常是在控制器中用。
  $smarty->assign("ggg",$res);
   $smarty->display("EmpList.tpl");
 }else{
  header("Location: login.php");
 }
?>
步骤3:建立一个目录templates和templates_c(编译文件目录),编写一个模板文件EmpList.tpl,位于templates下,源代码为:
<h1>用户列表  模板显示</h1>
{*这里是注释*}
<table>
<tr><td>id</td><td>name</td><td>passwrd</td></tr>
{*循环取出res是的数据*}
{foreach from=$ggg item=emp}
<tr><td>{$emp.empid}</td><td>{$emp.name}</td><td>{$emp.passwd}</td></tr>
{/foreach}
</table>
步骤4:在给tpl文件分配要显示的结果集,或者是其它文件。(引入smarty库,将Smarty解压后的libs放到目录中)。
此段代码即LoginController.php源代码中的段落:
 $empModel=new EmpModel;
 $res=$empModel->showEmpList();//获取数组类型的员工信息。
步骤5:在这个文件开头引用smarty类的文件,创建一个smarty对象:
  $smarty=new Smarty();//Smarty通常是在控制器中的用。
  $smarty->assign("ggg",$res);
   $smarty->display("EmpList.tpl");
步骤6:运行login.php。显示界面如下:

软件设计,smarty模板技术


总结,使用smarty模板技术的步骤:
首先要安装和配置smarty模板,创建两个文件夹,一个用于存放模板文件的 templates模板文件,另一个存放编译后的文件templates_c。

【推荐阅读】陈力:传智播客古代 珍宝币 泡泡龙游戏开发第51讲:PHP中smarty模板技术介绍

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值