smarty_template_source.php (8459B)
1 <?php 2 3 /** 4 * Smarty Resource Data Object 5 * Meta Data Container for Template Files 6 * 7 * @package Smarty 8 * @subpackage TemplateResources 9 * @author Rodney Rehm 10 * @property integer $timestamp Source Timestamp 11 * @property boolean $exists Source Existence 12 * @property boolean $template Extended Template reference 13 * @property string $content Source Content 14 */ 15 class Smarty_Template_Source 16 { 17 /** 18 * Name of the Class to compile this resource's contents with 19 * 20 * @var string 21 */ 22 public $compiler_class = null; 23 24 /** 25 * Name of the Class to tokenize this resource's contents with 26 * 27 * @var string 28 */ 29 public $template_lexer_class = null; 30 31 /** 32 * Name of the Class to parse this resource's contents with 33 * 34 * @var string 35 */ 36 public $template_parser_class = null; 37 38 /** 39 * Unique Template ID 40 * 41 * @var string 42 */ 43 public $uid = null; 44 45 /** 46 * Template Resource (Smarty_Internal_Template::$template_resource) 47 * 48 * @var string 49 */ 50 public $resource = null; 51 52 /** 53 * Resource Type 54 * 55 * @var string 56 */ 57 public $type = null; 58 59 /** 60 * Resource Name 61 * 62 * @var string 63 */ 64 public $name = null; 65 66 /** 67 * Unique Resource Name 68 * 69 * @var string 70 */ 71 public $unique_resource = null; 72 73 /** 74 * Source Filepath 75 * 76 * @var string 77 */ 78 public $filepath = null; 79 /** 80 * Source File Base name 81 * 82 * @var string 83 */ 84 public $basename = null; 85 86 /** 87 * The Components an extended template is made of 88 * 89 * @var array 90 */ 91 public $components = null; 92 93 /** 94 * Resource Handler 95 * 96 * @var Smarty_Resource 97 */ 98 public $handler = null; 99 100 /** 101 * Smarty instance 102 * 103 * @var Smarty 104 */ 105 public $smarty = null; 106 /** 107 * Resource is source 108 * 109 * @var bool 110 */ 111 public $isConfig = false; 112 /** 113 * Source is bypassing compiler 114 * 115 * @var boolean 116 */ 117 public $uncompiled = false; 118 119 /** 120 * Source must be recompiled on every occasion 121 * 122 * @var boolean 123 */ 124 public $recompiled = false; 125 /** 126 * cache for Smarty_Template_Compiled instances 127 * 128 * @var array 129 */ 130 public $compileds = array(); 131 132 /** 133 * create Source Object container 134 * 135 * @param Smarty_Resource $handler Resource Handler this source object communicates with 136 * @param Smarty $smarty Smarty instance this source object belongs to 137 * @param string $resource full template_resource 138 * @param string $type type of resource 139 * @param string $name resource name 140 * 141 * @internal param string $unique_resource unique resource name 142 */ 143 public function __construct(Smarty_Resource $handler, Smarty $smarty, $resource, $type, $name) 144 { 145 $this->handler = $handler; // Note: prone to circular references 146 147 $this->recompiled = $handler->recompiled; 148 $this->uncompiled = $handler->uncompiled; 149 $this->compiler_class = $handler->compiler_class; 150 $this->template_lexer_class = $handler->template_lexer_class; 151 $this->template_parser_class = $handler->template_parser_class; 152 153 $this->smarty = $smarty; 154 $this->resource = $resource; 155 $this->type = $type; 156 $this->name = $name; 157 } 158 159 /** 160 * initialize Source Object for given resource 161 * Either [$_template] or [$smarty, $template_resource] must be specified 162 * 163 * @param Smarty_Internal_Template $_template template object 164 * @param Smarty $smarty smarty object 165 * @param string $template_resource resource identifier 166 * 167 * @return Smarty_Template_Source Source Object 168 * @throws SmartyException 169 */ 170 public static function load(Smarty_Internal_Template $_template = null, Smarty $smarty = null, $template_resource = null) 171 { 172 if ($_template) { 173 $smarty = $_template->smarty; 174 $template_resource = $_template->template_resource; 175 } 176 if (empty($template_resource)) { 177 throw new SmartyException('Missing template name'); 178 } 179 // parse resource_name, load resource handler, identify unique resource name 180 list($name, $type) = Smarty_Resource::parseResourceName($template_resource, $smarty->default_resource_type); 181 $resource = Smarty_Resource::load($smarty, $type); 182 // if resource is not recompiling and resource name is not dotted we can check the source cache 183 if ($smarty->resource_caching && !$resource->recompiled && !(isset($name[1]) && $name[0] == '.' && ($name[1] == '.' || $name[1] == '/'))) { 184 $unique_resource = $resource->buildUniqueResourceName($smarty, $name); 185 if (isset($smarty->source_objects[$unique_resource])) { 186 return $smarty->source_objects[$unique_resource]; 187 } 188 } else { 189 $unique_resource = null; 190 } 191 // create new source object 192 $source = new Smarty_Template_Source($resource, $smarty, $template_resource, $type, $name); 193 $resource->populate($source, $_template); 194 if ((!isset($source->exists) || !$source->exists) && isset($_template->smarty->default_template_handler_func)) { 195 Smarty_Internal_Extension_DefaultTemplateHandler::_getDefault($_template, $source, $resObj); 196 } 197 // on recompiling resources we are done 198 if ($smarty->resource_caching && !$resource->recompiled) { 199 // may by we have already $unique_resource 200 $is_relative = false; 201 if (!isset($unique_resource)) { 202 $is_relative = isset($name[1]) && $name[0] == '.' && ($name[1] == '.' || $name[1] == '/') && 203 ($type == 'file' || (isset($_template->parent->source) && $_template->parent->source->type == 'extends')); 204 $unique_resource = $resource->buildUniqueResourceName($smarty, $is_relative ? $source->filepath . $name : $name); 205 } 206 $source->unique_resource = $unique_resource; 207 // save in runtime cache if not relative 208 if (!$is_relative) { 209 $smarty->source_objects[$unique_resource] = $source; 210 } 211 } 212 return $source; 213 } 214 215 /** 216 * render the uncompiled source 217 * 218 * @param Smarty_Internal_Template $_template template object 219 */ 220 public function renderUncompiled(Smarty_Internal_Template $_template) 221 { 222 $level = ob_get_level(); 223 ob_start(); 224 try { 225 $this->handler->renderUncompiled($_template->source, $_template); 226 return ob_get_clean(); 227 } 228 catch (Exception $e) { 229 while (ob_get_level() > $level) { 230 ob_end_clean(); 231 } 232 throw $e; 233 } 234 } 235 236 /** 237 * <<magic>> Generic Setter. 238 * 239 * @param string $property_name valid: timestamp, exists, content, template 240 * @param mixed $value new value (is not checked) 241 * 242 * @throws SmartyException if $property_name is not valid 243 */ 244 public function __set($property_name, $value) 245 { 246 switch ($property_name) { 247 // regular attributes 248 case 'timestamp': 249 case 'exists': 250 case 'content': 251 // required for extends: only 252 case 'template': 253 $this->$property_name = $value; 254 break; 255 256 default: 257 throw new SmartyException("source property '$property_name' does not exist."); 258 } 259 } 260 261 /** 262 * <<magic>> Generic getter. 263 * 264 * @param string $property_name valid: timestamp, exists, content 265 * 266 * @return mixed 267 * @throws SmartyException if $property_name is not valid 268 */ 269 public function __get($property_name) 270 { 271 switch ($property_name) { 272 case 'timestamp': 273 case 'exists': 274 $this->handler->populateTimestamp($this); 275 276 return $this->$property_name; 277 278 case 'content': 279 return $this->content = $this->handler->getContent($this); 280 281 default: 282 throw new SmartyException("source property '$property_name' does not exist."); 283 } 284 } 285 }