Files
conservatorio-tomadini/libraries/regularlabs/src/Parameters.php
2024-12-17 17:34:10 +01:00

165 lines
6.4 KiB
PHP

<?php
/**
* @package Regular Labs Library
* @version 24.11.1459
*
* @author Peter van Westen <info@regularlabs.com>
* @link https://regularlabs.com
* @copyright Copyright © 2024 Regular Labs All Rights Reserved
* @license GNU General Public License version 2 or later
*/
namespace RegularLabs\Library;
defined('_JEXEC') or die;
use Joomla\CMS\Component\ComponentHelper as JComponentHelper;
use Joomla\CMS\Plugin\PluginHelper as JPluginHelper;
use RegularLabs\Library\ObjectHelper as RL_Object;
class Parameters
{
/**
* Get a usable parameter object for the component
*/
public static function getComponent(string $name, object|array|string|null $params = null, bool $use_cache = \true): object
{
$name = 'com_' . \RegularLabs\Library\RegEx::replace('^com_', '', $name);
$cache = new \RegularLabs\Library\Cache();
if ($use_cache && $cache->exists()) {
return $cache->get();
}
if (empty($params) && JComponentHelper::isInstalled($name)) {
$params = JComponentHelper::getParams($name);
}
return $cache->set(self::getObjectFromRegistry($params, JPATH_ADMINISTRATOR . '/components/' . $name . '/config.xml'));
}
/**
* Get a usable parameter object for the module
*/
public static function getModule(string $name, bool $admin = \true, object|array|string|null $params = null, bool $use_cache = \true): object
{
$name = 'mod_' . \RegularLabs\Library\RegEx::replace('^mod_', '', $name);
$cache = new \RegularLabs\Library\Cache();
if ($use_cache && $cache->exists()) {
return $cache->get();
}
if (empty($params)) {
$params = null;
}
return $cache->set(self::getObjectFromRegistry($params, ($admin ? JPATH_ADMINISTRATOR : JPATH_SITE) . '/modules/' . $name . '/' . $name . '.xml'));
}
/**
* Get a usable parameter object based on the Joomla Registry object
* The object will have all the available parameters with their value (default value if none is set)
*/
public static function getObjectFromRegistry(object|array|string|null $params, string $path = '', string $default = '', bool $use_cache = \true): object
{
$cache = new \RegularLabs\Library\Cache();
if ($use_cache && $cache->exists()) {
return $cache->get();
}
$xml = self::loadXML($path, $default);
if (empty($params)) {
return $cache->set((object) $xml);
}
if (is_array($params)) {
$params = (object) $params;
}
if (is_string($params)) {
$params = json_decode($params);
}
if (is_object($params) && method_exists($params, 'toObject')) {
$params = $params->toObject();
}
if (is_null($xml)) {
$xml = (object) [];
}
if (!$params) {
return $cache->set((object) $xml);
}
if (empty($xml)) {
return $cache->set($params);
}
foreach ($xml as $key => $val) {
if (isset($params->{$key}) && $params->{$key} != '') {
continue;
}
$params->{$key} = $val;
}
return $cache->set($params);
}
/**
* Get a usable parameter object for the plugin
*/
public static function getPlugin(string $name, string $type = 'system', object|array|string|null $params = null, bool $use_cache = \true): object
{
$cache = new \RegularLabs\Library\Cache();
if ($use_cache && $cache->exists()) {
return $cache->get();
}
if (empty($params)) {
$plugin = JPluginHelper::getPlugin($type, $name);
$params = is_object($plugin) && isset($plugin->params) ? $plugin->params : null;
}
return $cache->set(self::getObjectFromRegistry($params, JPATH_PLUGINS . '/' . $type . '/' . $name . '/' . $name . '.xml'));
}
/**
* Returns an array based on the data in a given xml file
*/
public static function loadXML(string $path, ?string $default = '', bool $use_cache = \true, bool $full_info = \false): array
{
$cache = new \RegularLabs\Library\Cache();
if ($use_cache && $cache->exists()) {
return $cache->get();
}
if (!$path || !file_exists($path)) {
return $cache->set([]);
}
$file = file_get_contents($path);
if (!$file) {
return $cache->set([]);
}
$xml = [];
$xml_parser = xml_parser_create();
xml_parse_into_struct($xml_parser, $file, $fields);
xml_parser_free($xml_parser);
$default = $default ? strtoupper($default) : 'DEFAULT';
foreach ($fields as $field) {
if ($field['tag'] != 'FIELD' || !isset($field['attributes']) || !isset($field['attributes']['NAME']) || $field['attributes']['NAME'] == '' || $field['attributes']['NAME'][0] == '@' || !isset($field['attributes']['TYPE']) || $field['attributes']['TYPE'] == 'spacer') {
continue;
}
if ($full_info) {
$full_object = $xml[$field['attributes']['NAME']] = RL_Object::changeKeyCase($field['attributes'], 'lower');
$full_object->multiple ??= 'false';
}
if (isset($field['attributes'][$default])) {
$field['attributes']['DEFAULT'] = $field['attributes'][$default];
}
if (!isset($field['attributes']['DEFAULT'])) {
$field['attributes']['DEFAULT'] = '';
}
if ($field['attributes']['TYPE'] == 'textarea') {
$field['attributes']['DEFAULT'] = str_replace('<br>', "\n", $field['attributes']['DEFAULT']);
}
if ($full_info) {
$full_object->value = $field['attributes']['DEFAULT'];
continue;
}
$xml[$field['attributes']['NAME']] = $field['attributes']['DEFAULT'];
}
return $cache->set($xml);
}
public static function overrideFromObject(object $params, ?object $object = null): object
{
if (empty($object)) {
return $params;
}
foreach ($params as $key => $value) {
if (!isset($object->{$key})) {
continue;
}
$params->{$key} = $object->{$key};
}
return $params;
}
}