smarty模板局部不缓存结合ajax,json实现静态分页

init.php文件位于项目根目录下,用于定义smarty配置

define("ROOT",dirname(str_replace("\\","/",__FILE__))); 

    //定义文档根目录,因为本文件在文档根下,所以按__FILE__魔术变量取路径,

    //并且__FILE__变量不会被包含文件的路径改变,永远指向定义此变量的文件

    define("PATH",dirname($_SERVER["SCRIPT_FILENAME"]));

    //定义文档目录,谁包含此文件,PATH指向谁

    include ROOT."/libs/Smarty.class.php";

    //包含smarty模板主文件

    $smarty=new Smarty;

    //实例化smarty模板类

    $smarty->template_dir=PATH."/tpls";

    //设定模板文件目录

    $smarty->compile_dir=PATH."/coms";

    //设定编译文件目录

    $smarty->cache_dir=PATH."/cache";

    //设定缓存文件目录

    $smarty->cache_lifttime=3600;

    //设定缓存时间

    $smarty->left_delimiter="<{";

    //设定左包含符

    $smarty->right_delimiter="}>";

    //设定右包含符

    $smarty->caching=true;

    //开启缓存

    $smarty->debugging=false;

    //关闭调试

index.php位于项目根目录下的home目录下,是主文件,实现分页

include "../init.php";

	//包含上级目录下的smarty模板定义文件init.php

	include "../config.inc.php";

	//包含上级目录下的全局配置文件

	include ROOT."/model/mysql.inc.php";

	//包含数据库配置文件

	$num=5;

	//定义每页显示数据数

	$row=$pdo->query("select count(*) from fenye");

	$total=current($row->fetch(PDO::FETCH_NUM));

	//取得数据总量,赋给变量$total

	$totalpage=ceil($total/$num);

	//计算总共需要的页数

	if(isset($_GET['p'])){

		if($_GET['p']>$totalpage){

			$thispage=$totalpage;

		}elseif($_GET['p']<=1){

			$thispage=1;

		}else{

			$thispage=$_GET['p'];

		}

	}else{

		$thispage=1;

	}

	//定义当前页$thispage取值的方式及范围

	$offset=($thispage-1)*$num;

	//定义sql语句limit中的offset值

	$firstpage=1;

	//定义首页page值

	$endpage=$totalpage;

	//定义尾页page值

	$prepage=$thispage>1?$thispage-1:1;

	//定义上一页page值

	$nextpage=$thispage<$totalpage?$thispage+1:$totalpage;

	//定义下一页page值

	$row=$pdo->query("select * from fenye limit $offset,$num");

	//执行sql语句

	$array=array();

	$td="<table id='ncache' border=1>";

	while($arr=$row->fetch(PDO::FETCH_ASSOC)){

		$td.="<tr>";

		$td.="<td>".$arr['newsID']."</td>";

		$td.="<td>".$arr['newsTitle']."</td>";

		$td.="<td>".$arr['newscontent']."</td>";

		$td.="</tr>";

		};

		$td.="</table>";

	//定义用于js插入的显示数据的表格



		$key="";

		$key.="<a href='".$_SERVER['PHP_SELF']."?p=1'  id='first'>首页</a>";

		$key.="<a href='".$_SERVER['PHP_SELF']."?p=".$prepage."'  id='pre'>上一页</a>";

		$key.="<a href='".$_SERVER['PHP_SELF']."?p=".$nextpage."' id='next'>下一页</a>";

		$key.="<a href='".$_SERVER['PHP_SELF']."?p=".$endpage."' id='end'>尾页</a>";

		$key.="<input type='hidden' id='page' value=".$thispage.">";

	//定义分页页脚

	

	function smarty_ncache($params,$content,&$smarty){

			global $td;

			return $td;

	}

	//当点击分页页脚,触发ajax事件,将来到此页面取到要插入的数据,

	//因为此块数据是定义的局部不缓存数据,所以实时更新的



	

		$smarty->register_block("ncache","smarty_ncache",false);

		//定义局部不缓存的标签及处理函数

		$smarty->assign("str",$key);

		$smarty->assign("News",$array);

		//页面第一次访问时分配数据

	if(!isset($_GET['n'])){

		$smarty->display("news.tpl");

	}else{

		echo "{'td':\"{$td}\",'key':\"{$thispage}\"}";

	}

	//点击分页页脚按钮时候,会用ajax传入一个n值,用于区别是点击事件,还是页面初始化,

	//点击事件则将局部不缓存的函数处理过的数据形成json数据返回

	

	

 

模板文件中用此页面定义的smarty局部不缓存标签将局部数据包裹起来,并用js实时更新分页页脚中的一个隐藏input框中存储的当前页码

 1 <!DOCTYPE HTML>

 2 <html>

 3     <head>

 4         <title>""</title>

 5         <meta http-equiv="content-type" content="text/html;charset=utf-8">

 6         <script type="text/javascript" src="/sfenye/jqueryui/jquery.js"></script>

 7     </head>

 8     <body>

 9             <{ncache}><!--局部不缓存标签-->

10         <table border=1  id='ncache'>

11             <tr id><td>ID</td><td>TITLE</td><td>CONTENT</td></tr>

12             

13             <{section name=dis loop=$News}><!--页面首次访问时需要遍历以输出数据-->

14             

15                 <tr>   

16                     <td><{$News[dis].newsID}></td>

17                     <td><{$News[dis].newsTitle}></td>

18                     <td><{$News[dis].newscontent}></td>

19                 </tr> 

20             <{/section}> 

21             

22 

23             

24         </table>

25         <{/ncache}><!--局部不缓存标签-->

26         <br>

27         <br>

28         <div id='fen'>

29         <{$str}>

30         </div>

31     </body>

32     

33     <script type="text/javascript">

34             $(function(){

35                 $("a").click(function(e){

36                     e.preventDefault();//取消链接的默认方法

37 

38                     thispage=Number($("#page").val());//取得当前页码值

39                     nextpage=thispage+1;

40                     prepage=thispage-1;

41                     firstpage=1;

42                     endpage=99;

43                     act=this.id;//取得当前点击分页页脚的哪一个链接,按id取得

44                     switch (act){

45                         case 'first':

46                             sendpage=1;

47                             break;

48                         case 'pre':

49                             sendpage=prepage;

50                             break;

51                         case 'next':

52                             sendpage=nextpage;

53                             break;

54                         case 'end':

55                             sendpage=endpage;

56                             break; 

57                     }//根据点击的分页页脚的链接id决定需要ajax传出的page值

58                     $.get("index.php?p="+sendpage+"&n=true",function(data){//传出page值,并取回数据

59                          var  obj =  eval("("+data+")");//将取回的json数据加工成对象

60                         $("#ncache").replaceWith(obj['td']);//替换当前局部不缓存的区域

61                         $("#page").val(obj['key']);//替换分页页脚的隐藏input框中的当前页值

62                     })

63                  })

64             }) 

65     </script>

66 </html>

数据库文件设定就不在此贴出了,大家根据情况自己设定即可

你可能感兴趣的:(smarty)