TemplateLayout.php
4.08 KB
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
147
148
149
<?php
/**
* 模板视图
*
* @name TemplateLayout
* @package library/Plugin
* @copyright yoho.inc
* @version 1.0 (2015-9-15 14:14:02)
* @author fei.hong <fei.hong@yoho.cn>
*/
namespace Plugin;
use Yaf\View_Interface;
use Yaf\Dispatcher;
use Yaf\Application;
use Plugin\LightnCandy;
class TemplateLayout implements View_Interface
{
/* 属性 */
protected $_tpl_vars;
protected $_tpl_dir;
/**
* 传递给视图变量
*
* @param mixed $name
* @param mixed $value
*/
public function assign($name, $value = null)
{
$this->tpl_vars[$name] = $value;
}
/**
* 清除一个视图变量
*
* @param mixed $name
* @return void
*/
public function clear($name = null)
{
if (isset($this->tpl_vars[$name])) {
unset($this->tpl_vars[$name]);
} else {
$this->tpl_vars = array();
}
}
/**
* 渲染视图模板,并直接输出到客户端
*
* @param string $tpl
* @param array $tpl_vars
*/
public function display($tpl, $tpl_vars = array())
{
echo $this->render($tpl, $tpl_vars);
}
/**
* 渲染视图模板
*
* @param string $tpl
* @param array $tpl_vars
* @return string
*/
public function render($tpl, $tpl_vars = array())
{
$request = Dispatcher::getInstance()->getRequest();
$config = Application::app()->getConfig()->get('application');
$tplExt = '.' . $config->view->ext;
$viewPath = $this->getScriptPath() . '/' . $request->module;
$viewName = $viewPath . '/' . $request->controller . '/' . $tpl . $tplExt;
// 判断视图模板文件是否存在, 不存在则直接返回空
if (!file_exists($viewName)) {
return '';
}
$tpl_vars = array_merge($this->tpl_vars, $tpl_vars);
// 取得模板的最后修改时间戳
$lastModifyTime = filemtime($viewName);
// 使用MD5生成唯一的键名
$makeKey = md5($viewName . strval($lastModifyTime));
// 模板编译成PHP文件所存放的目录
$compilePath = $config->template->compile;
// 模板编译成PHP文件所存放的文件路径
$compilePhp = $compilePath . '/' . $makeKey . '.php';
// 已渲染过该模板,则直接引PHP文件
if (is_readable($compilePhp)) {
LightnCandy::getContext();
$renderer = include($compilePhp);
}
// 第一次渲染该模板的流程:取得模板内容 => 预编译成PHP函数 => 写入服务器生成PHP文件
else {
$template = file_get_contents($viewName, false, null);
$phpStr = LightnCandy::compile($template, array(
// DEBUG: LightnCandy::FLAG_RENDER_DEBUG | LightnCandy::FLAG_ERROR_EXCEPTION
'flags' => LightnCandy::FLAG_MUSTACHE | LightnCandy::FLAG_HANDLEBARS, // 使用MUSTACHE和HANDLEBARS的模板格式
'basedir' => array($viewPath . '/partials'), // 模板里使用 {{> partial_name}} 时查找的目录
'fileext' => array($tplExt), // 允许查找文件的后缀
));
// 文件流方式读取PHP方法
$renderer = LightnCandy::prepare($phpStr);
// 将编译过的函数写入PHP文件
file_put_contents($compilePhp, $phpStr);
}
// 装载内容,调用PHP函数
try {
$result = $renderer($this->_tpl_vars);
} catch (Exception $e) {
$result = '';
}
return $result;
}
/**
* 设置视图模板目录
*
* @param string $path
* @return boolean
*/
public function setScriptPath($path)
{
$result = false;
if (is_readable($path)) {
$this->tpl_dir = $path;
$result = true;
}
return $result;
}
/**
* 获取视图模板目录
*
* @return string
*/
public function getScriptPath()
{
return $this->_tpl_dir;
}
}