213 lines
4.7 KiB
PHP
213 lines
4.7 KiB
PHP
<?php
|
|
/**
|
|
* @package FrameworkOnFramework
|
|
* @subpackage config
|
|
* @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();
|
|
|
|
/**
|
|
* Reads and parses the fof.xml file in the back-end of a F0F-powered component,
|
|
* provisioning the data to the rest of the F0F framework
|
|
*
|
|
* @package FrameworkOnFramework
|
|
* @since 2.1
|
|
*/
|
|
class F0FConfigProvider
|
|
{
|
|
/**
|
|
* Cache of F0F components' configuration variables
|
|
*
|
|
* @var array
|
|
*/
|
|
public static $configurations = array();
|
|
|
|
/**
|
|
* Parses the configuration of the specified component
|
|
*
|
|
* @param string $component The name of the component, e.g. com_foobar
|
|
* @param boolean $force Force reload even if it's already parsed?
|
|
*
|
|
* @return void
|
|
*/
|
|
public function parseComponent($component, $force = false)
|
|
{
|
|
if (!$force && isset(self::$configurations[$component]))
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (F0FPlatform::getInstance()->isCli())
|
|
{
|
|
$order = array('cli', 'backend');
|
|
}
|
|
elseif (F0FPlatform::getInstance()->isBackend())
|
|
{
|
|
$order = array('backend');
|
|
}
|
|
else
|
|
{
|
|
$order = array('frontend');
|
|
}
|
|
|
|
$order[] = 'common';
|
|
|
|
$order = array_reverse($order);
|
|
self::$configurations[$component] = array();
|
|
|
|
foreach ($order as $area)
|
|
{
|
|
$config = $this->parseComponentArea($component, $area);
|
|
self::$configurations[$component] = array_merge_recursive(self::$configurations[$component], $config);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Returns the value of a variable. Variables use a dot notation, e.g.
|
|
* view.config.whatever where the first part is the domain, the rest of the
|
|
* parts specify the path to the variable.
|
|
*
|
|
* @param string $variable The variable name
|
|
* @param mixed $default The default value, or null if not specified
|
|
*
|
|
* @return mixed The value of the variable
|
|
*/
|
|
public function get($variable, $default = null)
|
|
{
|
|
static $domains = null;
|
|
|
|
if (is_null($domains))
|
|
{
|
|
$domains = $this->getDomains();
|
|
}
|
|
|
|
list($component, $domain, $var) = explode('.', $variable, 3);
|
|
|
|
if (!isset(self::$configurations[$component]))
|
|
{
|
|
$this->parseComponent($component);
|
|
}
|
|
|
|
if (!in_array($domain, $domains))
|
|
{
|
|
return $default;
|
|
}
|
|
|
|
$class = 'F0FConfigDomain' . ucfirst($domain);
|
|
$o = new $class;
|
|
|
|
return $o->get(self::$configurations[$component], $var, $default);
|
|
}
|
|
|
|
/**
|
|
* Parses the configuration options of a specific component area
|
|
*
|
|
* @param string $component Which component's cionfiguration to parse
|
|
* @param string $area Which area to parse (frontend, backend, cli)
|
|
*
|
|
* @return array A hash array with the configuration data
|
|
*/
|
|
protected function parseComponentArea($component, $area)
|
|
{
|
|
// Initialise the return array
|
|
$ret = array();
|
|
|
|
// Get the folders of the component
|
|
$componentPaths = F0FPlatform::getInstance()->getComponentBaseDirs($component);
|
|
$filesystem = F0FPlatform::getInstance()->getIntegrationObject('filesystem');
|
|
|
|
// Check that the path exists
|
|
$path = $componentPaths['admin'];
|
|
$path = $filesystem->pathCheck($path);
|
|
|
|
if (!$filesystem->folderExists($path))
|
|
{
|
|
return $ret;
|
|
}
|
|
|
|
// Read the filename if it exists
|
|
$filename = $path . '/fof.xml';
|
|
|
|
if (!$filesystem->fileExists($filename))
|
|
{
|
|
return $ret;
|
|
}
|
|
|
|
$data = file_get_contents($filename);
|
|
|
|
// Load the XML data in a SimpleXMLElement object
|
|
$xml = simplexml_load_string($data);
|
|
|
|
if (!($xml instanceof SimpleXMLElement))
|
|
{
|
|
return $ret;
|
|
}
|
|
|
|
// Get this area's data
|
|
$areaData = $xml->xpath('//' . $area);
|
|
|
|
if (empty($areaData))
|
|
{
|
|
return $ret;
|
|
}
|
|
|
|
$xml = array_shift($areaData);
|
|
|
|
// Parse individual configuration domains
|
|
$domains = $this->getDomains();
|
|
|
|
foreach ($domains as $dom)
|
|
{
|
|
$class = 'F0FConfigDomain' . ucfirst($dom);
|
|
|
|
if (class_exists($class, true))
|
|
{
|
|
$o = new $class;
|
|
$o->parseDomain($xml, $ret);
|
|
}
|
|
}
|
|
|
|
// Finally, return the result
|
|
return $ret;
|
|
}
|
|
|
|
/**
|
|
* Gets a list of the available configuration domain adapters
|
|
*
|
|
* @return array A list of the available domains
|
|
*/
|
|
protected function getDomains()
|
|
{
|
|
static $domains = array();
|
|
|
|
if (empty($domains))
|
|
{
|
|
$filesystem = F0FPlatform::getInstance()->getIntegrationObject('filesystem');
|
|
|
|
$files = $filesystem->folderFiles(__DIR__ . '/domain', '.php');
|
|
|
|
if (!empty($files))
|
|
{
|
|
foreach ($files as $file)
|
|
{
|
|
$domain = basename($file, '.php');
|
|
|
|
if ($domain == 'interface')
|
|
{
|
|
continue;
|
|
}
|
|
|
|
$domain = preg_replace('/[^A-Za-z0-9]/', '', $domain);
|
|
$domains[] = $domain;
|
|
}
|
|
|
|
$domains = array_unique($domains);
|
|
}
|
|
}
|
|
|
|
return $domains;
|
|
}
|
|
}
|