233 lines
5.8 KiB
PHP
233 lines
5.8 KiB
PHP
<?php
|
|
/**
|
|
* @package FrameworkOnFramework
|
|
* @subpackage form
|
|
* @copyright Copyright (C) 2010-2016 Nicholas K. Dionysopoulos / Akeeba Ltd. All rights reserved.
|
|
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
|
*/
|
|
// Protect from unauthorized access
|
|
defined('F0F_INCLUDED') or die;
|
|
|
|
JLoader::import('joomla.form.helper');
|
|
|
|
/**
|
|
* F0FForm's helper class.
|
|
* Provides a storage for filesystem's paths where F0FForm's entities reside and
|
|
* methods for creating those entities. Also stores objects with entities'
|
|
* prototypes for further reusing.
|
|
*
|
|
* @package FrameworkOnFramework
|
|
* @since 2.0
|
|
*/
|
|
class F0FFormHelper extends JFormHelper
|
|
{
|
|
/**
|
|
* Method to load a form field object given a type.
|
|
*
|
|
* @param string $type The field type.
|
|
* @param boolean $new Flag to toggle whether we should get a new instance of the object.
|
|
*
|
|
* @return mixed JFormField object on success, false otherwise.
|
|
*
|
|
* @since 11.1
|
|
*/
|
|
public static function loadFieldType($type, $new = true)
|
|
{
|
|
return self::loadType('field', $type, $new);
|
|
}
|
|
|
|
/**
|
|
* Method to load a form field object given a type.
|
|
*
|
|
* @param string $type The field type.
|
|
* @param boolean $new Flag to toggle whether we should get a new instance of the object.
|
|
*
|
|
* @return mixed JFormField object on success, false otherwise.
|
|
*
|
|
* @since 11.1
|
|
*/
|
|
public static function loadHeaderType($type, $new = true)
|
|
{
|
|
return self::loadType('header', $type, $new);
|
|
}
|
|
|
|
/**
|
|
* Method to load a form entity object given a type.
|
|
* Each type is loaded only once and then used as a prototype for other objects of same type.
|
|
* Please, use this method only with those entities which support types (forms don't support them).
|
|
*
|
|
* @param string $entity The entity.
|
|
* @param string $type The entity type.
|
|
* @param boolean $new Flag to toggle whether we should get a new instance of the object.
|
|
*
|
|
* @return mixed Entity object on success, false otherwise.
|
|
*
|
|
* @since 11.1
|
|
*/
|
|
protected static function loadType($entity, $type, $new = true)
|
|
{
|
|
// Reference to an array with current entity's type instances
|
|
$types = &self::$entities[$entity];
|
|
|
|
$key = md5($type);
|
|
|
|
// Return an entity object if it already exists and we don't need a new one.
|
|
if (isset($types[$key]) && $new === false)
|
|
{
|
|
return $types[$key];
|
|
}
|
|
|
|
$class = self::loadClass($entity, $type);
|
|
|
|
if ($class !== false)
|
|
{
|
|
// Instantiate a new type object.
|
|
$types[$key] = new $class;
|
|
|
|
return $types[$key];
|
|
}
|
|
else
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Attempt to import the JFormField class file if it isn't already imported.
|
|
* You can use this method outside of JForm for loading a field for inheritance or composition.
|
|
*
|
|
* @param string $type Type of a field whose class should be loaded.
|
|
*
|
|
* @return mixed Class name on success or false otherwise.
|
|
*
|
|
* @since 11.1
|
|
*/
|
|
public static function loadFieldClass($type)
|
|
{
|
|
return self::loadClass('field', $type);
|
|
}
|
|
|
|
/**
|
|
* Attempt to import the F0FFormHeader class file if it isn't already imported.
|
|
* You can use this method outside of JForm for loading a field for inheritance or composition.
|
|
*
|
|
* @param string $type Type of a field whose class should be loaded.
|
|
*
|
|
* @return mixed Class name on success or false otherwise.
|
|
*
|
|
* @since 11.1
|
|
*/
|
|
public static function loadHeaderClass($type)
|
|
{
|
|
return self::loadClass('header', $type);
|
|
}
|
|
|
|
/**
|
|
* Load a class for one of the form's entities of a particular type.
|
|
* Currently, it makes sense to use this method for the "field" and "rule" entities
|
|
* (but you can support more entities in your subclass).
|
|
*
|
|
* @param string $entity One of the form entities (field or rule).
|
|
* @param string $type Type of an entity.
|
|
*
|
|
* @return mixed Class name on success or false otherwise.
|
|
*
|
|
* @since 2.0
|
|
*/
|
|
public static function loadClass($entity, $type)
|
|
{
|
|
if (strpos($type, '.'))
|
|
{
|
|
list($prefix, $type) = explode('.', $type);
|
|
$altPrefix = $prefix;
|
|
}
|
|
else
|
|
{
|
|
$prefix = 'F0F';
|
|
$altPrefix = 'J';
|
|
}
|
|
|
|
$class = JString::ucfirst($prefix, '_') . 'Form' . JString::ucfirst($entity, '_') . JString::ucfirst($type, '_');
|
|
$altClass = JString::ucfirst($altPrefix, '_') . 'Form' . JString::ucfirst($entity, '_') . JString::ucfirst($type, '_');
|
|
|
|
if (class_exists($class))
|
|
{
|
|
return $class;
|
|
}
|
|
elseif (class_exists($altClass))
|
|
{
|
|
return $altClass;
|
|
}
|
|
|
|
// Get the field search path array.
|
|
$paths = self::addPath($entity);
|
|
|
|
// If the type is complex, add the base type to the paths.
|
|
if ($pos = strpos($type, '_'))
|
|
{
|
|
// Add the complex type prefix to the paths.
|
|
for ($i = 0, $n = count($paths); $i < $n; $i++)
|
|
{
|
|
// Derive the new path.
|
|
$path = $paths[$i] . '/' . strtolower(substr($type, 0, $pos));
|
|
|
|
// If the path does not exist, add it.
|
|
if (!in_array($path, $paths))
|
|
{
|
|
$paths[] = $path;
|
|
}
|
|
}
|
|
|
|
// Break off the end of the complex type.
|
|
$type = substr($type, $pos + 1);
|
|
}
|
|
|
|
// Try to find the class file.
|
|
$type = strtolower($type) . '.php';
|
|
$filesystem = F0FPlatform::getInstance()->getIntegrationObject('filesystem');
|
|
|
|
foreach ($paths as $path)
|
|
{
|
|
if ($file = $filesystem->pathFind($path, $type))
|
|
{
|
|
require_once $file;
|
|
|
|
if (class_exists($class))
|
|
{
|
|
break;
|
|
}
|
|
elseif (class_exists($altClass))
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Check for all if the class exists.
|
|
if (class_exists($class))
|
|
{
|
|
return $class;
|
|
}
|
|
elseif (class_exists($altClass))
|
|
{
|
|
return $altClass;
|
|
}
|
|
else
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Method to add a path to the list of header include paths.
|
|
*
|
|
* @param mixed $new A path or array of paths to add.
|
|
*
|
|
* @return array The list of paths that have been added.
|
|
*/
|
|
public static function addHeaderPath($new = null)
|
|
{
|
|
return self::addPath('header', $new);
|
|
}
|
|
}
|