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

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

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

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

登录界面:

图解: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模板,创建两个文件夹,一个用于存放模板文件的 templates模板文件,另一个存放编译后的文件templates_c。

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

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

  1. 陈力:传智播客古代 珍宝币 泡泡龙游戏开发第54讲:PHP smarty模板内建函数

    陈力:传智播客古代 珍宝币 泡泡龙游戏开发第54讲:PHP smarty模板内建函数 描述: smarty模板技术为PHP程序设计中处理和界面的分离提供了很大的便利,有必要了解内建函数等方面的内容,方 ...

  2. 陈力:传智播客古代 珍宝币 泡泡龙游戏开发第53讲:PHP smarty模板配置及变量操作

    陈力:传智播客古代 珍宝币 泡泡龙游戏开发第53讲:PHP smarty模板配置及变量操作 描述: smarty模板技术为PHP程序设计中处理和界面的分离提供了很大的便利.如果分配整型.小数.布尔型. ...

  3. 陈力:传智播客古代 珍宝币 泡泡龙游戏开发第35讲:PHP 抽象类与接口

    陈力:传智播客古代 珍宝币 泡泡龙游戏开发第35讲:PHP 抽象类与接口 如果一个类使用abstract 来修饰,则该类就是抽象类.抽象方法是声明为abstract的,是不需要实现的,供子类继承且实现 ...

  4. 陈力:传智播客古代 珍宝币 泡泡龙游戏开发第22讲:PHP语法、数据类型(整型、布尔型、浮点型、字符串型)

    陈力:传智播客古代 珍宝币 泡泡龙游戏开发第22讲:PHP语法.数据类型(整型.布尔型.浮点型.字符串型) PHP语法是什么样的,有哪些数据类型,有些什么变量.本文对PHP语法.数据类型(整型.布尔型 ...

  5. 陈力:传智播客古代 珍宝币 泡泡龙游戏开发第48讲:PHP绘图技术

    陈力:传智播客古代 珍宝币 泡泡龙游戏开发第48讲:PHP绘图技术 php绘图坐标体系中,坐标原点位于左上角,以像素为单位.php绘图时,要创建画布.画出各种图形.输出图形.销毁图形(释放内存资源). ...

  6. 陈力:传智播客古代 珍宝币 泡泡龙游戏开发第26讲:PHP函数

    陈力:传智播客古代 珍宝币 泡泡龙游戏开发第26讲:PHP函数 什么是PHP函数,如何通过function定义一个函数,如何理解函数的调用过程.这些问题都是网站建设中经常遇到的程序设计问题.在进行网站 ...

  7. 陈力:传智播客古代 珍宝币 泡泡龙游戏开发第28讲:PHP数组

    陈力:传智播客古代 珍宝币 泡泡龙游戏开发第28讲:PHP数组 PHP程序设计语言中的数组如何创建,一维数组的引用,PHP数组变量,foreach语句,如何对数组进行排序等等知识都是贵阳网站建设中的主 ...

  8. 陈力:传智播客古代 珍宝币 泡泡龙游戏开发第30讲:PHP多维数组

    陈力:传智播客古代 珍宝币 泡泡龙游戏开发第30讲:PHP多维数组 在PHP程序设计语言中,如何创建二维数组呢,怎样使用二维数组,这些问题在网站建设中非常重要.二维数组的基本语法为: $a=array ...

  9. 陈力:传智播客古代 珍宝币 泡泡龙游戏开发第50讲:PHP中的xml编程

    陈力:传智播客古代 珍宝币 泡泡龙游戏开发第50讲:PHP中的xml编程 Xml是extensiable markup language的简称,包括文档声明.元素.属性.注释.CDATA区.特殊字符 ...

最新文章

  1. 新手神器!不用部署深度学习环境、上传数据集!(附代码视频教程)
  2. linux绑定盘符吗,Linux盘符绑定实现原理.PDF
  3. 【云栖大会】基因计算:解读生命的力量
  4. DS博客作业01--日期抽象数据类型设计与实现
  5. boost::units模块实现确保最小的 + - * / 单元类功能齐全的测试程序
  6. Java注释:类、方法和字段注释
  7. 基于一款 wk2168芯片的串口扩展
  8. Navicat提示“failed to save password error code”的解决办法
  9. BOOST库介绍(四)——文件系统相关
  10. 给树莓派安装手柄驱动
  11. 密码领域专用语言 ZUC算法
  12. 如何用latex高效写毕业论文(超简明+实用经验分享)
  13. 通过ffmpeg生成AAC数据
  14. python列表逆序
  15. CLIENT_ACKNOWLEDGE机制测试
  16. 北邮php,周琳娜-北京邮电大学网络空间安全学院
  17. python股票数据分析_用Python抓取新浪的股票数据
  18. [Excel函数] AVERAGE函数 | AVERAGEIF函数 | AVERAGEIFS函数
  19. 网络连通性测试ping和tracert命令
  20. 【实习】解决请求参数过长问题

热门文章

  1. android 低电量卡,[转载]Android 中低电量的处理方法
  2. 2021国科大模式识别与机器学习期末考试试题
  3. Ubuntu20.04安装打印机
  4. 点亮LED灯的三种形式
  5. jdk中Calendar的使用
  6. ASP]在網頁中下SQL查詢.其結果轉成Excel檔
  7. KEPServer4.28连接AB Micro820PLC
  8. 树莓派上的软件安装和卸载命令汇总
  9. 计算机二级2017年3月第一套,3月全国计算机等级二级office题库
  10. C语言求一万以内的超级素数,用C语言求素数的优化.doc