name : Helper.php
<?php
/**
 * @package         Conditions
 * @version         25.7.12430
 * 
 * @author          Peter van Westen <[email protected]>
 * @link            https://regularlabs.com
 * @copyright       Copyright © 2025 Regular Labs All Rights Reserved
 * @license         GNU General Public License version 2 or later
 */

namespace RegularLabs\Component\Conditions\Administrator\Helper;

use Joomla\CMS\Factory as JFactory;
use Joomla\CMS\Language\Text as JText;
use RegularLabs\Library\ArrayHelper as RL_Array;
use RegularLabs\Library\DB as RL_DB;
use RegularLabs\Library\Language as RL_Language;
use RegularLabs\Library\Parameters as RL_Parameters;
use RegularLabs\Library\StringHelper as RL_String;

class Helper
{
    public static function conditionIsActive(object $rule): bool
    {
        if (empty($rule->type))
        {
            return false;
        }

        $disabled_types = RL_Array::toArray(RL_Parameters::getComponent('conditions')->disabled_rule_types);

        return ! in_array($rule->type, $disabled_types);
    }

    public static function getConditionsClass(
        object            $rule,
        object|false|null $article,
        object|false|null $module,
        object|false|null $request = null,
        ?int              $category_id = null
    )
    {
        if (empty($rule->type))
        {
            return false;
        }

        if ( ! self::conditionIsActive($rule))
        {
            return false;
        }

        $field = self::getField($rule->type);

        if ( ! $field)
        {
            return false;
        }

        $classname = str_replace('_', '. ', $field->class);
        $classname = RL_String::toTitleCase($classname);
        $classname = str_replace(['. . ', '. '], ['\\', ''], $classname);

        $classname = 'RegularLabs\\Component\\Conditions\\Administrator\\Condition\\'
            . $classname;

        if ( ! class_exists($classname))
        {

            return false;
        }

        return new $classname($rule, $article, $module, $request, $category_id);
    }

    public static function getExtensionItemString(string $extension): string
    {
        RL_Language::load($extension);

        $no_com_prefix = strtoupper(preg_replace('#^com_#', '', $extension));

        $item_name = $no_com_prefix . '_ITEM_NAME_FOR_CONDITIONS';

        if (JText::_($item_name) !== $item_name)
        {
            return JText::_($item_name);
        }

        $extension = self::getExtensionName($extension);

        return JText::sprintf('CON_EXTENSION_ITEM', $extension);
    }

    public static function getExtensionName(string $extension): string
    {
        RL_Language::load($extension);

        $no_com_prefix = strtoupper(preg_replace('#^com_#', '', $extension));

        $extension_name = JText::_($no_com_prefix) !== $no_com_prefix
            ? JText::_($no_com_prefix)
            : JText::_($extension);

        return str_replace('Regular Labs - ', '', $extension_name);
    }

    public static function getField(string $key): ?object
    {
        $fields = Helper::getXmlFields();

        return $fields[$key] ?? null;
    }

    public static function getFieldClass(string $key): object|false
    {
        $field = self::getField($key);

        if ( ! $field)
        {
            return false;
        }

        $classname = 'RegularLabs\\Component\\Conditions\\Administrator\\Form\\Field\\' . $field->type . 'Field';

        if ( ! class_exists($classname))
        {
            $classname = 'RegularLabs\\Library\\Form\\Field\\' . $field->type . 'Field';
        }

        if ( ! class_exists($classname))
        {
            return false;
        }

        $class = new $classname;

        if ( ! method_exists($class, 'getNamesByIds'))
        {
            return false;
        }

        return $class;
    }

    public static function getForItemText(
        string $extension,
        int    $item_id,
        string $table,
        string $name_column = 'name'
    ): string
    {
        RL_Language::load('com_conditions');

        $extension_item = self::getExtensionItemString($extension);
        $item_name      = self::getItemNameFromDB($item_id, $table, $name_column);

        return JText::sprintf('CON_FOR_ITEM', $extension_item, $item_name);
    }

    public static function getIdValuesFromDB(string $table, string $name_column = 'name'): array
    {
        if ( ! $table || ! $name_column)
        {
            return [];
        }

        $cache = new Cache;

        if ($cache->exists())
        {
            return $cache->get();
        }

        $db = JFactory::getDbo();

        $query = $db->getQuery(true)
            ->select(RL_DB::quoteName('id'))
            ->select(RL_DB::quoteName($name_column, 'value'))
            ->from(RL_DB::quoteName('#__' . $table));

        $db->setQuery($query);

        return $cache->set($db->loadAssocList('id', 'value'));
    }

    public static function getItemNameFromDB(
        int    $item_id,
        string $table,
        string $name_column = 'name'
    ): string
    {
        $items = self::getIdValuesFromDB($table, $name_column);

        return $items[$item_id] ?? '';
    }

    public static function getItemPublishStateFromDB(int $item_id, string $table): int
    {
        $columns = RL_DB::getTableColumns('#__' . $table);

        $published_column = isset($columns['published'])
            ? 'published'
            : ($columns['state'] ? 'state' : '');

        if ( ! $published_column)
        {
            return 1;
        }

        $items = self::getIdValuesFromDB($table, $published_column);

        return $items[$item_id] ?? 0;
    }

    public static function getPublishStateString(int $state): string
    {
        $state = match ($state)
        {
            1       => 'PUBLISHED',
            0       => 'UNPUBLISHED',
            2       => 'ARCHIVED',
            -2      => 'TRASHED',
            default => '',
        };

        return JText::_($state);
    }

    public static function getXmlFields(bool $use_cache = true): array
    {
        $cache = new Cache('Conditions.getXmlFields');

        if ($use_cache && $cache->exists())
        {
            return $cache->get();
        }

        RL_Parameters::getObjectFromRegistry('', 'administrator/components/com_conditions/forms/item_rule.xml');

        $file = file_get_contents(JPATH_ADMINISTRATOR . '/components/com_conditions/forms/item_rule.xml');

        $xml_parser = xml_parser_create();
        xml_parse_into_struct($xml_parser, $file, $xml_fields);
        xml_parser_free($xml_parser);

        $fields = [];

        $field_name = '';

        foreach ($xml_fields as $field)
        {
            if ( ! in_array($field['tag'], ['FIELD', 'OPTION'])
                || ! isset($field['attributes'])
                || isset($field['attributes']['DISABLED'])
            )
            {
                continue;
            }

            if ($field['tag'] === 'OPTION')
            {
                $option_name          = $field_name . '.' . RL_String::toUnderscoreCase($field['attributes']['VALUE'], true, true);
                $fields[$option_name] = (object) [
                    'type'       => '',
                    'name'       => $field['value'],
                    'class'      => $field['attributes']['CONDITION'] ?? '',
                    'attributes' => (array) RL_Array::changeKeyCase($field['attributes'], 'lowercase'),
                ];
                continue;
            }

            if (isset($field['attributes']['TYPE']) && $field['attributes']['TYPE'] === 'LoadLanguage')
            {
                RL_Language::load($field['attributes']['EXTENSION'], JPATH_ADMINISTRATOR);
                continue;
            }

            if ( ! isset($field['attributes']['NAME'])
                || ! isset($field['attributes']['TYPE'])
                || $field['attributes']['NAME'] == ''
                || $field['attributes']['NAME'][0] == '@'
                || $field['attributes']['TYPE'] == 'spacer'
            )
            {
                continue;
            }

            $field_name = $field['attributes']['NAME'];

            $fields[$field_name] = (object) [
                'type'       => $field['attributes']['TYPE'],
                'name'       => $field['attributes']['LABEL'] ?? $field['attributes']['NAME'],
                'class'      => $field['attributes']['CONDITION'] ?? $field['attributes']['NAME'],
                'attributes' => (array) RL_Array::changeKeyCase($field['attributes'], 'lowercase'),
            ];
        }

        return $cache->set($fields);
    }

    public static function thereAreConditions(): bool
    {
        $cache = new Cache;

        if ($cache->exists())
        {
            return $cache->get();
        }

        $db = JFactory::getDbo();

        $query = $db->getQuery(true)
            ->select('count(*)')
            ->from('#__conditions')
            ->where(RL_DB::is('published', 1));

        $db->setQuery($query);

        return $cache->set($db->loadResult() > 0);
    }
}

© 2025 Cubjrnet7