<?php
define('BASE_PATH',$_SERVER['DOCUMENT_ROOT']);
define('SMARTY_PATH','\smartTest\Smarty\\');
require BASE_PATH.SMARTY_PATH.'Smarty.class.php';
/*$dir2的這種路徑顯示到表現頁是這下面字符串是一樣,導致smarty找不到templates路徑*/
//$dir2 = "../Smarty/tempplates/";
class SmartyProject extends Smarty{
function SmartyProject(){
/*必須加這個parent::__construct();,否則,Smarty不會被構造,truncate等不能用,
* 但這似乎沒有道理,但事實上,
* 這麼做確實解決了truncate不能使用的問題*/
parent::__construct();
$this->template_dir = BASE_PATH.SMARTY_PATH.'/templates/';
$this->compile_dir = BASE_PATH.SMARTY_PATH.'/templates_c/';
$this->config_dir = BASE_PATH.SMARTY_PATH.'/configs/';
$this->cache_dir = BASE_PATH.SMARTY_PATH.'/cache/';
}
}
class ConnDB{
var $dbtype;
var $host;
var $user;
var $pwd;
var $dbname;
var $debug;
var $conn;
function ConnDB($dbtype, $host, $user, $pwd, $dbname, $debug=FALSE){//構造函數
$this->dbtype=$dbtype;
$this->host=$host;
$this->user=$user;
$this->pwd=$pwd;
$this->dbname=$dbname;
$this->debug=$debug;
}
function GetConnId(){
require BASE_PATH.'/smartTest/adodb5/adodb.inc.php';//將adodb的主文件引用進來
if($this->dbtype == 'mysql'){
$this->conn = NewADOConnection('mysql');
$this->conn->Connect($this->host, $this->user, $this->pwd, $this->dbname);
}else if($this->dbtype == 'mssql'){
$this->conn = NewADOConnection('mssql');
$this->conn->Connect($this->host, $this->user, $this->pwd, $this->dbname);
}else if($this->dbtype == 'access'){
$this->conn = NewADOConnection('access');
$this->conn->Connect("Driver={Microsoft Access Driver(*.mdb)};Dbq=".$this->dbname.";Uid=".$this->user.";Pwd=".$this->pwd.";");
}
$this->conn->Execute("set names utf-8");
if($this->dbtype == 'mysql')
$this->conn->debug = $this->debug;
return $this->conn;
}
function CloseConnId(){
$this->conn->Disconnect();
}
}
class AdminDB{
function ExecSQL($sqlstr, $conn){
$sqltype = strtolower(substr(trim($sqlstr), 0,6));//去sql語句的前6個字符
$rs = $conn->Execute($sqlstr);
if($sqltype == 'select'){
$array = $rs->GetRows();
if(count($array)==0 || $rs == false)
return false;
else
return $array;
}else if($sqltype == 'update'||$sqltype == 'insert'||$sqltype == 'delete'){
//這寫都是不返回結果集的,或者說返回空集合
if($rs)
return true;
else
return false;
}
}
}
class SepPage{
var $rs;
var $pagesize;
var $nowpage;
var $array;
var $conn;
var $sqlstr;
function ShowData($sqlstr,$conn,$pagesize,$nowpage){
if(!isset($nowpage)||$nowpage==""){
$this->nowpage = 1;
}else{
$this->nowpage = $nowpage;
}
$this->pagesize = $pagesize;
$this->conn = $conn;
$this->sqlstr = $sqlstr;
//執行查詢語句
$this->rs = $this->conn->PageExecute($this->sqlstr,$this->pagesize,$this->nowpage);//調用ADODO類中的這個方法
@$this->array = $this->rs->GetRows();
if(count($this->array)==0||$this->rs == false)
return false;
else
return $this->array;
}
function ShowPage($contentname, $utits, $anotherserchstr, $anotherserchstrs, $class){
$allrs = $this->conn->Execute($this->sqlstr); //執行查詢語句
$record = count($allrs->GetRows());//統計記錄總數
$pagecount = ceil($record/$this->pagesize);//計算共有多少頁
@$str.="共有".$contentname." ".$record." ".$utits." 每頁顯示 ".$this->pagesize.
" ".$utits." 第 ".$this->rs->AbsolutePage()." 頁/共 ".$pagecount." 頁";
$str.=" ";
if(!$this->rs->AtFirstPage())
$str.="<a href=".$_SERVER['PHP_SELF']."?page=1¶meter1=".$anotherserchstr."¶meter2=".
$anotherserchstrs."class=".$class.">首頁</a>";
else
$str.="<font color='#555555'>首頁</font>";
$str.=" ";
if (!$this->rs->AtFirstPage())
$str.="<a href=".$_SERVER['PHP_SELF']."?page=".($this->rs->AbsolutePage()-1)."¶meter1=".$anotherserchstr."¶meter2=".
$anotherserchstrs."class=".$class.">上一頁</a>";
else
$str.="<font color='#555555'>上一頁</font>";
$str.=" ";
if(!$this->rs->AtLastPage())
$str.="<a href=".$_SERVER['PHP_SELF']."?page=".($this->rs->AbsolutePage()+1)."¶meter1=".$anotherserchstr."¶meter2=".
$anotherserchstrs."class=".$class.">下一頁</a>";
else
$str.="<font color='#555555'>下一頁</font>";
$str.=" ";
if(!$this->rs->AtLastPage())
$str.="<a href=".$_SERVER['PHP_SELF']."?page=".$pagecount."¶meter1=".$anotherserchstr."¶meter2=".
$anotherserchstrs."class=".$class.">尾頁</a>";
else
$str.="<font color='#555555'>尾頁</font>";
if(count($this->array)== 0||$this->rs==false)
return "";
else
return $str;
}
}
以上代碼定義了幾個類,用來實現數據庫的連接啊,操作數據庫,分頁實現,數據庫的存儲,以及一個smarty類的子類,其實這個子類也沒有實現什麼特別的功能。將其命名為
smartyDAO.php或這隨便取個什麼名字都可以,當然,還有一點要注意的是,我裡面試用了require語句,對於這些路徑,大家都要該到自己對應的目錄去。
<?php
require 'smartyDao.php';
//數據庫類實例
$conobj = new ConnDB("mysql", "localhost", "root", "brave", "bank");
$conn = $conobj->GetConnId();
//數據庫操作類對象
$admindb = new AdminDB();
//Smarty模板配置類對象
$smarty = new SmartyProject();
$seppage = new SepPage();//實例化分頁類
這個文件就是對上面那個文件中類的實例化,可以命名為 smartyDaoImpl.php,或者命名為你自己喜歡的名字,作用很簡單,是吧
然後要做的工作就是隨便建立一個測試用例,來測試分頁代碼了,當然,這個測試也包含兩個文件,一個是控制器,另外一個視圖,控制器的代碼是:
<?php
include_once 'conn/smartyDaoImpl.php';
$arr_page = $seppage->ShowData("select * from localinfo", $conn, 5, $_GET['page']);//執行分頁查詢
if(!$arr_page)
$smarty->assign('page',"F");
else {
$smarty->assign('page','T');
$smarty->assign('showpage',$seppage->ShowPage("記錄", "個", "", "", "a1"));//賦值分頁模版
$smarty->assign('arr_page',$arr_page);//將查詢記錄復制給模版
}
$smarty->display('view/fenyeShow.html');//指定顯示數據的模版
取個名吧,就叫做smarty_ADODB_fenye.php吧。可以看到,我們在開頭用到了:
include_once 'conn/smartyDaoImpl.php';
這裡,說明一下,前面那兩個文件都是放在conn文件夾下的,測試用例寫在conn同級目錄下
然後視圖文件,視圖文件放的地方可別放錯了看到我們寫的第一個類中有這樣一條語句
$this->template_dir = BASE_PATH.SMARTY_PATH.'/templates/';
這裡就是指定了視圖文件的絕對路徑,因為,
$smarty->display('view/fenyeShow.html');//指定顯示數據的模版
這條語句,
$smarty->display('view/fenyeShow.html');//指定顯示數據的模版
所以,我們要在
BASE_PATH.SMARTY_PATH.'/templates/
路徑下建立一個文件夾名為view,然後在先建一個文件名為fenyeShow.html,當然你可以取你喜歡的名字,但是要保證程序中指定的一致性
視圖模版裡面的內容是以下:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<table>
{section name=id loop=$arr_page}
<tr>
<td height = "20" align="center" bgcolor='#FFFFFF'>{$arr_page[id].Id}</td>
<td height = "20" align="center" bgcolor='#FFFFFF'>{$arr_page[id].temperature}</td>
<td height = "20" align="center" bgcolor='#FFFFFF'>{$arr_page[id].illumination}</td>
<td height = "20" align="center" bgcolor='#FFFFFF'>{$arr_page[id].moisture}</td>
<td height = "20" align="center" bgcolor='#FFFFFF'>{$arr_page[id].times|truncate:5:"..."}</td>
</tr>
{/section}
<tr>
<td height = "35" colspan="3" align ="center" bgcolor="#FFFFFF">{$showpage}</td>
</tr>
</table>
</body>
</html>
好了,做完了,只要在浏覽器中定位到smarty_ADODB_fenye.php這個文件,啟動服務器,OK,將會看到分頁效果了。
我在做的過程中,也遇到了一些問題,一個是不能試用 truncate語句,這個問題很奇怪,到smarty官網查了下,讓來,smarty子類實例化時,不會實例化其父類Smarty,因此,會導致truncate不可以用,解決的辦法,自然是在子類中調用父類構造方法。
摘自 0+0+0+...=1