summaryrefslogtreecommitdiff
path: root/src/Template/GeneratedPhpFile.php
blob: f436e9769ba709d185aa7ffa01dc0d14531d2f85 (plain)
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
150
151
152
153
154
155
156
157
158
159
<?php

namespace Smarty\Template;

use Smarty\Exception;
use Smarty\Resource\FilePlugin;
use Smarty\Template;

/**
 * Base class for generated PHP files, such as compiled and cached versions of templates and config files.
 *
 * @author     Rodney Rehm
 */
abstract class GeneratedPhpFile {

	/**
	 * Compiled Filepath
	 *
	 * @var string
	 */
	public $filepath = null;

	/**
	 * Compiled Timestamp
	 *
	 * @var int|bool
	 */
	public $timestamp = false;

	/**
	 * Compiled Existence
	 *
	 * @var boolean
	 */
	public $exists = false;

	/**
	 * Template Compile Id (\Smarty\Template::$compile_id)
	 *
	 * @var string
	 */
	public $compile_id = null;

	/**
	 * Compiled Content Loaded
	 *
	 * @var boolean
	 */
	protected $processed = false;

	/**
	 * unique function name for compiled template code
	 *
	 * @var string
	 */
	public $unifunc = '';

	/**
	 * flag if template does contain nocache code sections
	 *
	 * @var bool
	 */
	private $has_nocache_code = false;

	/**
	 * resource file dependency
	 *
	 * @var array
	 */
	public $file_dependency = [];

	/**
	 * Get compiled time stamp
	 *
	 * @return int
	 */
	public function getTimeStamp() {
		if ($this->exists && !$this->timestamp) {
			$this->timestamp = filemtime($this->filepath);
		}
		return $this->timestamp;
	}

	/**
	 * @return bool
	 */
	public function getNocacheCode(): bool {
		return $this->has_nocache_code;
	}

	/**
	 * @param bool $has_nocache_code
	 */
	public function setNocacheCode(bool $has_nocache_code): void {
		$this->has_nocache_code = $has_nocache_code;
	}

	/**
	 * get rendered template content by calling compiled or cached template code
	 *
	 * @param string $unifunc function with template code
	 *
	 * @throws \Exception
	 */
	protected function getRenderedTemplateCode(\Smarty\Template $_template, $unifunc) {
		$level = ob_get_level();
		try {
			if (empty($unifunc) || !function_exists($unifunc)) {
				throw new \Smarty\Exception("Invalid compiled template for '{$this->filepath}'");
			}
			$unifunc($_template);
		} catch (\Exception $e) {
			while (ob_get_level() > $level) {
				ob_end_clean();
			}

			throw $e;
		}
	}

	/**
	 * @param $file_dependency
	 * @param Template $_template
	 *
	 * @return bool
	 * @throws Exception
	 */
	protected function checkFileDependencies($file_dependency, Template $_template): bool {
			// check file dependencies at compiled code
		foreach ($file_dependency as $_file_to_check) {

			$handler = \Smarty\Resource\BasePlugin::load($_template->getSmarty(), $_file_to_check[2]);

			if ($handler instanceof FilePlugin) {
				if ($_template->getSource()->getResourceName() === $_file_to_check[0]) {
					// do not recheck current template
					continue;
				}
				$mtime = $handler->getResourceNameTimestamp($_file_to_check[0], $_template->getSmarty(), $_template->getSource()->isConfig);
			} else {

				if ($handler->checkTimestamps()) {
					// @TODO this doesn't actually check any dependencies, but only the main source file
					// and that might to be irrelevant, as the comment "do not recheck current template" above suggests
					$source = Source::load($_template, $_template->getSmarty());
					$mtime = $source->getTimeStamp();
				} else {
					continue;
				}
			}

			if ($mtime === false || $mtime > $_file_to_check[1]) {
				return false;
			}
		}
		return true;
	}

}