<?php /** * Smarty Extension Loadplugin * * $smarty->loadPlugin() method * * @package Smarty * @subpackage PluginsInternal * @author Uwe Tews */ class Smarty_Internal_Method_LoadPlugin { /** * Cache of searched plugin files * * @var array */ public $plugin_files = array(); /** * Takes unknown classes and loads plugin files for them * class name format: Smarty_PluginType_PluginName * plugin filename format: plugintype.pluginname.php * * @param \Smarty $smarty * @param string $plugin_name class plugin name to load * @param bool $check check if already loaded * * @return bool|string * @throws \SmartyException */ public function loadPlugin(Smarty $smarty, $plugin_name, $check) { // if function or class exists, exit silently (already loaded) if ($check && (is_callable($plugin_name) || class_exists($plugin_name, false))) { return true; } if (!preg_match('#^smarty_((internal)|([^_]+))_(.+)$#i', $plugin_name, $match)) { throw new SmartyException("plugin {$plugin_name} is not a valid name format"); } if (!empty($match[ 2 ])) { $file = SMARTY_SYSPLUGINS_DIR . strtolower($plugin_name) . '.php'; if (isset($this->plugin_files[ $file ])) { if ($this->plugin_files[ $file ] !== false) { return $this->plugin_files[ $file ]; } else { return false; } } else { if (is_file($file)) { $this->plugin_files[ $file ] = $file; include_once $file; return $file; } else { $this->plugin_files[ $file ] = false; return false; } } } // plugin filename is expected to be: [type].[name].php $_plugin_filename = "{$match[1]}.{$match[4]}.php"; $_lower_filename = strtolower($_plugin_filename); if (isset($this->plugin_files)) { if (isset($this->plugin_files[ 'plugins_dir' ][ $_lower_filename ])) { if (!$smarty->use_include_path || $this->plugin_files[ 'plugins_dir' ][ $_lower_filename ] !== false) { return $this->plugin_files[ 'plugins_dir' ][ $_lower_filename ]; } } if (!$smarty->use_include_path || $smarty->ext->_getIncludePath->isNewIncludePath($smarty)) { unset($this->plugin_files[ 'include_path' ]); } else { if (isset($this->plugin_files[ 'include_path' ][ $_lower_filename ])) { return $this->plugin_files[ 'include_path' ][ $_lower_filename ]; } } } $_file_names = array($_plugin_filename); if ($_lower_filename !== $_plugin_filename) { $_file_names[] = $_lower_filename; } $_p_dirs = $smarty->getPluginsDir(); if (!isset($this->plugin_files[ 'plugins_dir' ][ $_lower_filename ])) { // loop through plugin dirs and find the plugin foreach ($_p_dirs as $_plugin_dir) { foreach ($_file_names as $name) { $file = $_plugin_dir . $name; if (is_file($file)) { $this->plugin_files[ 'plugins_dir' ][ $_lower_filename ] = $file; include_once $file; return $file; } $this->plugin_files[ 'plugins_dir' ][ $_lower_filename ] = false; } } } if ($smarty->use_include_path) { foreach ($_file_names as $_file_name) { // try PHP include_path $file = $smarty->ext->_getIncludePath->getIncludePath($_p_dirs, $_file_name, $smarty); $this->plugin_files[ 'include_path' ][ $_lower_filename ] = $file; if ($file !== false) { include_once $file; return $file; } } } // no plugin loaded return false; } }