您的位置:首页 > 编程语言 > PHP开发

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

2015-07-30 16:57 901 查看
陈力:传智播客古代 珍宝币 泡泡龙游戏开发第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>  ";

  }

  //显示一页

  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 );

  }

 }

//提供一个完成 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模板技术介绍
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: