1,smarty的原理
2,smarty的初始化方式
3,分配各种类型数据
4,分配函数
5,使用部份系统函数 include等 config_load等
6, 双引号当中可以插入变量,反引号的作用,系统保留变量
7,变量调节器
8,系统当中的变量调节器
9,中文截取的比较实用的变量调节器
10,如何写块标签
11,如何使用系统当中的另外一些函数
12,如何采用smarty插件模式来写自定义插件函数
定义自定义函数插件是:
1,function.名字.php
2,function smarty_function_名字($参数,&$smarty)
3,最后返回一个字符串
自定义变量调节器:
1,modifier.名字.php
2,function 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.'记录 <a href="'.$this->url.'page=1">'.$this->first.'</a> ';
if($this->prevNum){
$string.='<a href="'.$this->url.'page='.$this->prevNum.'">'.$this->prev.'</a> ';
}
if($this->nextNum){
$string.='<a href="'.$this->url.'page='.$this->nextNum.'">'.$this->next.'</a> ';
}
$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}>