/** * Class autoloader * * Include classes automatically when they are instantiated. * @param string */ function __autoload($strClassName) { $objCache = FileCache::getInstance('autoload'); // Try to load the class name from the session cache if (!$GLOBALS['TL_CONFIG']['debugMode'] && isset($objCache->{$strClassName})) { if (@(include_once TL_ROOT . '/' . $objCache->{$strClassName})) { return; // The class could be loaded } else { unset($objCache->{$strClassName}); // The class has been removed } } $strLibrary = TL_ROOT . '/system/libraries/' . $strClassName . '.php'; // Check for libraries first if (file_exists($strLibrary)) { include_once $strLibrary; $objCache->{$strClassName} = 'system/libraries/' . $strClassName . '.php'; return; } // Then check the modules folder foreach (scan(TL_ROOT . '/system/modules/') as $strFolder) { if (substr($strFolder, 0, 1) == '.') { continue; } $strModule = TL_ROOT . '/system/modules/' . $strFolder . '/' . $strClassName . '.php'; if (file_exists($strModule)) { include_once $strModule; $objCache->{$strClassName} = 'system/modules/' . $strFolder . '/' . $strClassName . '.php'; return; } } // HOOK: include Swift classes if (class_exists('Swift', false)) { Swift::autoload($strClassName); return; } // HOOK: include DOMPDF classes if (function_exists('DOMPDF_autoload')) { DOMPDF_autoload($strClassName); return; } trigger_error(sprintf('Could not load class %s', $strClassName), E_USER_ERROR); }
/** * Update the file cache if a template is deleted * @return string */ public function deleteFromTemplateCache($strFile) { $objCache = FileCache::getInstance('templates'); $strKey = preg_replace('/^.*\\/([^\\/]+)\\.[a-z0-9]{3,5}$/i', '$1', $strFile); unset($objCache->{$strKey}); }
/** * Find a particular template file and return its path * @param string * @param string * @return string * @throws Exception */ protected function getTemplate($strTemplate, $strFormat = 'html5', $blnFailIfNotFound = false) { $strTemplate = basename($strTemplate); // Contao 3.X only. if (version_compare(VERSION, '3.0', '>=')) { // Check for a theme folder if (TL_MODE == 'FE') { global $objPage; $strCustom = str_replace('../', '', $objPage->templateGroup); if ($strCustom != '') { return \TemplateLoader::getPath($strTemplate, $strFormat, $strCustom); } } return \TemplateLoader::getPath($strTemplate, $strFormat); } // Contao 2.X from here on. $strKey = $strFilename = $strTemplate . '.' . $strFormat; // Check for a theme folder if (TL_MODE == 'FE') { global $objPage; $strTemplateGroup = str_replace(array('../', 'templates/'), '', $objPage->templateGroup); if ($strTemplateGroup != '') { $strKey = $strTemplateGroup . '/' . $strKey; } } $objCache = FileCache::getInstance('templates'); // Try to load the template path from the cache if (!$GLOBALS['TL_CONFIG']['debugMode'] && isset($objCache->{$strKey})) { if (file_exists(TL_ROOT . '/' . $objCache->{$strKey})) { return TL_ROOT . '/' . $objCache->{$strKey}; } else { unset($objCache->{$strKey}); } } $strPath = TL_ROOT . '/templates'; // Check the theme folder first if (TL_MODE == 'FE' && $strTemplateGroup != '') { $strFile = $strPath . '/' . $strTemplateGroup . '/' . $strFilename; if (file_exists($strFile)) { $objCache->{$strKey} = 'templates/' . $strTemplateGroup . '/' . $strFilename; return $strFile; } } // Then check the global templates directory $strFile = $strPath . '/' . $strFilename; if (file_exists($strFile)) { $objCache->{$strKey} = 'templates/' . $strFilename; return $strFile; } // At last browse all module folders in reverse order foreach (array_reverse(Config::getInstance()->getActiveModules()) as $strModule) { $strFile = TL_ROOT . '/system/modules/' . $strModule . '/templates/' . $strFilename; if (file_exists($strFile)) { $objCache->{$strKey} = 'system/modules/' . $strModule . '/templates/' . $strFilename; return $strFile; } } if ($blnFailIfNotFound) { throw new Exception('Could not find template file "' . $strFilename . '"'); } }
/** * Return true if a class file exists * @param string * @param boolean */ protected function classFileExists($strClass, $blnNoCache = false) { if ($strClass == '') { return false; } // Try to load from cache if (!$blnNoCache) { // Handle multiple requests for the same class if (isset($this->arrCache[$strClass])) { return $this->arrCache[$strClass]; } $objCache = FileCache::getInstance('classes'); // Check the file cache if (isset($objCache->{$strClass})) { $this->arrCache[$strClass] = $objCache->{$strClass}; return $objCache->{$strClass}; } else { unset($objCache->{$strClass}); } } $this->import('Config'); // see ticket #152 $this->arrCache[$strClass] = false; // Browse all modules foreach ($this->Config->getActiveModules() as $strModule) { $strFile = 'system/modules/' . $strModule . '/' . $strClass . '.php'; if (file_exists(TL_ROOT . '/' . $strFile)) { // Also store the result in the autoloader cache, so the // function does not have to browse the module folders again $objAutoload = FileCache::getInstance('autoload'); $objAutoload->{$strClass} = $strFile; $this->arrCache[$strClass] = true; break; } } // Remember the result if (!$blnNoCache) { $objCache->{$strClass} = $this->arrCache[$strClass]; } return $this->arrCache[$strClass]; }
scanTwigCacheDirectories('system/cache/twig'); } } else { /** * Maintenance */ $GLOBALS['TL_MAINTENANCE'][] = 'PurgeTwigCache'; } if (!file_exists(TL_ROOT . '/system/cache/twig')) { mkdir(TL_ROOT . '/system/cache/twig', 0777, true); } /** * Content elements */ $GLOBALS['TL_CTE']['texts']['twig'] = 'ContentTwig'; /** * Front end modules */ $GLOBALS['FE_MOD']['miscellaneous']['twig'] = 'ModuleTwig'; if (version_compare(VERSION, '3', '<')) { spl_autoload_unregister('__autoload'); require_once TL_ROOT . '/system/modules/twig/classes/vendor/autoload.php'; spl_autoload_register('__autoload'); $classes = array('TwigHybrid', 'ContaoTwig', 'TwigModule', 'ModuleTwig', 'ContaoTwigExtension', 'ContaoTwigRefererAccessObject', 'ContaoTwigEnvironmentAccessObject', 'TwigFrontendTemplate', 'TwigBackendModule', 'PurgeTwigCache', 'TwigHelper', 'ContaoTwigGlobalAccessObject', 'TwigTemplate', 'TwigBackendTemplate', 'TwigCustomPagination', 'TwigSimpleHybrid', 'TwigPagination', 'ContentTwig', 'TwigContentElement'); $cache = FileCache::getInstance('classes'); foreach ($classes as $class) { if (!$cache->{$class}) { $cache->{$class} = true; } } }
/** * Return true if a class file exists * @param string * @param boolean * @return boolean */ protected function classFileExists($strClass, $blnNoCache=false) { if ($strClass == '') { return false; } $this->import('Cache'); $strKey = __METHOD__ . '-' . $strClass; // Try to load from cache if (!$blnNoCache) { // Handle multiple requests for the same class if (isset($this->Cache->$strKey)) { return $this->Cache->$strKey; } $objCache = FileCache::getInstance('classes'); // Check the file cache if (!$GLOBALS['TL_CONFIG']['debugMode'] && isset($objCache->$strClass)) { $this->Cache->$strKey = $objCache->$strClass; return $objCache->$strClass; } } $this->import('Config'); // see ticket #152 $this->Cache->$strKey = false; // Browse all modules foreach ($this->Config->getActiveModules() as $strModule) { $strFile = 'system/modules/' . $strModule . '/' . $strClass . '.php'; if (file_exists(TL_ROOT . '/' . $strFile)) { // Also store the result in the autoloader cache, so the // function does not have to browse the module folders again $objAutoload = FileCache::getInstance('autoload'); $objAutoload->$strClass = $strFile; $this->Cache->$strKey = true; break; } } // Remember the result if (!$blnNoCache) { $objCache->$strClass = $this->Cache->$strKey; } return $this->Cache->$strKey; }