<?php
namespace Template;
final class Template {
protected $code;
protected $filters = array();
protected $data = array();
// 添加过滤
public function addFilter($key, $value) {
$this->filters[$key] = $value;
}
// 设置
public function set($key, $value) {
$this->data[$key] = $value;
}
// 分发
public function render($filename, $cache = true) {
$file = DIR_TEMPLATE . $filename . '.tpl';
if (is_file($file)) {
$this->code = file_get_contents($file);
foreach ($this->filters as $filter) {
$filter->callback($this->code);
}
// 打开缓冲区
ob_start();
if (!$cache && function_exists('eval')) {
// 从数组中将变量导入当前符号表中
extract($this->data);
echo eval('?>' . $this->code);
} else {
extract($this->data);
include($this->compile($file, $this->code));
}
// 得到当前缓冲区的内容并删除当前输出缓冲区
return ob_get_clean();
} else {
throw new \Exception('Error: Could not load template ' . $file . '!');
exit();
}
}
// 编译
public function compile($file, $code) {
$hash = hash('sha256', $file . __CLASS__ . preg_replace('/[^0-9a-zA-Z_]/', '_', implode('_', array_keys($this->filters))));
$file = DIR_CACHE . substr($hash, 0, 2) . '/' . $hash . '.php';
if (!is_file($file)) {
// 返回目录名
$directory = dirname($file);
if (!is_dir($directory)) {
// 如果没有创建目录
if (!mkdir($directory, 0777, true)) {
// 清除文件状态缓存
clearstatcache(true, $directory);
}
}
// 打开文件
$handle = fopen($file, 'w+');
// 写入
fwrite($handle, $code);
// 关闭
fclose($handle);
}
return $file;
}
}
【opencart3源码分析】模板类template.php
猜你喜欢
转载自blog.csdn.net/qq2942713658/article/details/81435086
今日推荐
周排行