1: <?php
2:
3: 4: 5: 6: 7: 8: 9: 10:
11:
12: namespace Nette\Templates;
13:
14: use Nette,
15: Nette\Environment,
16: Nette\Caching\Cache,
17: Nette\Loaders\LimitedScope;
18:
19:
20:
21: 22: 23: 24: 25:
26: class FileTemplate extends Template implements IFileTemplate
27: {
28:
29: public static $cacheExpire = NULL;
30:
31:
32: private static $cacheStorage;
33:
34:
35: private $file;
36:
37:
38:
39: 40: 41: 42:
43: public function __construct($file = NULL)
44: {
45: if ($file !== NULL) {
46: $this->setFile($file);
47: }
48: }
49:
50:
51:
52: 53: 54: 55: 56:
57: public function setFile($file)
58: {
59: if (!is_file($file)) {
60: throw new \FileNotFoundException("Missing template file '$file'.");
61: }
62: $this->file = $file;
63: return $this;
64: }
65:
66:
67:
68: 69: 70: 71:
72: public function getFile()
73: {
74: return $this->file;
75: }
76:
77:
78:
79:
80:
81:
82:
83: 84: 85: 86:
87: public function render()
88: {
89: if ($this->file == NULL) { 90: throw new \InvalidStateException("Template file name was not specified.");
91: }
92:
93: $this->__set('template', $this);
94:
95: $shortName = str_replace(dirname(dirname($this->file)), '', $this->file);
96:
97: $cache = new Cache($this->getCacheStorage(), 'Nette.FileTemplate');
98: $key = trim(strtr($shortName, '\\/@', '.._'), '.') . '-' . md5($this->file);
99: $cached = $content = $cache[$key];
100:
101: if ($content === NULL) {
102: if (!$this->getFilters()) {
103: $this->onPrepareFilters($this);
104: }
105:
106: if (!$this->getFilters()) {
107: LimitedScope::load($this->file, $this->getParams());
108: return;
109: }
110:
111: $content = $this->compile(file_get_contents($this->file), "file \xE2\x80\xA6$shortName");
112: $cache->save(
113: $key,
114: $content,
115: array(
116: Cache::FILES => $this->file,
117: Cache::EXPIRE => self::$cacheExpire,
118: Cache::CONSTS => 'Nette\Framework::REVISION',
119: )
120: );
121: $cache->release();
122: $cached = $cache[$key];
123: }
124:
125: if ($cached !== NULL && self::$cacheStorage instanceof TemplateCacheStorage) {
126: LimitedScope::load($cached['file'], $this->getParams());
127: fclose($cached['handle']);
128:
129: } else {
130: LimitedScope::evaluate($content, $this->getParams());
131: }
132: }
133:
134:
135:
136:
137:
138:
139:
140: 141: 142: 143: 144:
145: public static function setCacheStorage(Nette\Caching\ICacheStorage $storage)
146: {
147: self::$cacheStorage = $storage;
148: }
149:
150:
151:
152: 153: 154:
155: public static function getCacheStorage()
156: {
157: if (self::$cacheStorage === NULL) {
158: $dir = Environment::getVariable('tempDir') . '/cache';
159: umask(0000);
160: @mkdir($dir, 0755); 161: self::$cacheStorage = new TemplateCacheStorage($dir);
162: }
163: return self::$cacheStorage;
164: }
165:
166: }
167: