781 lines
		
	
	
		
			20 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			781 lines
		
	
	
		
			20 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| /**
 | |
|  *  @package     FrameworkOnFramework
 | |
|  *  @subpackage  autoloader
 | |
|  *  @copyright   Copyright (C) 2010-2016 Nicholas K. Dionysopoulos / Akeeba Ltd. All rights reserved.
 | |
|  *  @license     GNU General Public License version 2, or later
 | |
|  */
 | |
| 
 | |
| defined('F0F_INCLUDED') or die();
 | |
| 
 | |
| /**
 | |
|  * An autoloader for F0F-powered components. It allows the autoloading of
 | |
|  * various classes related to the operation of a component, from Controllers
 | |
|  * and Models to Helpers and Fields. If a class doesn't exist, it will be
 | |
|  * created on the fly.
 | |
|  *
 | |
|  * @package  FrameworkOnFramework
 | |
|  * @subpackage  autoloader
 | |
|  * @since    2.1
 | |
|  */
 | |
| class F0FAutoloaderComponent
 | |
| {
 | |
| 	/**
 | |
| 	 * An instance of this autoloader
 | |
| 	 *
 | |
| 	 * @var   F0FAutoloaderComponent
 | |
| 	 */
 | |
| 	public static $autoloader = null;
 | |
| 
 | |
| 	/**
 | |
| 	 * The path to the F0F root directory
 | |
| 	 *
 | |
| 	 * @var   string
 | |
| 	 */
 | |
| 	public static $fofPath = null;
 | |
| 
 | |
| 	/**
 | |
| 	 * An array holding component names and their F0F-ness status
 | |
| 	 *
 | |
| 	 * @var   array
 | |
| 	 */
 | |
| 	protected static $fofComponents = array();
 | |
| 
 | |
| 	/**
 | |
| 	 * Initialise this autoloader
 | |
| 	 *
 | |
| 	 * @return  F0FAutoloaderComponent
 | |
| 	 */
 | |
| 	public static function init()
 | |
| 	{
 | |
| 		if (self::$autoloader == null)
 | |
| 		{
 | |
| 			self::$autoloader = new self;
 | |
| 		}
 | |
| 
 | |
| 		return self::$autoloader;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Public constructor. Registers the autoloader with PHP.
 | |
| 	 */
 | |
| 	public function __construct()
 | |
| 	{
 | |
| 		self::$fofPath = realpath(__DIR__ . '/../');
 | |
| 
 | |
| 		spl_autoload_register(array($this,'autoload_fof_controller'));
 | |
| 		spl_autoload_register(array($this,'autoload_fof_model'));
 | |
| 		spl_autoload_register(array($this,'autoload_fof_view'));
 | |
| 		spl_autoload_register(array($this,'autoload_fof_table'));
 | |
| 		spl_autoload_register(array($this,'autoload_fof_helper'));
 | |
| 		spl_autoload_register(array($this,'autoload_fof_toolbar'));
 | |
| 		spl_autoload_register(array($this,'autoload_fof_field'));
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Returns true if this is a F0F-powered component, i.e. if it has a fof.xml
 | |
| 	 * file in its main directory.
 | |
| 	 *
 | |
| 	 * @param   string  $component  The component's name
 | |
| 	 *
 | |
| 	 * @return  boolean
 | |
| 	 */
 | |
| 	public function isF0FComponent($component)
 | |
| 	{
 | |
| 		if (!isset($fofComponents[$component]))
 | |
| 		{
 | |
| 			$componentPaths = F0FPlatform::getInstance()->getComponentBaseDirs($component);
 | |
| 			$fofComponents[$component] = file_exists($componentPaths['admin'] . '/fof.xml');
 | |
| 		}
 | |
| 
 | |
| 		return $fofComponents[$component];
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Creates class aliases. On systems where eval() is enabled it creates a
 | |
| 	 * real class. On other systems it merely creates an alias. The eval()
 | |
| 	 * method is preferred as class_aliases result in the name of the class
 | |
| 	 * being instanciated not being available, making it impossible to create
 | |
| 	 * a class instance without passing a $config array :(
 | |
| 	 *
 | |
| 	 * @param   string   $original  The name of the original (existing) class
 | |
| 	 * @param   string   $alias     The name of the new (aliased) class
 | |
| 	 * @param   boolean  $autoload  Should I try to autoload the $original class?
 | |
| 	 *
 | |
| 	 * @return  void
 | |
| 	 */
 | |
| 	private function class_alias($original, $alias, $autoload = true)
 | |
| 	{
 | |
| 		static $hasEval = null;
 | |
| 
 | |
| 		if (is_null($hasEval))
 | |
| 		{
 | |
| 			$hasEval = false;
 | |
| 
 | |
| 			if (function_exists('ini_get'))
 | |
| 			{
 | |
| 				$disabled_functions = ini_get('disabled_functions');
 | |
| 
 | |
| 				if (!is_string($disabled_functions))
 | |
| 				{
 | |
| 					$hasEval = true;
 | |
| 				}
 | |
| 				else
 | |
| 				{
 | |
| 					$disabled_functions = explode(',', $disabled_functions);
 | |
| 					$hasEval = !in_array('eval', $disabled_functions);
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		if (!class_exists($original, $autoload))
 | |
| 		{
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		if ($hasEval)
 | |
| 		{
 | |
| 			$phpCode = "class $alias extends $original {}";
 | |
| 			eval($phpCode);
 | |
| 		}
 | |
| 		else
 | |
| 		{
 | |
| 			class_alias($original, $alias, $autoload);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Autoload Controllers
 | |
| 	 *
 | |
| 	 * @param   string  $class_name  The name of the class to load
 | |
| 	 *
 | |
| 	 * @return  void
 | |
| 	 */
 | |
| 	public function autoload_fof_controller($class_name)
 | |
| 	{
 | |
|         F0FPlatform::getInstance()->logDebug(__METHOD__ . "() autoloading $class_name");
 | |
| 
 | |
| 		static $isCli = null, $isAdmin = null;
 | |
| 
 | |
| 		if (is_null($isCli) && is_null($isAdmin))
 | |
| 		{
 | |
| 			list($isCli, $isAdmin) = F0FDispatcher::isCliAdmin();
 | |
| 		}
 | |
| 
 | |
| 		if (strpos($class_name, 'Controller') === false)
 | |
| 		{
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		// Change from camel cased into a lowercase array
 | |
| 		$class_modified = preg_replace('/(\s)+/', '_', $class_name);
 | |
| 		$class_modified = strtolower(preg_replace('/(?<=\\w)([A-Z])/', '_\\1', $class_modified));
 | |
| 		$parts = explode('_', $class_modified);
 | |
| 
 | |
| 		// We need three parts in the name
 | |
| 		if (count($parts) != 3)
 | |
| 		{
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		// We need the second part to be "controller"
 | |
| 		if ($parts[1] != 'controller')
 | |
| 		{
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		// Get the information about this class
 | |
| 		$component_raw  = $parts[0];
 | |
| 		$component = 'com_' . $parts[0];
 | |
| 		$view = $parts[2];
 | |
| 
 | |
| 		// Is this an F0F 2.1 or later component?
 | |
| 		if (!$this->isF0FComponent($component))
 | |
| 		{
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		// Get the alternate view and class name (opposite singular/plural name)
 | |
| 		$alt_view = F0FInflector::isSingular($view) ? F0FInflector::pluralize($view) : F0FInflector::singularize($view);
 | |
| 		$alt_class = F0FInflector::camelize($component_raw . '_controller_' . $alt_view);
 | |
| 
 | |
| 		// Get the component's paths
 | |
| 		$componentPaths = F0FPlatform::getInstance()->getComponentBaseDirs($component);
 | |
| 
 | |
| 		// Get the proper and alternate paths and file names
 | |
| 		$file = "/controllers/$view.php";
 | |
| 		$altFile = "/controllers/$alt_view.php";
 | |
| 		$path = $componentPaths['main'];
 | |
| 		$altPath = $componentPaths['alt'];
 | |
| 
 | |
| 		// Try to find the proper class in the proper path
 | |
| 		if (file_exists($path . $file))
 | |
| 		{
 | |
| 			@include_once $path . $file;
 | |
| 		}
 | |
| 
 | |
| 		// Try to find the proper class in the alternate path
 | |
| 		if (!class_exists($class_name) && file_exists($altPath . $file))
 | |
| 		{
 | |
| 			@include_once $altPath . $file;
 | |
| 		}
 | |
| 
 | |
| 		// Try to find the alternate class in the proper path
 | |
| 		if (!class_exists($alt_class) && file_exists($path . $altFile))
 | |
| 		{
 | |
| 			@include_once $path . $altFile;
 | |
| 		}
 | |
| 
 | |
| 		// Try to find the alternate class in the alternate path
 | |
| 		if (!class_exists($alt_class) && file_exists($altPath . $altFile))
 | |
| 		{
 | |
| 			@include_once $altPath . $altFile;
 | |
| 		}
 | |
| 
 | |
| 		// If the alternate class exists just map the class to the alternate
 | |
| 		if (!class_exists($class_name) && class_exists($alt_class))
 | |
| 		{
 | |
| 			$this->class_alias($alt_class, $class_name);
 | |
| 		}
 | |
| 
 | |
| 		// No class found? Map to F0FController
 | |
| 		elseif (!class_exists($class_name))
 | |
| 		{
 | |
| 			if ($view != 'default')
 | |
| 			{
 | |
| 				$defaultClass = F0FInflector::camelize($component_raw . '_controller_default');
 | |
| 				$this->class_alias($defaultClass, $class_name);
 | |
| 			}
 | |
| 			else
 | |
| 			{
 | |
| 				$this->class_alias('F0FController', $class_name);
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Autoload Models
 | |
| 	 *
 | |
| 	 * @param   string  $class_name  The name of the class to load
 | |
| 	 *
 | |
| 	 * @return  void
 | |
| 	 */
 | |
| 	public function autoload_fof_model($class_name)
 | |
| 	{
 | |
|         F0FPlatform::getInstance()->logDebug(__METHOD__ . "() autoloading $class_name");
 | |
| 
 | |
| 		static $isCli = null, $isAdmin = null;
 | |
| 
 | |
| 		if (is_null($isCli) && is_null($isAdmin))
 | |
| 		{
 | |
| 			list($isCli, $isAdmin) = F0FDispatcher::isCliAdmin();
 | |
| 		}
 | |
| 
 | |
| 		if (strpos($class_name, 'Model') === false)
 | |
| 		{
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		// Change from camel cased into a lowercase array
 | |
| 		$class_modified = preg_replace('/(\s)+/', '_', $class_name);
 | |
| 		$class_modified = strtolower(preg_replace('/(?<=\\w)([A-Z])/', '_\\1', $class_modified));
 | |
| 		$parts = explode('_', $class_modified);
 | |
| 
 | |
| 		// We need three parts in the name
 | |
| 		if (count($parts) != 3)
 | |
| 		{
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		// We need the second part to be "model"
 | |
| 		if ($parts[1] != 'model')
 | |
| 		{
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		// Get the information about this class
 | |
| 		$component_raw  = $parts[0];
 | |
| 		$component = 'com_' . $parts[0];
 | |
| 		$view = $parts[2];
 | |
| 
 | |
| 		// Is this an F0F 2.1 or later component?
 | |
| 		if (!$this->isF0FComponent($component))
 | |
| 		{
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		// Get the alternate view and class name (opposite singular/plural name)
 | |
| 		$alt_view = F0FInflector::isSingular($view) ? F0FInflector::pluralize($view) : F0FInflector::singularize($view);
 | |
| 		$alt_class = F0FInflector::camelize($component_raw . '_model_' . $alt_view);
 | |
| 
 | |
| 		// Get the proper and alternate paths and file names
 | |
| 		$componentPaths = F0FPlatform::getInstance()->getComponentBaseDirs($component);
 | |
| 
 | |
| 		$file = "/models/$view.php";
 | |
| 		$altFile = "/models/$alt_view.php";
 | |
| 		$path = $componentPaths['main'];
 | |
| 		$altPath = $componentPaths['alt'];
 | |
| 
 | |
| 		// Try to find the proper class in the proper path
 | |
| 		if (file_exists($path . $file))
 | |
| 		{
 | |
| 			@include_once $path . $file;
 | |
| 		}
 | |
| 
 | |
| 		// Try to find the proper class in the alternate path
 | |
| 		if (!class_exists($class_name) && file_exists($altPath . $file))
 | |
| 		{
 | |
| 			@include_once $altPath . $file;
 | |
| 		}
 | |
| 
 | |
| 		// Try to find the alternate class in the proper path
 | |
| 		if (!class_exists($alt_class) && file_exists($path . $altFile))
 | |
| 		{
 | |
| 			@include_once $path . $altFile;
 | |
| 		}
 | |
| 
 | |
| 		// Try to find the alternate class in the alternate path
 | |
| 		if (!class_exists($alt_class) && file_exists($altPath . $altFile))
 | |
| 		{
 | |
| 			@include_once $altPath . $altFile;
 | |
| 		}
 | |
| 
 | |
| 		// If the alternate class exists just map the class to the alternate
 | |
| 		if (!class_exists($class_name) && class_exists($alt_class))
 | |
| 		{
 | |
| 			$this->class_alias($alt_class, $class_name);
 | |
| 		}
 | |
| 
 | |
| 		// No class found? Map to F0FModel
 | |
| 		elseif (!class_exists($class_name))
 | |
| 		{
 | |
| 			if ($view != 'default')
 | |
| 			{
 | |
| 				$defaultClass = F0FInflector::camelize($component_raw . '_model_default');
 | |
| 				$this->class_alias($defaultClass, $class_name);
 | |
| 			}
 | |
| 			else
 | |
| 			{
 | |
| 				$this->class_alias('F0FModel', $class_name, true);
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Autoload Views
 | |
| 	 *
 | |
| 	 * @param   string  $class_name  The name of the class to load
 | |
| 	 *
 | |
| 	 * @return  void
 | |
| 	 */
 | |
| 	public function autoload_fof_view($class_name)
 | |
| 	{
 | |
|         F0FPlatform::getInstance()->logDebug(__METHOD__ . "() autoloading $class_name");
 | |
| 
 | |
| 		static $isCli = null, $isAdmin = null;
 | |
| 
 | |
| 		if (is_null($isCli) && is_null($isAdmin))
 | |
| 		{
 | |
| 			list($isCli, $isAdmin) = F0FDispatcher::isCliAdmin();
 | |
| 		}
 | |
| 
 | |
| 		if (strpos($class_name, 'View') === false)
 | |
| 		{
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		// Change from camel cased into a lowercase array
 | |
| 		$class_modified = preg_replace('/(\s)+/', '_', $class_name);
 | |
| 		$class_modified = strtolower(preg_replace('/(?<=\\w)([A-Z])/', '_\\1', $class_modified));
 | |
| 		$parts = explode('_', $class_modified);
 | |
| 
 | |
| 		// We need at least three parts in the name
 | |
| 
 | |
| 		if (count($parts) < 3)
 | |
| 		{
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		// We need the second part to be "view"
 | |
| 
 | |
| 		if ($parts[1] != 'view')
 | |
| 		{
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		// Get the information about this class
 | |
| 		$component_raw  = $parts[0];
 | |
| 		$component = 'com_' . $parts[0];
 | |
| 		$view = $parts[2];
 | |
| 
 | |
| 		if (count($parts) > 3)
 | |
| 		{
 | |
| 			$format = $parts[3];
 | |
| 		}
 | |
| 		else
 | |
| 		{
 | |
| 			$input = new F0FInput;
 | |
| 			$format = $input->getCmd('format', 'html', 'cmd');
 | |
| 		}
 | |
| 
 | |
| 		// Is this an F0F 2.1 or later component?
 | |
| 		if (!$this->isF0FComponent($component))
 | |
| 		{
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		// Get the alternate view and class name (opposite singular/plural name)
 | |
| 		$alt_view = F0FInflector::isSingular($view) ? F0FInflector::pluralize($view) : F0FInflector::singularize($view);
 | |
| 		$alt_class = F0FInflector::camelize($component_raw . '_view_' . $alt_view);
 | |
| 
 | |
| 		// Get the proper and alternate paths and file names
 | |
| 		$componentPaths = F0FPlatform::getInstance()->getComponentBaseDirs($component);
 | |
| 
 | |
| 		$protoFile = "/models/$view";
 | |
| 		$protoAltFile = "/models/$alt_view";
 | |
| 		$path = $componentPaths['main'];
 | |
| 		$altPath = $componentPaths['alt'];
 | |
| 
 | |
| 		$formats = array($format);
 | |
| 
 | |
| 		if ($format != 'html')
 | |
| 		{
 | |
| 			$formats[] = 'raw';
 | |
| 		}
 | |
| 
 | |
| 		foreach ($formats as $currentFormat)
 | |
| 		{
 | |
| 			$file = $protoFile . '.' . $currentFormat . '.php';
 | |
| 			$altFile = $protoAltFile . '.' . $currentFormat . '.php';
 | |
| 
 | |
| 			// Try to find the proper class in the proper path
 | |
| 			if (!class_exists($class_name) && file_exists($path . $file))
 | |
| 			{
 | |
| 				@include_once $path . $file;
 | |
| 			}
 | |
| 
 | |
| 			// Try to find the proper class in the alternate path
 | |
| 			if (!class_exists($class_name) && file_exists($altPath . $file))
 | |
| 			{
 | |
| 				@include_once $altPath . $file;
 | |
| 			}
 | |
| 
 | |
| 			// Try to find the alternate class in the proper path
 | |
| 			if (!class_exists($alt_class) && file_exists($path . $altFile))
 | |
| 			{
 | |
| 				@include_once $path . $altFile;
 | |
| 			}
 | |
| 
 | |
| 			// Try to find the alternate class in the alternate path
 | |
| 			if (!class_exists($alt_class) && file_exists($altPath . $altFile))
 | |
| 			{
 | |
| 				@include_once $altPath . $altFile;
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		// If the alternate class exists just map the class to the alternate
 | |
| 		if (!class_exists($class_name) && class_exists($alt_class))
 | |
| 		{
 | |
| 			$this->class_alias($alt_class, $class_name);
 | |
| 		}
 | |
| 
 | |
| 		// No class found? Map to F0FModel
 | |
| 		elseif (!class_exists($class_name))
 | |
| 		{
 | |
| 			if ($view != 'default')
 | |
| 			{
 | |
| 				$defaultClass = F0FInflector::camelize($component_raw . '_view_default');
 | |
| 				$this->class_alias($defaultClass, $class_name);
 | |
| 			}
 | |
| 			else
 | |
| 			{
 | |
| 				if (!file_exists(self::$fofPath . '/view/' . $format . '.php'))
 | |
| 				{
 | |
| 					$default_class = 'F0FView';
 | |
| 				}
 | |
| 				else
 | |
| 				{
 | |
| 					$default_class = 'F0FView' . ucfirst($format);
 | |
| 				}
 | |
| 
 | |
| 				$this->class_alias($default_class, $class_name, true);
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Autoload Tables
 | |
| 	 *
 | |
| 	 * @param   string  $class_name  The name of the class to load
 | |
| 	 *
 | |
| 	 * @return  void
 | |
| 	 */
 | |
| 	public function autoload_fof_table($class_name)
 | |
| 	{
 | |
|         F0FPlatform::getInstance()->logDebug(__METHOD__ . "() autoloading $class_name");
 | |
| 
 | |
| 		static $isCli = null, $isAdmin = null;
 | |
| 
 | |
| 		if (is_null($isCli) && is_null($isAdmin))
 | |
| 		{
 | |
| 			list($isCli, $isAdmin) = F0FDispatcher::isCliAdmin();
 | |
| 		}
 | |
| 
 | |
| 		if (strpos($class_name, 'Table') === false)
 | |
| 		{
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		// Change from camel cased into a lowercase array
 | |
| 		$class_modified = preg_replace('/(\s)+/', '_', $class_name);
 | |
| 		$class_modified = strtolower(preg_replace('/(?<=\\w)([A-Z])/', '_\\1', $class_modified));
 | |
| 		$parts = explode('_', $class_modified);
 | |
| 
 | |
| 		// We need three parts in the name
 | |
| 
 | |
| 		if (count($parts) != 3)
 | |
| 		{
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		// We need the second part to be "model"
 | |
| 		if ($parts[1] != 'table')
 | |
| 		{
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		// Get the information about this class
 | |
| 		$component_raw  = $parts[0];
 | |
| 		$component = 'com_' . $parts[0];
 | |
| 		$view = $parts[2];
 | |
| 
 | |
| 		// Is this an F0F 2.1 or later component?
 | |
| 		if (!$this->isF0FComponent($component))
 | |
| 		{
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		// Get the alternate view and class name (opposite singular/plural name)
 | |
| 		$alt_view = F0FInflector::isSingular($view) ? F0FInflector::pluralize($view) : F0FInflector::singularize($view);
 | |
| 		$alt_class = F0FInflector::camelize($component_raw . '_table_' . $alt_view);
 | |
| 
 | |
| 		// Get the proper and alternate paths and file names
 | |
| 		$componentPaths = F0FPlatform::getInstance()->getComponentBaseDirs($component);
 | |
| 
 | |
| 		$file = "/tables/$view.php";
 | |
| 		$altFile = "/tables/$alt_view.php";
 | |
| 		$path = $componentPaths['admin'];
 | |
| 
 | |
| 		// Try to find the proper class in the proper path
 | |
| 		if (file_exists($path . $file))
 | |
| 		{
 | |
| 			@include_once $path . $file;
 | |
| 		}
 | |
| 
 | |
| 		// Try to find the alternate class in the proper path
 | |
| 		if (!class_exists($alt_class) && file_exists($path . $altFile))
 | |
| 		{
 | |
| 			@include_once $path . $altFile;
 | |
| 		}
 | |
| 
 | |
| 		// If the alternate class exists just map the class to the alternate
 | |
| 		if (!class_exists($class_name) && class_exists($alt_class))
 | |
| 		{
 | |
| 			$this->class_alias($alt_class, $class_name);
 | |
| 		}
 | |
| 
 | |
| 		// No class found? Map to F0FModel
 | |
| 		elseif (!class_exists($class_name))
 | |
| 		{
 | |
| 			if ($view != 'default')
 | |
| 			{
 | |
| 				$defaultClass = F0FInflector::camelize($component_raw . '_table_default');
 | |
| 				$this->class_alias($defaultClass, $class_name);
 | |
| 			}
 | |
| 			else
 | |
| 			{
 | |
| 				$this->class_alias('F0FTable', $class_name, true);
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Autoload Helpers
 | |
| 	 *
 | |
| 	 * @param   string  $class_name  The name of the class to load
 | |
| 	 *
 | |
| 	 * @return  void
 | |
| 	 */
 | |
| 	public function autoload_fof_helper($class_name)
 | |
| 	{
 | |
|         F0FPlatform::getInstance()->logDebug(__METHOD__ . "() autoloading $class_name");
 | |
| 
 | |
| 		static $isCli = null, $isAdmin = null;
 | |
| 
 | |
| 		if (is_null($isCli) && is_null($isAdmin))
 | |
| 		{
 | |
| 			list($isCli, $isAdmin) = F0FDispatcher::isCliAdmin();
 | |
| 		}
 | |
| 
 | |
| 		if (strpos($class_name, 'Helper') === false)
 | |
| 		{
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		// Change from camel cased into a lowercase array
 | |
| 		$class_modified = preg_replace('/(\s)+/', '_', $class_name);
 | |
| 		$class_modified = strtolower(preg_replace('/(?<=\\w)([A-Z])/', '_\\1', $class_modified));
 | |
| 		$parts = explode('_', $class_modified);
 | |
| 
 | |
| 		// We need three parts in the name
 | |
| 		if (count($parts) != 3)
 | |
| 		{
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		// We need the second part to be "model"
 | |
| 		if ($parts[1] != 'helper')
 | |
| 		{
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		// Get the information about this class
 | |
| 		$component_raw  = $parts[0];
 | |
| 		$component = 'com_' . $parts[0];
 | |
| 		$view = $parts[2];
 | |
| 
 | |
| 		// Is this an F0F 2.1 or later component?
 | |
| 		if (!$this->isF0FComponent($component))
 | |
| 		{
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		// Get the alternate view and class name (opposite singular/plural name)
 | |
| 		$alt_view = F0FInflector::isSingular($view) ? F0FInflector::pluralize($view) : F0FInflector::singularize($view);
 | |
| 		$alt_class = F0FInflector::camelize($component_raw . '_helper_' . $alt_view);
 | |
| 
 | |
| 		// Get the proper and alternate paths and file names
 | |
| 		$componentPaths = F0FPlatform::getInstance()->getComponentBaseDirs($component);
 | |
| 
 | |
| 		$file = "/helpers/$view.php";
 | |
| 		$altFile = "/helpers/$alt_view.php";
 | |
| 		$path = $componentPaths['main'];
 | |
| 		$altPath = $componentPaths['alt'];
 | |
| 
 | |
| 		// Try to find the proper class in the proper path
 | |
| 		if (file_exists($path . $file))
 | |
| 		{
 | |
| 			@include_once $path . $file;
 | |
| 		}
 | |
| 
 | |
| 		// Try to find the proper class in the alternate path
 | |
| 		if (!class_exists($class_name) && file_exists($altPath . $file))
 | |
| 		{
 | |
| 			@include_once $altPath . $file;
 | |
| 		}
 | |
| 
 | |
| 		// Try to find the alternate class in the proper path
 | |
| 		if (!class_exists($alt_class) && file_exists($path . $altFile))
 | |
| 		{
 | |
| 			@include_once $path . $altFile;
 | |
| 		}
 | |
| 
 | |
| 		// Try to find the alternate class in the alternate path
 | |
| 		if (!class_exists($alt_class) && file_exists($altPath . $altFile))
 | |
| 		{
 | |
| 			@include_once $altPath . $altFile;
 | |
| 		}
 | |
| 
 | |
| 		// If the alternate class exists just map the class to the alternate
 | |
| 		if (!class_exists($class_name) && class_exists($alt_class))
 | |
| 		{
 | |
| 			$this->class_alias($alt_class, $class_name);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Autoload Toolbars
 | |
| 	 *
 | |
| 	 * @param   string  $class_name  The name of the class to load
 | |
| 	 *
 | |
| 	 * @return  void
 | |
| 	 */
 | |
| 	public function autoload_fof_toolbar($class_name)
 | |
| 	{
 | |
|         F0FPlatform::getInstance()->logDebug(__METHOD__ . "() autoloading $class_name");
 | |
| 
 | |
| 		static $isCli = null, $isAdmin = null;
 | |
| 
 | |
| 		if (is_null($isCli) && is_null($isAdmin))
 | |
| 		{
 | |
| 			list($isCli, $isAdmin) = F0FDispatcher::isCliAdmin();
 | |
| 		}
 | |
| 
 | |
| 		if (strpos($class_name, 'Toolbar') === false)
 | |
| 		{
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		// Change from camel cased into a lowercase array
 | |
| 		$class_modified = preg_replace('/(\s)+/', '_', $class_name);
 | |
| 		$class_modified = strtolower(preg_replace('/(?<=\\w)([A-Z])/', '_\\1', $class_modified));
 | |
| 		$parts = explode('_', $class_modified);
 | |
| 
 | |
| 		// We need two parts in the name
 | |
| 		if (count($parts) != 2)
 | |
| 		{
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		// We need the second part to be "model"
 | |
| 		if ($parts[1] != 'toolbar')
 | |
| 		{
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		// Get the information about this class
 | |
| 		$component_raw  = $parts[0];
 | |
| 		$component = 'com_' . $parts[0];
 | |
| 
 | |
|         $platformDirs = F0FPlatform::getInstance()->getPlatformBaseDirs();
 | |
| 
 | |
| 		// Get the proper and alternate paths and file names
 | |
| 		$file    = "/components/$component/toolbar.php";
 | |
| 		$path    = ($isAdmin || $isCli) ? $platformDirs['admin'] : $platformDirs['public'];
 | |
| 		$altPath = ($isAdmin || $isCli) ? $platformDirs['public'] : $platformDirs['admin'];
 | |
| 
 | |
| 		// Try to find the proper class in the proper path
 | |
| 
 | |
| 		if (file_exists($path . $file))
 | |
| 		{
 | |
| 			@include_once $path . $file;
 | |
| 		}
 | |
| 
 | |
| 		// Try to find the proper class in the alternate path
 | |
| 		if (!class_exists($class_name) && file_exists($altPath . $file))
 | |
| 		{
 | |
| 			@include_once $altPath . $file;
 | |
| 		}
 | |
| 
 | |
| 		// No class found? Map to F0FToolbar
 | |
| 		if (!class_exists($class_name))
 | |
| 		{
 | |
| 			$this->class_alias('F0FToolbar', $class_name, true);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Autoload Fields
 | |
| 	 *
 | |
| 	 * @param   string  $class_name  The name of the class to load
 | |
| 	 *
 | |
| 	 * @return  void
 | |
| 	 */
 | |
| 	public function autoload_fof_field($class_name)
 | |
| 	{
 | |
|         F0FPlatform::getInstance()->logDebug(__METHOD__ . "() autoloading $class_name");
 | |
| 
 | |
| 		// @todo
 | |
| 	}
 | |
| }
 |