132 lines
3.8 KiB
PHP
132 lines
3.8 KiB
PHP
<?php
|
|
/**
|
|
* @author Tassos.gr <info@tassos.gr>
|
|
* @link https://www.tassos.gr
|
|
* @copyright Copyright © 2024 Tassos All Rights Reserved
|
|
* @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later
|
|
*/
|
|
|
|
defined('_JEXEC') or die('Restricted access');
|
|
|
|
use Joomla\CMS\Form\Field\ListField;
|
|
use Joomla\CMS\HTML\HTMLHelper;
|
|
use Joomla\CMS\Language\Text;
|
|
use Joomla\CMS\Factory;
|
|
|
|
class JFormFieldNRComponents extends ListField
|
|
{
|
|
protected function getOptions()
|
|
{
|
|
return array_merge(parent::getOptions(), $this->getInstalledComponents());
|
|
}
|
|
|
|
/**
|
|
* Method to get field parameters
|
|
*
|
|
* @param string $val Field parameter
|
|
* @param string $default The default value
|
|
*
|
|
* @return string
|
|
*/
|
|
public function get($val, $default = '')
|
|
{
|
|
return (isset($this->element[$val]) && (string) $this->element[$val] != '') ? (string) $this->element[$val] : $default;
|
|
}
|
|
|
|
/**
|
|
* Creates a list of installed components
|
|
*
|
|
* @return array
|
|
*/
|
|
protected function getInstalledComponents()
|
|
{
|
|
$lang = Factory::getLanguage();
|
|
$db = Factory::getDbo();
|
|
|
|
$components = $db->setQuery(
|
|
$db->getQuery(true)
|
|
->select('name, element')
|
|
->from('#__extensions')
|
|
->where('type = ' . $db->quote('component'))
|
|
->where('name != ""')
|
|
->where('element != ""')
|
|
->where('enabled = 1')
|
|
->order('element, name')
|
|
)->loadObjectList();
|
|
|
|
$comps = array();
|
|
|
|
foreach ($components as $component)
|
|
{
|
|
// Make sure we have a valid element
|
|
if (empty($component->element))
|
|
{
|
|
continue;
|
|
}
|
|
|
|
// Skip backend-based only components
|
|
if ($this->get('frontend', false))
|
|
{
|
|
$component_folder = JPATH_SITE . '/components/' . $component->element;
|
|
|
|
if (!is_dir($component_folder))
|
|
{
|
|
continue;
|
|
}
|
|
|
|
if (!is_dir($component_folder . '/views') &&
|
|
!is_dir($component_folder . '/View') &&
|
|
!is_dir($component_folder . '/view'))
|
|
{
|
|
continue;
|
|
}
|
|
}
|
|
|
|
// Try loading component's system language file in order to display a user friendly component name
|
|
// Runs only if the component's name is not translated already.
|
|
if (strpos($component->name, ' ') === false)
|
|
{
|
|
$filenames = [
|
|
$component->element . '.sys',
|
|
$component->element
|
|
];
|
|
|
|
$paths = [
|
|
JPATH_ADMINISTRATOR,
|
|
JPATH_ADMINISTRATOR . '/components/' . $component->element,
|
|
JPATH_SITE,
|
|
JPATH_SITE . '/components/' . $component->element
|
|
];
|
|
|
|
foreach ($filenames as $key => $filename)
|
|
{
|
|
foreach ($paths as $key => $path)
|
|
{
|
|
$loaded = $lang->load($filename, $path, null) || $lang->load($filename, $path, $lang->getDefault());
|
|
|
|
if ($loaded)
|
|
{
|
|
break 2;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Translate component's name
|
|
$component->name = Text::_(strtoupper($component->name));
|
|
}
|
|
|
|
$comps[strtolower($component->element)] = $component->name;
|
|
}
|
|
|
|
asort($comps);
|
|
|
|
$options = array();
|
|
|
|
foreach ($comps as $key => $name)
|
|
{
|
|
$options[] = HTMLHelper::_('select.option', $key, $name);
|
|
}
|
|
|
|
return $options;
|
|
}
|
|
} |