PHP高级 Smarty 第47天

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}>