A-A+

smarty模板引擎仿写代码(复杂版本一)

2015年01月22日 php 暂无评论 阅读 117 次

一.smarty模板引擎仿写代码简单版本

<?php

class MiniSmarty{

public $assign_var=array();

public     $content='';

//注入变量

public function assign($name,$var){

$this->assing_var[$name] =$var;

}

//编译文件

public function display($file){

$this->content = file_get_contents($file);

//var_dump($this->content );

//替换

$pattern = '/{$([wd]+)}/';

if (preg_match($pattern, $this->content)) {

$this->content = preg_replace($pattern, '<?php echo $this->assing_var["$1"]?>', $this->content);

}

//var_dump($this->content );

//编译文件路径

$parse_file = $file.'.php';

 

file_put_contents($parse_file, $this->content);

//载入编译文件

include $parse_file;

}

}

 

//实例化模板类

$minismarty = new MiniSmarty();

//缓存开关

$minismarty->caching = false;

 

//定义变量

$webname = '迷你版Smarty测试';

$author = 'xiwang';

$title = '这是一个测试标题';

$content = '这是一段测试内容';

 

//注入变量

$minismarty->assign('webname', $webname);

$minismarty->assign('author', $author);

$minismarty->assign('title', $title);

$minismarty->assign('content', $content);

 

//启动编译模板文件

$minismarty->display('demo.tpl');

 

?>

 

二.smarty模板引擎仿写代码复杂版本

 

MiniSmarty.class.php文件内容:

<?php
class MiniSmarty{
public $assign_var=array();
//模板文件目录
public $template_dir ="templates";
//模板文件目录
public $compile_dir ="templates_c";
//缓存文件目录
public $cache_dir='cache';
//是否开启缓存
public $caching ="";

public     $content='';
//系统配置
//public     $profile='';
//构造函数 ,检查目录是否存在
public function __construct (){
$this->checkdir();
//$this->getprofile();
//var_dump($this->caching);
}

//检查目录是否存在
public function checkdir(){

if(!is_dir($this->template_dir)){
exit( "末班目录未建立");
}
if(!is_dir($this->compile_dir)){
exit('编译文件目录不存在,请手动建立');
}
if(!is_dir($this->cache_dir)){
exit('缓存文件目录不存在,请手动建立');
}
}
//注入变量
public function assign($name,$var){
//已设置且不为空
if(isset($name)and !empty($name)){
$this->assing_var[$name] =$var;
//var_dump($this->assing_var);
}else{
exit('注入变量出错');
}
}

/*         //从系统配置中读取xml文件中读取shuju

public function getprofile(){
$root_file = "profile.xml";
//var_dump($root_file);
if(file_exists($root_file)){
$sexe = simplexml_load_file($root_file);
$taglib=$sxe->xpath('/root/taglib');

foreach($taglib as $value){
$this->profile["$value->name"]=$value->value;//将系统变量的值读入到$_configs变量中
}
}

} */

//编译文件类
public function display($file){

//模板文件路径
$tpl_file =$this->template_dir."/".$file;

//检查模板文件是否存在
if(!file_exists($tpl_file)){
exit('模板文件不存在');
}

//编译文件路径

$parse_file = $this->compile_dir."/".$file.".php";

//编译文件
//只有当编译文件不存在或者模板文件呗修改后编译文件
if(!file_exists($parse_file) or filemtime($tpl_file)>filemtime($parse_file)){
include "parse.php";
$complie =new MiniSmary_Compile($tpl_file);
$complie->prase($parse_file);

}
//开启了缓存才加载缓存文件,否则直接加载编译文件
if ($this->caching) {
//缓存文件
$cache_file = $this->cache_dir.'/'.$file.'.html';
//只有当缓存文件不存在,或者编译文件已被修改过

//重新生成缓存文件
if (!file_exists($cache_file) || filemtime($cache_file) < filemtime($parse_file)) {
ob_start();
//引入编译文件
include $parse_file;
//缓存内容
$content = ob_get_clean();
//生成缓存文件
if (!file_put_contents($cache_file, $content)) {
exit('缓存文件生成出错!');
}
}
//载入缓存文件
include $cache_file;
} else {
//载入编译文件
include $parse_file;
}
}
}

?>

编译文件内容MiniSmarty_Compile.class.php代码如下:

<?php
class MiniSmary_Compile{
//模板内容
private $content = '';

//获取模板文件内容
public function __construct($tpl_file)
{

$this->content = file_get_contents($tpl_file);
}

//解析普通变量,如把{$name}解析成$this->_tpl_var['name']
public function parseVar() {
$pattern = '/{$([wd]+)}/';
if (preg_match($pattern, $this->content)) {
$this->content = preg_replace($pattern, '<?php echo $this->tpl_var["$1"]?>', $this->content);
}
}

public function parse($parse_file){

//tih替换普通变量
$this->parsevar();

//编译后生成编译文件

var_dump($parse_file);

if (!file_put_contents($parse_file, $this->content)) {
exit('编译文件生成出错!');
}

}

/*                     //构造函数
public function __construct($tpl_file) {
$this->content = file_get_contents($tpl_file);
}

//这里可以自定义其他解析器...

//模板编译
public function parse($parse_file) {
//调用普通变量解析器
$this->parseVar();
//这里可以调用其他解析器...

//编译完成后,生成编译文件
if (!file_put_contents($parse_file, $this->content)) {
exit('编译文件生成出错!');
}
}
*/

}

?>

index.php代码如下:

<?php

include(dirname(__FILE__).'/init.php');
include 'MiniSmarty.class.php';

//实例化模板类
$minismarty = new MiniSmarty();
//缓存开关
$minismarty->caching = false;

//定义变量
$title = "黑雨php网站";

//用定义的变量$name的值("OK")替换掉模版中的<{$name}>
$minismarty->assign('title',$title);

//导航
$sql = "select * from list ;";
$rs = $con->query($sql);
while ($row = $rs->fetch_assoc())
{
$id = $row[id];
$list[$id] = $row['listtitle'];
//var_dump("最终结果".$list);

}
$minismarty->assign('items', $list);

/*输出*/
$sql = "select count(*) from blog";
$rs = $con->query($sql);
$row = $rs->fetch_array();
$num = $row[0];//总文章条数

//var_dump($_GET['id']);
//echo "总文章数";
$recordnum = 8; //每页显示文章数
$pages = ceil($num/$recordnum);// 总页数

if ($_GET['id'])
{

if($_GET['id']==1){
$current = 1;//当前页
$pre = 1;        //前一页
$next = 2;    //后一页
}else if($_GET['id']>1){
$pre = $_GET['id']-1;
$current =$_GET['id'];
$next =$_GET['id']+1;
}
} else{
//空值
$current = 1;
$pre = 1;
$next = 2;
}

//sql中如果有运算需要单独列出来
//联合查询//参考select * from blog,list order by blog.id desc limit 0,10//有相同列时取别名
$sql = "select  blog.content as blogcontent,blog.id as blogid,blog.title as blogtitle,blog.userid,user.name,user.id,blog.ctime,list.id as listid,list.listtitle from blog,list,user where blog.listid = list.id  and blog.userid = user.id order by blog.id desc limit ". ($current-1)*$recordnum . ", $recordnum";

$rs = $con->query($sql);
while ($row = $rs->fetch_assoc())
{

$newdate = date("Y-m-d", strtotime($row['ctime']));
$content=$row['blogcontent'];
$pattern="/<[img|IMG].*?src=['|"](.*?(?:[.gif|.jpg]))['|"].*?[/]?>/";
//stripslashes()去除addslashes的反斜杠,以便于适用上面的正则表达式
preg_match_all($pattern,stripslashes($content),$match);
$thumbnail = $match[1][0];
if(empty($thumbnail)){
$thumbnail="./images/random/".rand(1,5).".jpg";
}
$blog[]= array(
'blogtitle'=> $row['blogtitle'],
'thumbnail' => $thumbnail,
'content' => mb_substr($content,0,120,'utf-8'),
'newdate' => $newdate,
'name' => $row['name'],
'listid' => $row['listid'],
'listtitle' => $row['listtitle'],
'blogid' => $row['blogid']
);

}
foreach($blog as $key => $val){
echo $key ."=>".$val."每层第一次循环<br>";
echo "<br>--------------<br>";
echo $val['blogid']."=>";    echo $val['blogtitle']."<br>";
}

$minismarty->assign('blog', $blog);

//定义变量
/*     $webname = '迷你版Smarty测试';
$author = 'xiwang';
$title = '这是一个测试标题';
$content = '这是一段测试内容';

$minismarty->assign('content','打造自己的PHP模板引擎!');//分配变量
$minismarty->assign('bool',true);
$minismarty->assign('colors',array('red','green','blue'));

//注入变量
$minismarty->assign('webname', $webname);
$minismarty->assign('author', $author);
$minismarty->assign('title', $title);
$minismarty->assign('content', $content); */

//启动编译模板文件
//$minismarty->display('footer.tpl');
$minismarty->display('index.html');

?>

给我留言

Copyright © web前端技术开发个人博客 保留所有权利  京ICP备14060653号 Theme  Ality

用户登录