summaryrefslogtreecommitdiff
path: root/lib/smarty3/sysplugins/smarty_internal_method_loadplugin.php
blob: 3bd659cb862b01e855cb964ab88411fc0fa3cd06 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
<?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;
    }
}