joomla_test/libraries/joomla/factory.php
2020-01-02 22:20:31 +07:00

764 lines
17 KiB
PHP

<?php
/**
* @package Joomla.Platform
*
* @copyright Copyright (C) 2005 - 2013 Open Source Matters, Inc. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE
*/
defined('JPATH_PLATFORM') or die;
/**
* Joomla Platform Factory class
*
* @package Joomla.Platform
* @since 11.1
*/
abstract class JFactory
{
/**
* @var JApplication
* @since 11.1
*/
public static $application = null;
/**
* @var JCache
* @since 11.1
*/
public static $cache = null;
/**
* @var JConfig
* @since 11.1
*/
public static $config = null;
/**
* @var array
* @since 11.3
*/
public static $dates = array();
/**
* @var JSession
* @since 11.1
*/
public static $session = null;
/**
* @var JLanguage
* @since 11.1
*/
public static $language = null;
/**
* @var JDocument
* @since 11.1
*/
public static $document = null;
/**
* @var JAccess
* @since 11.1
* @deprecated 13.3 (Platform) & 4.0 (CMS)
*/
public static $acl = null;
/**
* @var JDatabaseDriver
* @since 11.1
*/
public static $database = null;
/**
* @var JMail
* @since 11.1
*/
public static $mailer = null;
/**
* Get a application object.
*
* Returns the global {@link JApplication} object, only creating it if it doesn't already exist.
*
* @param mixed $id A client identifier or name.
* @param array $config An optional associative array of configuration settings.
* @param string $prefix Application prefix
*
* @return JApplication object
*
* @see JApplication
* @since 11.1
* @throws Exception
*/
public static function getApplication($id = null, array $config = array(), $prefix = 'J')
{
if (!self::$application)
{
if (!$id)
{
throw new Exception('Application Instantiation Error', 500);
}
self::$application = JApplication::getInstance($id, $config, $prefix);
}
return self::$application;
}
/**
* Get a configuration object
*
* Returns the global {@link JRegistry} object, only creating it if it doesn't already exist.
*
* @param string $file The path to the configuration file
* @param string $type The type of the configuration file
* @param string $namespace The namespace of the configuration file
*
* @return JRegistry
*
* @see JRegistry
* @since 11.1
*/
public static function getConfig($file = null, $type = 'PHP', $namespace = '')
{
if (!self::$config)
{
if ($file === null)
{
$file = JPATH_PLATFORM . '/config.php';
}
self::$config = self::createConfig($file, $type, $namespace);
}
return self::$config;
}
/**
* Get a session object.
*
* Returns the global {@link JSession} object, only creating it if it doesn't already exist.
*
* @param array $options An array containing session options
*
* @return JSession object
*
* @see JSession
* @since 11.1
*/
public static function getSession(array $options = array())
{
if (!self::$session)
{
self::$session = self::createSession($options);
}
return self::$session;
}
/**
* Get a language object.
*
* Returns the global {@link JLanguage} object, only creating it if it doesn't already exist.
*
* @return JLanguage object
*
* @see JLanguage
* @since 11.1
*/
public static function getLanguage()
{
if (!self::$language)
{
self::$language = self::createLanguage();
}
return self::$language;
}
/**
* Get a document object.
*
* Returns the global {@link JDocument} object, only creating it if it doesn't already exist.
*
* @return JDocument object
*
* @see JDocument
* @since 11.1
*/
public static function getDocument()
{
if (!self::$document)
{
self::$document = self::createDocument();
}
return self::$document;
}
/**
* Get an user object.
*
* Returns the global {@link JUser} object, only creating it if it doesn't already exist.
*
* @param integer $id The user to load - Can be an integer or string - If string, it is converted to ID automatically.
*
* @return JUser object
*
* @see JUser
* @since 11.1
*/
public static function getUser($id = null)
{
$instance = self::getSession()->get('user');
if (is_null($id))
{
if (!($instance instanceof JUser))
{
$instance = JUser::getInstance();
}
}
elseif ($instance->id != $id)
{
$instance = JUser::getInstance($id);
}
return $instance;
}
/**
* Get a cache object
*
* Returns the global {@link JCache} object
*
* @param string $group The cache group name
* @param string $handler The handler to use
* @param string $storage The storage method
*
* @return JCacheController object
*
* @see JCache
*/
public static function getCache($group = '', $handler = 'callback', $storage = null)
{
$hash = md5($group . $handler . $storage);
if (isset(self::$cache[$hash]))
{
return self::$cache[$hash];
}
$handler = ($handler == 'function') ? 'callback' : $handler;
$options = array('defaultgroup' => $group);
if (isset($storage))
{
$options['storage'] = $storage;
}
$cache = JCache::getInstance($handler, $options);
self::$cache[$hash] = $cache;
return self::$cache[$hash];
}
/**
* Get an authorization object
*
* Returns the global {@link JAccess} object, only creating it
* if it doesn't already exist.
*
* @return JAccess object
*
* @deprecated 13.3 (Platform) & 4.0 (CMS) - Use JAccess directly.
*/
public static function getACL()
{
JLog::add(__METHOD__ . ' is deprecated. Use JAccess directly.', JLog::WARNING, 'deprecated');
if (!self::$acl)
{
self::$acl = new JAccess;
}
return self::$acl;
}
/**
* Get a database object.
*
* Returns the global {@link JDatabaseDriver} object, only creating it if it doesn't already exist.
*
* @return JDatabaseDriver
*
* @see JDatabaseDriver
* @since 11.1
*/
public static function getDbo()
{
if (!self::$database)
{
self::$database = self::createDbo();
}
return self::$database;
}
/**
* Get a mailer object.
*
* Returns the global {@link JMail} object, only creating it if it doesn't already exist.
*
* @return JMail object
*
* @see JMail
* @since 11.1
*/
public static function getMailer()
{
if (!self::$mailer)
{
self::$mailer = self::createMailer();
}
$copy = clone self::$mailer;
return $copy;
}
/**
* Get a parsed XML Feed Source
*
* @param string $url Url for feed source.
* @param integer $cache_time Time to cache feed for (using internal cache mechanism).
*
* @return mixed SimplePie parsed object on success, false on failure.
*
* @since 11.1
* @throws BadMethodCallException
* @deprecated 4.0 Use directly JFeedFactory or supply SimplePie instead. Mehod will be proxied to JFeedFactory beginning in 3.2
*/
public static function getFeedParser($url, $cache_time = 0)
{
if (!class_exists('JSimplepieFactory'))
{
throw new BadMethodCallException('JSimplepieFactory not found');
}
JLog::add(__METHOD__ . ' is deprecated. Use JFeedFactory() or supply SimplePie instead.', JLog::WARNING, 'deprecated');
return JSimplepieFactory::getFeedParser($url, $cache_time);
}
/**
* Reads a XML file.
*
* @param string $data Full path and file name.
* @param boolean $isFile true to load a file or false to load a string.
*
* @return mixed JXMLElement or SimpleXMLElement on success or false on error.
*
* @see JXMLElement
* @since 11.1
* @note When JXMLElement is not present a SimpleXMLElement will be returned.
* @deprecated 13.3 (Platform) & 4.0 (CMS) - Use SimpleXML directly.
*/
public static function getXML($data, $isFile = true)
{
JLog::add(__METHOD__ . ' is deprecated. Use SimpleXML directly.', JLog::WARNING, 'deprecated');
$class = 'SimpleXMLElement';
if (class_exists('JXMLElement'))
{
$class = 'JXMLElement';
}
// Disable libxml errors and allow to fetch error information as needed
libxml_use_internal_errors(true);
if ($isFile)
{
// Try to load the XML file
$xml = simplexml_load_file($data, $class);
}
else
{
// Try to load the XML string
$xml = simplexml_load_string($data, $class);
}
if ($xml === false)
{
JLog::add(JText::_('JLIB_UTIL_ERROR_XML_LOAD'), JLog::WARNING, 'jerror');
if ($isFile)
{
JLog::add($data, JLog::WARNING, 'jerror');
}
foreach (libxml_get_errors() as $error)
{
JLog::add($error->message, JLog::WARNING, 'jerror');
}
}
return $xml;
}
/**
* Get an editor object.
*
* @param string $editor The editor to load, depends on the editor plugins that are installed
*
* @return JEditor instance of JEditor
*
* @since 11.1
* @throws BadMethodCallException
* @deprecated 12.3 (Platform) & 4.0 (CMS) - Use JEditor directly
*/
public static function getEditor($editor = null)
{
JLog::add(__METHOD__ . ' is deprecated. Use JEditor directly.', JLog::WARNING, 'deprecated');
if (!class_exists('JEditor'))
{
throw new BadMethodCallException('JEditor not found');
}
JLog::add(__METHOD__ . ' is deprecated. Use JEditor directly.', JLog::WARNING, 'deprecated');
// Get the editor configuration setting
if (is_null($editor))
{
$conf = self::getConfig();
$editor = $conf->get('editor');
}
return JEditor::getInstance($editor);
}
/**
* Return a reference to the {@link JUri} object
*
* @param string $uri Uri name.
*
* @return JUri object
*
* @see JUri
* @since 11.1
* @deprecated 13.3 (Platform) & 4.0 (CMS) - Use JUri directly.
*/
public static function getURI($uri = 'SERVER')
{
JLog::add(__METHOD__ . ' is deprecated. Use JUri directly.', JLog::WARNING, 'deprecated');
return JUri::getInstance($uri);
}
/**
* Return the {@link JDate} object
*
* @param mixed $time The initial time for the JDate object
* @param mixed $tzOffset The timezone offset.
*
* @return JDate object
*
* @see JDate
* @since 11.1
*/
public static function getDate($time = 'now', $tzOffset = null)
{
static $classname;
static $mainLocale;
$language = self::getLanguage();
$locale = $language->getTag();
if (!isset($classname) || $locale != $mainLocale)
{
// Store the locale for future reference
$mainLocale = $locale;
if ($mainLocale !== false)
{
$classname = str_replace('-', '_', $mainLocale) . 'Date';
if (!class_exists($classname))
{
// The class does not exist, default to JDate
$classname = 'JDate';
}
}
else
{
// No tag, so default to JDate
$classname = 'JDate';
}
}
$key = $time . '-' . ($tzOffset instanceof DateTimeZone ? $tzOffset->getName() : (string) $tzOffset);
if (!isset(self::$dates[$classname][$key]))
{
self::$dates[$classname][$key] = new $classname($time, $tzOffset);
}
$date = clone self::$dates[$classname][$key];
return $date;
}
/**
* Create a configuration object
*
* @param string $file The path to the configuration file.
* @param string $type The type of the configuration file.
* @param string $namespace The namespace of the configuration file.
*
* @return JRegistry
*
* @see JRegistry
* @since 11.1
*/
protected static function createConfig($file, $type = 'PHP', $namespace = '')
{
if (is_file($file))
{
include_once $file;
}
// Create the registry with a default namespace of config
$registry = new JRegistry;
// Sanitize the namespace.
$namespace = ucfirst((string) preg_replace('/[^A-Z_]/i', '', $namespace));
// Build the config name.
$name = 'JConfig' . $namespace;
// Handle the PHP configuration type.
if ($type == 'PHP' && class_exists($name))
{
// Create the JConfig object
$config = new $name;
// Load the configuration values into the registry
$registry->loadObject($config);
}
return $registry;
}
/**
* Create a session object
*
* @param array $options An array containing session options
*
* @return JSession object
*
* @since 11.1
*/
protected static function createSession(array $options = array())
{
// Get the editor configuration setting
$conf = self::getConfig();
$handler = $conf->get('session_handler', 'none');
// Config time is in minutes
$options['expire'] = ($conf->get('lifetime')) ? $conf->get('lifetime') * 60 : 900;
$session = JSession::getInstance($handler, $options);
if ($session->getState() == 'expired')
{
$session->restart();
}
return $session;
}
/**
* Create an database object
*
* @return JDatabaseDriver
*
* @see JDatabaseDriver
* @since 11.1
*/
protected static function createDbo()
{
$conf = self::getConfig();
$host = $conf->get('host');
$user = $conf->get('user');
$password = $conf->get('password');
$database = $conf->get('db');
$prefix = $conf->get('dbprefix');
$driver = $conf->get('dbtype');
$debug = $conf->get('debug');
$options = array('driver' => $driver, 'host' => $host, 'user' => $user, 'password' => $password, 'database' => $database, 'prefix' => $prefix);
try
{
$db = JDatabaseDriver::getInstance($options);
}
catch (RuntimeException $e)
{
if (!headers_sent())
{
header('HTTP/1.1 500 Internal Server Error');
}
jexit('Database Error: ' . $e->getMessage());
}
$db->setDebug($debug);
return $db;
}
/**
* Create a mailer object
*
* @return JMail object
*
* @see JMail
* @since 11.1
*/
protected static function createMailer()
{
$conf = self::getConfig();
$smtpauth = ($conf->get('smtpauth') == 0) ? null : 1;
$smtpuser = $conf->get('smtpuser');
$smtppass = $conf->get('smtppass');
$smtphost = $conf->get('smtphost');
$smtpsecure = $conf->get('smtpsecure');
$smtpport = $conf->get('smtpport');
$mailfrom = $conf->get('mailfrom');
$fromname = $conf->get('fromname');
$mailer = $conf->get('mailer');
// Create a JMail object
$mail = JMail::getInstance();
// Set default sender without Reply-to
$mail->SetFrom(JMailHelper::cleanLine($mailfrom), JMailHelper::cleanLine($fromname), 0);
// Default mailer is to use PHP's mail function
switch ($mailer)
{
case 'smtp':
$mail->useSMTP($smtpauth, $smtphost, $smtpuser, $smtppass, $smtpsecure, $smtpport);
break;
case 'sendmail':
$mail->IsSendmail();
break;
default:
$mail->IsMail();
break;
}
return $mail;
}
/**
* Create a language object
*
* @return JLanguage object
*
* @see JLanguage
* @since 11.1
*/
protected static function createLanguage()
{
$conf = self::getConfig();
$locale = $conf->get('language');
$debug = $conf->get('debug_lang');
$lang = JLanguage::getInstance($locale, $debug);
return $lang;
}
/**
* Create a document object
*
* @return JDocument object
*
* @see JDocument
* @since 11.1
*/
protected static function createDocument()
{
$lang = self::getLanguage();
$input = self::getApplication()->input;
$type = $input->get('format', 'html', 'word');
$attributes = array('charset' => 'utf-8', 'lineend' => 'unix', 'tab' => ' ', 'language' => $lang->getTag(),
'direction' => $lang->isRTL() ? 'rtl' : 'ltr');
return JDocument::getInstance($type, $attributes);
}
/**
* Creates a new stream object with appropriate prefix
*
* @param boolean $use_prefix Prefix the connections for writing
* @param boolean $use_network Use network if available for writing; use false to disable (e.g. FTP, SCP)
* @param string $ua UA User agent to use
* @param boolean $uamask User agent masking (prefix Mozilla)
*
* @return JStream
*
* @see JStream
* @since 11.1
*/
public static function getStream($use_prefix = true, $use_network = true, $ua = null, $uamask = false)
{
jimport('joomla.filesystem.stream');
// Setup the context; Joomla! UA and overwrite
$context = array();
$version = new JVersion;
// Set the UA for HTTP and overwrite for FTP
$context['http']['user_agent'] = $version->getUserAgent($ua, $uamask);
$context['ftp']['overwrite'] = true;
if ($use_prefix)
{
$FTPOptions = JClientHelper::getCredentials('ftp');
$SCPOptions = JClientHelper::getCredentials('scp');
if ($FTPOptions['enabled'] == 1 && $use_network)
{
$prefix = 'ftp://' . $FTPOptions['user'] . ':' . $FTPOptions['pass'] . '@' . $FTPOptions['host'];
$prefix .= $FTPOptions['port'] ? ':' . $FTPOptions['port'] : '';
$prefix .= $FTPOptions['root'];
}
elseif ($SCPOptions['enabled'] == 1 && $use_network)
{
$prefix = 'ssh2.sftp://' . $SCPOptions['user'] . ':' . $SCPOptions['pass'] . '@' . $SCPOptions['host'];
$prefix .= $SCPOptions['port'] ? ':' . $SCPOptions['port'] : '';
$prefix .= $SCPOptions['root'];
}
else
{
$prefix = JPATH_ROOT . '/';
}
$retval = new JStream($prefix, JPATH_ROOT, $context);
}
else
{
$retval = new JStream('', '', $context);
}
return $retval;
}
}