【opencart3源码分析】模板类template.php

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

猜你喜欢

转载自blog.csdn.net/qq2942713658/article/details/81435086
今日推荐