当前位置:编程学习 > > 正文

如何用thinkphp框架来写一个网站(php tpl模板引擎定义与使用示例)

时间:2021-11-03 15:49:06类别:编程学习

如何用thinkphp框架来写一个网站

php tpl模板引擎定义与使用示例

本文实例讲述了php tpl模板引擎定义与使用。分享给大家供大家参考,具体如下:

tpl.php

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • <?php
  • namespace tpl;
  • /**
  • * Class Tpl
  • */
  • class Tpl
  • {
  •   protected $view_dir;//模板文件
  •   protected $cache_dir;//缓存文件
  •   protected $lifetime;//过期时间
  •   protected $vars = [];//存放显示变量的数组
  •    /**
  •    * Tpl constructor.
  •    * @param string $view_dir
  •    * @param string $cache_dir
  •    * @param string $lifetime
  •    */
  •   public function __construct($view_dir='', $cache_dir='', $lifetime='')
  •   {
  •     //如果模板文件不为空,则设置,为空则为默认值
  •     if (!empty($view_dir)) {
  •       if ($this->check_dir($view_dir)) {
  •         $this->view_dir = $view_dir;
  •       }
  •     }
  •     //如果缓存文件不为空,则设置,为空时为默认值
  •     if (!empty($cache_dir)) {
  •       if ($this->check_dir($cache_dir)) {
  •         $this->cache_dir = $cache_dir;
  •       }
  •     }
  •     //如果过期时间不为空,则设置,为空时为默认值
  •     if (!empty($lifetime)) {
  •       $this->lifetime = $lifetime;
  •     }
  •   }
  •    /**
  •    * 对外公开的方法
  •    * @param string $name
  •    * @param string $value
  •    */
  •   public function assign($name, $value)
  •   {
  •     $this->vars[$name] = $value;//将传入的参数以键值对存入数组中
  •   }
  •    /**
  •    * 测试文件
  •    * @param $dir_path
  •    * @return bool
  •    */
  •   protected function check_dir($dir_path)
  •   {
  •     //如果文件不存在或不是文件夹,则创建
  •     if (!file_exists($dir_path) || !is_dir($dir_path)) {
  •       return mkdir($dir_path, 0777, true);
  •     }
  •     //如果文件不可读或不可写,则设置模式
  •     if (!is_writable($dir_path) || !is_readable($dir_path)) {
  •       return chmod($dir_path, 0777);
  •     }
  •     return true;
  •   }
  •    /**
  •    * 展示方法
  •    * @param $view_name
  •    * @param bool $isInclude
  •    * @param null $uri
  •    */
  •   public function display($view_name, $isInclude=true, $uri=null)
  •   {
  •     //通过传入的文件名,得到模板文件路径
  •     $view_path = rtrim($this->view_dir, '/') . '/' . $view_name;
  •     //判断路径是否存在
  •     if (!file_exists($view_path)) {
  •       die('文件不存在');
  •     }
  •     //通过传入的文件名得到缓存文件名
  •     $cache_name = md5($view_name . $uri) . '.php';
  •     //缓过缓存文件名得到缓存路径
  •     $cache_path = rtrim($this->cache_dir, '/') . '/' .$cache_name;
  •     //判断缓存文件是否存在,如果不存在,重新生成
  •     if (!file_exists($cache_path)) {
  •       $php = $this->compile($view_path);//解析模板文件
  •       file_put_contents($cache_path, $php);//缓存文件重新生成
  •     } else {
  •       //如果缓存文件存在,判断是否过期,判断模板文件是否被修改
  •       $is_time_out = (filectime($cache_path) + $this->lifetime) > time() ? false : true;
  •       $is_change = filemtime($view_path) > filemtime($cache_path) ? true : false;
  •       //如果缓存文件过期或模板文件被修改,重新生成缓存文件
  •       if ($is_time_out || $is_change) {
  •         $php = $this->compile($view_path);
  •         file_put_contents($cache_path, $php);
  •       }
  •     }
  •     if ($isInclude) {
  •       extract($this->vars);//解析传入变量的数组
  •       include $cache_path;//展示缓存
  •     }
  •   }
  •    /**
  •    * 正则解析模板文件
  •    * @param string $file_name
  •    * @return mixed|string
  •    */
  •   protected function compile($file_name)
  •   {
  •     $html = file_get_contents($file_name);//获取模板文件
  •     //正则转换数组
  •     $array = [
  •       '{$%%}' => '<?=$\1?>',
  •       '{foreach %%}' => '<?php foreach (\1): ?>',
  •       '{/foreach}' => '<?php endforeach ?>',
  •       '{include %%}' => '',
  •       '{if %%}' => '<?php if (\1): ?>',
  •       '{/if}' => '<?php endif ?>',
  •       '{for %%}' => '<?php for (\1): ?>',
  •       '{/for}' => '<?php endfor ?>',
  •       '{switch %%}' => '<?php switch (\1) ?>',
  •       '{/switch}' => '<?php endswitch ?>'
  •     ];
  •     //遍历数组,生成正则表达式
  •     foreach ($array AS $key=>$value) {
  •       //正则表达式,
  •       $pattern = '#' . str_replace('%%', '(.+?)' , preg_quote($key, '#')) . '#';
  •       if (strstr($pattern, 'include')) {
  •         $html = preg_replace_callback($pattern, [$this, 'parseInclude'], $html);
  •       } else {
  •         $html = preg_replace($pattern, $value, $html);
  •       }
  •     }
  •     return $html;
  •   }
  •    /**
  •    * 处理include表达式
  •    * @param array $data
  •    * @return string
  •    */
  •   protected function parseInclude($data)
  •   {
  •     $file_name = trim($data[1], '\'"');
  •     $this->display($file_name, false);
  •     $cache_name = md5($file_name) . '.php';
  •     $cache_path = rtrim($this->cache_dir, '/') . '/' . $cache_name;
  •     return '<?php include "'.$cache_path.'" ?>';
  •   }
  • }
  • user_tpl,,,,从数据库中取值,作为参数传到模板文件,再解析模板文件

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • <?php
  • include './sql/pdo.sql.php';
  • include 'tpl.php';
  •  $tpl = new tpl\Tpl('./view/', './cache/', 3000);
  • $link = new pdo_sql();
  • $dat = ['menu_name', 'menu_url'];
  • $res = $link->table('blog_menu')->field($dat)->order('id ASC')->select();
  • $tpl->assign('menu', $res);
  • $tpl->display('index.html');
  • 希望本文所述对大家PHP程序设计有所帮助。

    原文链接:https://blog.csdn.net/qq_42176520/article/details/80426384

    标签:
    上一篇下一篇

    猜您喜欢

    热门推荐