PHP高级 Smarty 第47天

2012-11-17 22:20:07 0  category: 第二阶段php

1,smarty的原理

2smarty的初始化方式

3,分配各种类型数据

4,分配函数

5,使用部份系统函数 includeconfig_load

6, 双引号当中可以插入变量,反引号的作用,系统保留变量

7,变量调节器

8,系统当中的变量调节器

9,中文截取的比较实用的变量调节器

10,如何写块标签

11,如何使用系统当中的另外一些函数

12,如何采用smarty插件模式来写自定义插件函数



定义自定义函数插件是:

1function.名字.php

2function smarty_function_名字($参数,&$smarty)

3,最后返回一个字符串

自定义变量调节器:

1modifier.名字.php

2function smarty_modifier_名字(参数1,参数2,参数n) 在使用过程当中参数关是一一对应的关系

3,返回一个字符串


自定义块函数:

内建函数:

Include_php  包含一个PHP文件过来直接放入模版中

ldelim,rdelim   不解析括号


literal   你别跟我解析这一段里面的代码,原样输出,主要用于包js

php     这一块标签的主要作用是在模版当中直接写PHP代码

Strip    不回车输进HTML代码,这一块包起来的空格缩进全部被干掉

Smarty当中用于判断的逻辑关系

eq 等于

ne  neq 不等于

Gt  大于

Lt   小于

gte   ge 大于等于

lte   le 小于等于

Is even   /is not odd 是否为偶数

Is  odd   /  is not even是否为奇数

Not  

Mod   取余

Is  Div  by 除以几

Is Even  by  除以指数之后结果为偶数

Is  odd  by  除以指定数结果为奇数

= =

!=

>=

<=

>

<

Foreachelse 没有数据的时候就执行foreachelse 区间的内容

参数当中的item php foreach 当中的$value

Key  phpforeach当中的key

Name 是跟这个循环取一个名字

Iteration  是指循环次数

First     是指是否为第一次循环




Last    是否为最后一次循环

Total    循环总数

Section

当中的index 是确定循环数,从第0个开始记数

Loop 相当于统计个数

Name 相当于for() $i 记数

Step   步长,隔几个一显示,隔几个一显示  相当于 $i+=2

Start   是从第几个开始记数

Max   确定最大循环次数

$smarty.section.名字.index_prev  上一个循环数

$smarty.section.名字.index_next  下一个循环数

$smarty.section.名字.iteration    与rownum是别名关系 从1开始的循环记数

Loop循环次数


在缓存的时候,它只认文件。造成分页无法生效。

由于只采用分页来作为缓存ID编号的话,会有问题,比如不同贴子下面他们ID不一样,但是分页一样。就会造成所有的贴子,都看到同样的页面。

由于有多个GET传参,我通常使用$_SERVER['REQUEST_URI'] 来作为缓存ID




由于smarty在操作的时候,会将页面自动缓存到caches文件夹下面来,我们可以在操作的时候,直接去读取缓存文件。而让中间的PHP代码在缓存在效期内不执行。

If(!$tpl->is_cached(模版名,模版的ID)){

如果存在这个模版,就不让它执行中间这一块

}

这样来去输出对应的模版内容

$tpl->display(,);

局部不缓存的操作方式:

自定义一个块标签

<?php

function smarty_block_nocache($args,$content,&$smarty){

return $content;

}

?>

拿块标签把不需要缓存的部份,包起来即可。

打开smarty的原有的缓存文件Smarty_Compiler.class.php


init.php


<?php

define('ROOT',str_replace('\\','/',dirname(__FILE__)).'/');

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


$tpl=new Smarty();

$tpl->template_dir=ROOT.'tpls/';

$tpl->compile_dir=ROOT.'tpls_c/';

$tpl->config_dir=ROOT.'configs/';

$tpl->caching=1;

$tpl->cache_dir=ROOT.'caches/';


$tpl->cache_lifetime=20;

$tpl->left_delimiter='<{';
$tpl->right_delimiter='}>';
?>


cache.php



<?php
include 'init.php';


include 'page.class.php';

try{

if(!$tpl->is_cached('cache.tpl',$_SERVER['REQUEST_URI'])){

echo '@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<br>';



$dsn='mysql:host=localhost;dbname=phpmo';

$pdo=new Pdo($dsn,'root','phpha');

$pdo->exec('set names utf8');

//查询数据
$t=$pdo->query('select count(id) from hppuser');

//遍历结果结
$ta=$t->fetch();

$total=$ta[0];


//实例化一个分页对象
$page=new Page('cache.php?',$total);

//获得分页偏移
$offset=$page->getOffset();

$sql="select * from phpser limit $offset,5";

$result=$pdo->query($sql);


$array=$result->fetchAll(PDO::FETCH_ASSOC);

$tpl->assign('data',$array);

//获得分页字符串
$show=$page->getPage();

//分配分页字符串
$tpl->assign('page',$show);

}else{


}
$tpl->display('home/cache.tpl',$_SERVER['REQUEST_URI']);
}catch(PDOException $e){
echo $e->getMessage();
}
?>


page.class.php


<?php
class page{
//超链接
protected $url;
//总页数
protected $count;
//总条数
protected $total;
//每页显示数
protected $num;
//上一页数
protected $prevNum;
//下一页数
protected $nextNum;
//开始记录数
protected $start;
//结束记录数
protected $end;
//首页
protected $first='首页';
//上一页
protected $prev='上一页';
//下一页
protected $next='下一页';
//尾页
protected $last='尾页';
//当前页码
protected $page;


public function __construct($url,$total,$num=5){
$this->url=$url;
$this->total=$total;
$this->num=$num;
$this->page=$_GET['page']?(int)$_GET['page']:1;
$this->count=$this->getCount();
$this->prevNum=$this->getPrev();
$this->nextNum=$this->getNext();
$this->start=$this->getStart();
$this->end=$this->getEnd();
}

protected function getEnd(){
//5 10 15 18

return min($this->page*$this->num,$this->total);

}
protected function getStart(){
// (2 -1) *num +1

return ($this->page-1)*$this->num+1;
}


protected function getCount(){
return ceil($this->total/$this->num);
}
protected function getPrev(){

if($this->page<=1){
return false;
}else{
return $this->page-1;
}
}
protected function getNext(){
if($this->page>=$this->count){
return false;
}else{
return $this->page+1;
}

}

//limit
public function getOffset(){
return ($this->page-1)*$this->num;


}

// 127.0.0.1/page.php?keywords=abc& page=5
// page.php? page=5

public function getPage(){
//第 几/总页 页 从 记录 到 记录 共条记录 首页 上一页 下一页 尾页

$string='第'.$this->page.'/'.$this->count.'页 从第 记录'.$this->start.'到'.$this->end.'记录&nbsp;&nbsp;&nbsp;&nbsp; <a href="'.$this->url.'page=1">'.$this->first.'</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';

if($this->prevNum){

$string.='<a href="'.$this->url.'page='.$this->prevNum.'">'.$this->prev.'</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';
}

if($this->nextNum){
$string.='<a href="'.$this->url.'page='.$this->nextNum.'">'.$this->next.'</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';

}

$string.='<a href="'.$this->url.'page='.$this->count.'">'.$this->last.'</a>';

return $string;
}

}
?>


cache.tpl


<{nocache}>
<h1><{$smarty.now|date}></h1>
<{/nocache}>
<table width="800" border="1">


<{section name=i loop=$data}>

<tr>

<td><{$smarty.section.i.iteration}></td>
<td><{$data[i].username}></td>
<td><{$data[i].password}></td>
<td><{$data[i].createtime}></td>

</tr>


<{sectionelse}>

数组为空执行这一段区间

<{/section}>

</table>
<{$page}>


if.php


<?php
include 'init.php';

$tpl->assign('sex','男');

$tpl->assign('num',6);

$tpl->display('home/if.html');
?>


if.html


<html>

<body>

<{if $num is odd by 2}>
为真

<{else}>
为假

<{/if}>


<{if $sex eq '女'}>
小姐
<{else}>

同志
<{/if}>

</body>

</html>


pdo.php


<?php


include 'init.php';


include 'page.class.php';

try{


$dsn='mysql:host=localhost;dbname=phpmo';

$pdo=new Pdo($dsn,'root','phpha');

$pdo->exec('set names utf8');

//查询数据
$t=$pdo->query('select count(id) from suser');

//遍历结果结
$ta=$t->fetch();

$total=$ta[0];


//实例化一个分页对象
$page=new Page('pdo.php?',$total);

//获得分页偏移
$offset=$page->getOffset();

$sql="select * from ser limit $offset,5";

$result=$pdo->query($sql);


$array=$result->fetchAll(PDO::FETCH_ASSOC);



$tpl->assign('data',$array);

//获得分页字符串
$show=$page->getPage();

//分配分页字符串
$tpl->assign('page',$show);



$tpl->display('home/section.tpl');



}catch(PDOException $e){

echo $e->getMessage();
}
?>


section.tpl


<table width="800" border="1">


<{section name=i loop=$data}>

<tr>

<td><{$smarty.section.i.iteration}></td>
<td><{$data[i].username}></td>
<td><{$data[i].password}></td>
<td><{$data[i].createtime}></td>

</tr>


<{sectionelse}>

数组为空执行这一段区间


<{/section}>

</table>


<{$page}>