| 1: | <?php
|
| 2: |
|
| 3: | |
| 4: | |
| 5: | |
| 6: | |
| 7: | |
| 8: | |
| 9: | |
| 10: | |
| 11: |
|
| 12: | class Smarty_Template_Compiled extends Smarty_Template_Resource_Base
|
| 13: | {
|
| 14: | |
| 15: | |
| 16: | |
| 17: | |
| 18: |
|
| 19: | public $nocache_hash = null;
|
| 20: |
|
| 21: | |
| 22: | |
| 23: | |
| 24: | |
| 25: | |
| 26: | |
| 27: |
|
| 28: | public static function load($_template)
|
| 29: | {
|
| 30: | $compiled = new Smarty_Template_Compiled();
|
| 31: | if ($_template->source->handler->hasCompiledHandler) {
|
| 32: | $_template->source->handler->populateCompiledFilepath($compiled, $_template);
|
| 33: | } else {
|
| 34: | $compiled->populateCompiledFilepath($_template);
|
| 35: | }
|
| 36: | return $compiled;
|
| 37: | }
|
| 38: |
|
| 39: | |
| 40: | |
| 41: | |
| 42: | |
| 43: |
|
| 44: | public function populateCompiledFilepath(Smarty_Internal_Template $_template)
|
| 45: | {
|
| 46: | $source = &$_template->source;
|
| 47: | $smarty = &$_template->smarty;
|
| 48: | $this->filepath = $smarty->getCompileDir();
|
| 49: | if (isset($_template->compile_id)) {
|
| 50: | $this->filepath .= preg_replace('![^\w]+!', '_', $_template->compile_id) .
|
| 51: | ($smarty->use_sub_dirs ? DIRECTORY_SEPARATOR : '^');
|
| 52: | }
|
| 53: |
|
| 54: | if ($smarty->use_sub_dirs) {
|
| 55: | $this->filepath .= $source->uid[ 0 ] . $source->uid[ 1 ] . DIRECTORY_SEPARATOR . $source->uid[ 2 ] .
|
| 56: | $source->uid[ 3 ] . DIRECTORY_SEPARATOR . $source->uid[ 4 ] . $source->uid[ 5 ] .
|
| 57: | DIRECTORY_SEPARATOR;
|
| 58: | }
|
| 59: | $this->filepath .= $source->uid . '_';
|
| 60: | if ($source->isConfig) {
|
| 61: | $this->filepath .= (int)$smarty->config_read_hidden + (int)$smarty->config_booleanize * 2 +
|
| 62: | (int)$smarty->config_overwrite * 4;
|
| 63: | } else {
|
| 64: | $this->filepath .= (int)$smarty->merge_compiled_includes + (int)$smarty->escape_html * 2 +
|
| 65: | (($smarty->merge_compiled_includes && $source->type === 'extends') ?
|
| 66: | (int)$smarty->extends_recursion * 4 : 0);
|
| 67: | }
|
| 68: | $this->filepath .= '.' . $source->type;
|
| 69: | $basename = $source->handler->getBasename($source);
|
| 70: | if (!empty($basename)) {
|
| 71: | $this->filepath .= '.' . $basename;
|
| 72: | }
|
| 73: | if ($_template->caching) {
|
| 74: | $this->filepath .= '.cache';
|
| 75: | }
|
| 76: | $this->filepath .= '.php';
|
| 77: | $this->timestamp = $this->exists = is_file($this->filepath);
|
| 78: | if ($this->exists) {
|
| 79: | $this->timestamp = filemtime($this->filepath);
|
| 80: | }
|
| 81: | }
|
| 82: |
|
| 83: | |
| 84: | |
| 85: | |
| 86: | |
| 87: | |
| 88: | |
| 89: | |
| 90: |
|
| 91: | public function render(Smarty_Internal_Template $_template)
|
| 92: | {
|
| 93: |
|
| 94: | if (!$_template->source->exists) {
|
| 95: | $type = $_template->source->isConfig ? 'config' : 'template';
|
| 96: | throw new SmartyException("Unable to load {$type} '{$_template->source->type}:{$_template->source->name}'");
|
| 97: | }
|
| 98: | if ($_template->smarty->debugging) {
|
| 99: | if (!isset($_template->smarty->_debug)) {
|
| 100: | $_template->smarty->_debug = new Smarty_Internal_Debug();
|
| 101: | }
|
| 102: | $_template->smarty->_debug->start_render($_template);
|
| 103: | }
|
| 104: | if (!$this->processed) {
|
| 105: | $this->process($_template);
|
| 106: | }
|
| 107: | if (isset($_template->cached)) {
|
| 108: | $_template->cached->file_dependency =
|
| 109: | array_merge($_template->cached->file_dependency, $this->file_dependency);
|
| 110: | }
|
| 111: | if ($_template->source->handler->uncompiled) {
|
| 112: | $_template->source->handler->renderUncompiled($_template->source, $_template);
|
| 113: | } else {
|
| 114: | $this->getRenderedTemplateCode($_template);
|
| 115: | }
|
| 116: | if ($_template->caching && $this->has_nocache_code) {
|
| 117: | $_template->cached->hashes[ $this->nocache_hash ] = true;
|
| 118: | }
|
| 119: | if ($_template->smarty->debugging) {
|
| 120: | $_template->smarty->_debug->end_render($_template);
|
| 121: | }
|
| 122: | }
|
| 123: |
|
| 124: | |
| 125: | |
| 126: | |
| 127: | |
| 128: | |
| 129: | |
| 130: |
|
| 131: | public function process(Smarty_Internal_Template $_smarty_tpl)
|
| 132: | {
|
| 133: | $source = &$_smarty_tpl->source;
|
| 134: | $smarty = &$_smarty_tpl->smarty;
|
| 135: | if ($source->handler->recompiled) {
|
| 136: | $source->handler->process($_smarty_tpl);
|
| 137: | } elseif (!$source->handler->uncompiled) {
|
| 138: | if (!$this->exists || $smarty->force_compile
|
| 139: | || ($_smarty_tpl->compile_check && $source->getTimeStamp() > $this->getTimeStamp())
|
| 140: | ) {
|
| 141: | $this->compileTemplateSource($_smarty_tpl);
|
| 142: | $compileCheck = $_smarty_tpl->compile_check;
|
| 143: | $_smarty_tpl->compile_check = Smarty::COMPILECHECK_OFF;
|
| 144: | $this->loadCompiledTemplate($_smarty_tpl);
|
| 145: | $_smarty_tpl->compile_check = $compileCheck;
|
| 146: | } else {
|
| 147: | $_smarty_tpl->mustCompile = true;
|
| 148: | @include $this->filepath;
|
| 149: | if ($_smarty_tpl->mustCompile) {
|
| 150: | $this->compileTemplateSource($_smarty_tpl);
|
| 151: | $compileCheck = $_smarty_tpl->compile_check;
|
| 152: | $_smarty_tpl->compile_check = Smarty::COMPILECHECK_OFF;
|
| 153: | $this->loadCompiledTemplate($_smarty_tpl);
|
| 154: | $_smarty_tpl->compile_check = $compileCheck;
|
| 155: | }
|
| 156: | }
|
| 157: | $_smarty_tpl->_subTemplateRegister();
|
| 158: | $this->processed = true;
|
| 159: | }
|
| 160: | }
|
| 161: |
|
| 162: | |
| 163: | |
| 164: | |
| 165: | |
| 166: | |
| 167: | |
| 168: |
|
| 169: | public function compileTemplateSource(Smarty_Internal_Template $_template)
|
| 170: | {
|
| 171: | $this->file_dependency = array();
|
| 172: | $this->includes = array();
|
| 173: | $this->nocache_hash = null;
|
| 174: | $this->unifunc = null;
|
| 175: |
|
| 176: | if ($saved_timestamp = (!$_template->source->handler->recompiled && is_file($this->filepath))) {
|
| 177: | $saved_timestamp = $this->getTimeStamp();
|
| 178: | touch($this->filepath);
|
| 179: | }
|
| 180: |
|
| 181: | try {
|
| 182: |
|
| 183: | $_template->loadCompiler();
|
| 184: | $this->write($_template, $_template->compiler->compileTemplate($_template));
|
| 185: | } catch (Exception $e) {
|
| 186: |
|
| 187: | if ($saved_timestamp && is_file($this->filepath)) {
|
| 188: | touch($this->filepath, $saved_timestamp);
|
| 189: | }
|
| 190: | unset($_template->compiler);
|
| 191: | throw $e;
|
| 192: | }
|
| 193: |
|
| 194: | unset($_template->compiler);
|
| 195: | }
|
| 196: |
|
| 197: | |
| 198: | |
| 199: | |
| 200: | |
| 201: | |
| 202: | |
| 203: | |
| 204: | |
| 205: |
|
| 206: | public function write(Smarty_Internal_Template $_template, $code)
|
| 207: | {
|
| 208: | if (!$_template->source->handler->recompiled) {
|
| 209: | if ($_template->smarty->ext->_writeFile->writeFile($this->filepath, $code, $_template->smarty) === true) {
|
| 210: | $this->timestamp = $this->exists = is_file($this->filepath);
|
| 211: | if ($this->exists) {
|
| 212: | $this->timestamp = filemtime($this->filepath);
|
| 213: | return true;
|
| 214: | }
|
| 215: | }
|
| 216: | return false;
|
| 217: | }
|
| 218: | return true;
|
| 219: | }
|
| 220: |
|
| 221: | |
| 222: | |
| 223: | |
| 224: | |
| 225: | |
| 226: | |
| 227: |
|
| 228: | public function read(Smarty_Internal_Template $_template)
|
| 229: | {
|
| 230: | if (!$_template->source->handler->recompiled) {
|
| 231: | return file_get_contents($this->filepath);
|
| 232: | }
|
| 233: | return isset($this->content) ? $this->content : false;
|
| 234: | }
|
| 235: |
|
| 236: | |
| 237: | |
| 238: | |
| 239: | |
| 240: | |
| 241: |
|
| 242: | private function loadCompiledTemplate(Smarty_Internal_Template $_smarty_tpl)
|
| 243: | {
|
| 244: | if (function_exists('opcache_invalidate')
|
| 245: | && (!function_exists('ini_get') || strlen(ini_get("opcache.restrict_api")) < 1)
|
| 246: | ) {
|
| 247: | opcache_invalidate($this->filepath, true);
|
| 248: | } elseif (function_exists('apc_compile_file')) {
|
| 249: | apc_compile_file($this->filepath);
|
| 250: | }
|
| 251: | if (defined('HHVM_VERSION')) {
|
| 252: | eval('?>' . file_get_contents($this->filepath));
|
| 253: | } else {
|
| 254: | include $this->filepath;
|
| 255: | }
|
| 256: | }
|
| 257: | }
|
| 258: | |