X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=lib%2Fplugin.php;h=f97a07fe5ae5cae34da4a9b1e56c9c7fce82bc69;hb=de55d8f83bb2ecf9461510768fe7147aec592055;hp=ee57f590435f8a2093d066247ade5b634e72f82f;hpb=0f1fc36a05c8d858827718255bef20e8d0c0d3f6;p=quix0rs-gnu-social.git diff --git a/lib/plugin.php b/lib/plugin.php index ee57f59043..f97a07fe5a 100644 --- a/lib/plugin.php +++ b/lib/plugin.php @@ -79,6 +79,49 @@ class Plugin return true; } + /** + * Load related modules when needed + * + * Most non-trivial plugins will require extra modules to do their work. Typically + * these include data classes, action classes, widget classes, or external libraries. + * + * This method receives a class name and loads the PHP file related to that class. By + * tradition, action classes typically have files named for the action, all lower-case. + * Data classes are in files with the data class name, initial letter capitalized. + * + * Note that this method will be called for *all* overloaded classes, not just ones + * in this plugin! So, make sure to return true by default to let other plugins, and + * the core code, get a chance. + * + * @param string $cls Name of the class to be loaded + * + * @return boolean hook value; true means continue processing, false means stop. + */ + public function onAutoload($cls) { + $cls = basename($cls); + $basedir = INSTALLDIR . '/plugins/' . mb_substr(get_called_class(), 0, -6); + $file = null; + + if (preg_match('/^(\w+)(Action|Form)$/', $cls, $type)) { + $type = array_map('strtolower', $type); + $file = "$basedir/{$type[2]}s/{$type[1]}.php"; + } else { + $file = "$basedir/classes/{$cls}.php"; + + if (!file_exists($file)) { + $type = strtolower($cls); + $file = "$basedir/lib/{$type}.php"; + } + } + + if (!is_null($file) && file_exists($file)) { + require_once($file); + return false; + } + + return true; + } + /** * Checks if this plugin has localization that needs to be set up. * Gettext localizations can be called via the _m() helper function. @@ -88,7 +131,12 @@ class Plugin $class = get_class($this); if (substr($class, -6) == 'Plugin') { $name = substr($class, 0, -6); - $path = INSTALLDIR . "/plugins/$name/locale"; + $path = common_config('plugins', 'locale_path'); + if (!$path) { + // @fixme this will fail for things installed in local/plugins + // ... but then so will web links so far. + $path = INSTALLDIR . "/plugins/$name/locale"; + } if (file_exists($path) && is_dir($path)) { bindtextdomain($name, $path); bind_textdomain_codeset($name, 'UTF-8'); @@ -105,11 +153,16 @@ class Plugin { $this->log(LOG_DEBUG, $msg); } + + function name() + { + $cls = get_class($this); + return mb_substr($cls, 0, -6); + } function onPluginVersion(&$versions) { - $cls = get_class($this); - $name = mb_substr($cls, 0, -6); + $name = $this->name(); $versions[] = array('name' => $name, // TRANS: Displayed as version information for a plugin if no version information was found. @@ -117,4 +170,56 @@ class Plugin return true; } + + function path($relative) + { + return self::staticPath($this->name(), $relative); + } + + static function staticPath($plugin, $relative) + { + $isHTTPS = StatusNet::isHTTPS(); + + if ($isHTTPS) { + $server = common_config('plugins', 'sslserver'); + } else { + $server = common_config('plugins', 'server'); + } + + if (empty($server)) { + if ($isHTTPS) { + $server = common_config('site', 'sslserver'); + } + if (empty($server)) { + $server = common_config('site', 'server'); + } + } + + if ($isHTTPS) { + $path = common_config('plugins', 'sslpath'); + } else { + $path = common_config('plugins', 'path'); + } + + if (empty($path)) { + // XXX: extra stat(). + if (@file_exists(INSTALLDIR.'/local/plugins/'.$plugin.'/'.$relative)) { + $path = common_config('site', 'path') . '/local/plugins/'; + } else { + $path = common_config('site', 'path') . '/plugins/'; + } + } + + if ($path[strlen($path)-1] != '/') { + $path .= '/'; + } + + if ($path[0] != '/') { + $path = '/'.$path; + } + + $protocol = ($isHTTPS) ? 'https' : 'http'; + + return $protocol.'://'.$server.$path.$plugin.'/'.$relative; + } }