00001 <?php
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039 include_once( "lib/ezi18n/classes/eztextcodec.php" );
00040 include_once( "lib/eztemplate/classes/eztemplatetreecache.php" );
00041 include_once( "lib/eztemplate/classes/eztemplatecompiler.php" );
00042
00043 class eZTemplateFileResource
00044 {
00045
00046
00047
00048
00049
00050 function eZTemplateFileResource( $name = "file", $servesStaticData = true )
00051 {
00052 $this->Name = $name;
00053 $this->ServesStaticData = $servesStaticData;
00054 $this->TemplateCache = array();
00055 }
00056
00057
00058
00059
00060 function resourceName()
00061 {
00062 return $this->Name;
00063 }
00064
00065
00066
00067
00068
00069 function servesStaticData()
00070 {
00071 return $this->ServesStaticData;
00072 }
00073
00074
00075
00076 function templateNodeTransformation( $functionName, &$node,
00077 &$tpl, &$resourceData, $parameters, $namespaceValue )
00078 {
00079 if ( $this->Name != 'file' )
00080 return false;
00081 $file = $resourceData['template-name'];
00082 if ( !file_exists( $file ) )
00083 return false;
00084 $newNodes = array();
00085 $newNodes[] = eZTemplateNodeTool::createResourceAcquisitionNode( $resourceData['resource'],
00086 $file, $file,
00087 EZ_RESOURCE_FETCH, false,
00088 $node[4],
00089 array(),
00090 $namespaceValue );
00091 return $newNodes;
00092 }
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103 function cacheKey( $keyData, $res, $templatePath, &$extraParameters )
00104 {
00105 $key = md5( $keyData );
00106 return $key;
00107 }
00108
00109
00110
00111
00112 function hasCachedProcessTree( $keyData, $uri, $res, $templatePath, &$extraParameters, $timestamp )
00113 {
00114 return false;
00115 $key = $this->cacheKey( $keyData, $res, $templatePath, $extraParameters );
00116 if ( eZTemplateTreeCache::canRestoreCache( $key, $timestamp, $templatePath ) )
00117 eZTemplateTreeCache::restoreCache( $key, $templatePath );
00118 return eZTemplateTreeCache::cachedTree( $key, $uri, $res, $templatePath, $extraParameters );
00119 }
00120
00121
00122
00123
00124 function compileTemplate( &$tpl, $keyData, $uri, $res, $templatePath, &$extraParameters, &$resourceData )
00125 {
00126 $key = $this->cacheKey( $keyData, $res, $templatePath, $extraParameters );
00127 return eZTemplateCompiler::compileTemplate( $tpl, $key, $resourceData );
00128 }
00129
00130
00131
00132
00133 function executeCompiledTemplate( &$tpl, &$textElements,
00134 $keyData, $uri, $resourceData, $templatePath,
00135 &$extraParameters, $timestamp,
00136 $rootNamespace, $currentNamespace )
00137 {
00138 $key = $this->cacheKey( $keyData, $resourceData, $templatePath, $extraParameters );
00139 return eZTemplateCompiler::executeCompilation( $tpl, $textElements, $key, $resourceData,
00140 $rootNamespace, $currentNamespace );
00141 }
00142
00143
00144
00145
00146 function hasCompiledTemplate( $keyData, $uri, &$resourceData, $templatePath, &$extraParameters, $timestamp )
00147 {
00148 $key = $this->cacheKey( $keyData, $resourceData, $templatePath, $extraParameters );
00149 return eZTemplateCompiler::hasCompiledTemplate( $key, $timestamp, $resourceData );
00150 }
00151
00152
00153
00154
00155 function canCompileTemplate( &$tpl, &$resourceData, &$extraParameters )
00156 {
00157 return eZTemplateCompiler::isCompilationEnabled();
00158 }
00159
00160
00161
00162
00163 function cachedTemplateTree( $keyData, $uri, $res, $templatePath, &$extraParameters, $timestamp )
00164 {
00165 $key = $this->cacheKey( $keyData, $res, $templatePath, $extraParameters );
00166 if ( eZTemplateTreeCache::canRestoreCache( $key, $timestamp, $templatePath ) )
00167 eZTemplateTreeCache::restoreCache( $key, $templatePath );
00168 return eZTemplateTreeCache::cachedTree( $key, $uri, $res, $templatePath, $extraParameters );
00169 }
00170
00171
00172
00173
00174 function setCachedTemplateTree( $keyData, $uri, $res, $templatePath, &$extraParameters, &$root )
00175 {
00176 $key = $this->cacheKey( $keyData, $res, $templatePath, $extraParameters );
00177 eZTemplateTreeCache::setCachedTree( $key, $uri, $res, $templatePath, $extraParameters, $root );
00178 eZTemplateTreeCache::storeCache( $key, $templatePath );
00179 }
00180
00181
00182
00183
00184
00185 function handleResource( &$tpl, &$resourceData, $method, &$extraParameters )
00186 {
00187 return $this->handleResourceData( $tpl, $this, $resourceData, $method, $extraParameters );
00188 }
00189
00190
00191
00192
00193
00194
00195
00196
00197 function handleResourceData( &$tpl, &$handler, &$resourceData, $method, &$extraParameters )
00198 {
00199
00200 $templateRoot =& $resourceData['root-node'];
00201 $text =& $resourceData['text'];
00202 $tstamp =& $resourceData['time-stamp'];
00203 $uri =& $resourceData['uri'];
00204 $resourceName =& $resourceData['resource'];
00205 $path =& $resourceData['template-filename'];
00206 $keyData =& $resourceData['key-data'];
00207 $localeData =& $resourceData['locales'];
00208
00209 if ( !file_exists( $path ) )
00210 return false;
00211 $tstamp = filemtime( $path );
00212 $result = false;
00213 $canCache = true;
00214 $templateRoot = null;
00215 if ( !$handler->servesStaticData() )
00216 $canCache = false;
00217 if ( !$tpl->isCachingAllowed() )
00218 $canCache = false;
00219 $keyData = 'file:' . $path;
00220 if ( $method == EZ_RESOURCE_FETCH )
00221 {
00222 if ( $canCache )
00223 {
00224 if ( $handler->hasCompiledTemplate( $keyData, $uri, $resourceData, $path, $extraParameters, $tstamp ) )
00225 {
00226 $resourceData['compiled-template'] = true;
00227 return true;
00228 }
00229 }
00230 if ( $canCache )
00231 $templateRoot = $handler->cachedTemplateTree( $keyData, $uri, $resourceName, $path, $extraParameters, $tstamp );
00232
00233 if ( $templateRoot !== null )
00234 return true;
00235
00236 if ( is_readable( $path ) )
00237 {
00238 $text = file_get_contents( $path );
00239 $text = preg_replace( "/\n|\r\n|\r/", "\n", $text );
00240 $tplINI =& $tpl->ini();
00241 $charset = $tplINI->variable( 'CharsetSettings', 'DefaultTemplateCharset' );
00242 $locales = array();
00243 $pos = strpos( $text, "\n" );
00244 if ( $pos !== false )
00245 {
00246 $line = substr( $text, 0, $pos );
00247 if ( preg_match( "/^\{\*\?template(.+)\?\*\}/", $line, $tpl_arr ) )
00248 {
00249 $args = explode( " ", trim( $tpl_arr[1] ) );
00250 foreach ( $args as $arg )
00251 {
00252 $vars = explode( '=', trim( $arg ) );
00253 switch ( $vars[0] ) {
00254 case 'charset': {
00255 $val = $vars[1];
00256 if ( $val[0] == '"' and
00257 strlen( $val ) > 0 and
00258 $val[strlen($val)-1] == '"' )
00259 {
00260 $val = substr( $val, 1, strlen($val) - 2 );
00261 }
00262 $charset = $val;
00263 } break;
00264 case 'locale': {
00265 $val = $vars[1];
00266 if ( $val[0] == '"' and
00267 strlen( $val ) > 0 and
00268 $val[strlen($val)-1] == '"' )
00269 {
00270 $val = substr( $val, 1, strlen($val) - 2 );
00271 }
00272 $locales = explode( ',', $val );
00273 } break;
00274 }
00275 }
00276 }
00277 }
00278
00279
00280
00281 $defaultLocale = trim( $tplINI->variable( 'CharsetSettings', 'DefaultTemplateLocale' ) );
00282 if ( $defaultLocale != '' )
00283 {
00284 $locales = array_merge( $locales, explode( ',', $defaultLocale ) );
00285 }
00286 $localeData = $locales;
00287 if ( $locales && count( $locales ) )
00288 {
00289 setlocale( LC_CTYPE, $locales );
00290 }
00291
00292 if ( eZTemplate::isDebugEnabled() )
00293 eZDebug::writeNotice( "$path, $charset" );
00294 $codec =& eZTextCodec::instance( $charset, false, false );
00295 if ( $codec )
00296 {
00297 eZDebug::accumulatorStart( 'template_resource_conversion', 'template_total', 'String conversion in template resource' );
00298 $text = $codec->convertString( $text );
00299 eZDebug::accumulatorStop( 'template_resource_conversion', 'template_total', 'String conversion in template resource' );
00300 }
00301 $result = true;
00302 }
00303 }
00304 else if ( $method == EZ_RESOURCE_QUERY )
00305 $result = true;
00306 return $result;
00307 }
00308
00309
00310
00311 var $Name;
00312
00313 var $ServesStaticData;
00314
00315 var $TemplateCache;
00316 }
00317
00318 ?>