166 lines
5.0 KiB
Plaintext
166 lines
5.0 KiB
Plaintext
|
/**
|
||
|
* Field Grouping https://docs.joomla.org/Form_field
|
||
|
*
|
||
|
* @var array
|
||
|
* @since 3.2.0
|
||
|
**/
|
||
|
protected array $groups = [
|
||
|
'default' => [
|
||
|
'accesslevel', 'cachehandler', 'calendar', 'captcha', 'category', 'checkbox', 'checkboxes', 'chromestyle',
|
||
|
'color', 'combo', 'componentlayout', 'contentlanguage', 'contenttype', 'databaseconnection', 'components',
|
||
|
'editor', 'editors', 'email', 'file', 'file', 'filelist', 'folderlist', 'groupedlist', 'headertag', 'helpsite', 'hidden', 'imagelist',
|
||
|
'integer', 'language', 'list', 'media', 'menu', 'modal_menu', 'menuitem', 'meter', 'modulelayout', 'moduleorder', 'moduleposition',
|
||
|
'moduletag', 'note', 'number', 'password', 'plugins', 'predefinedlist', 'radio', 'range', 'repeatable', 'rules',
|
||
|
'sessionhandler', 'spacer', 'sql', 'subform', 'tag', 'tel', 'templatestyle', 'text', 'textarea', 'timezone', 'url', 'user', 'usergroup'
|
||
|
],
|
||
|
'plain' => [
|
||
|
'cachehandler', 'calendar', 'checkbox', 'chromestyle', 'color', 'componentlayout', 'contenttype', 'editor', 'editors', 'captcha',
|
||
|
'email', 'file', 'headertag', 'helpsite', 'hidden', 'integer', 'language', 'media', 'menu', 'modal_menu', 'menuitem', 'meter', 'modulelayout', 'templatestyle',
|
||
|
'moduleorder', 'moduletag', 'number', 'password', 'range', 'rules', 'tag', 'tel', 'text', 'textarea', 'timezone', 'url', 'user', 'usergroup'
|
||
|
],
|
||
|
'option' => [
|
||
|
'accesslevel', 'category', 'checkboxes', 'combo', 'contentlanguage', 'databaseconnection', 'components',
|
||
|
'filelist', 'folderlist', 'imagelist', 'list', 'plugins', 'predefinedlist', 'radio', 'sessionhandler', 'sql', 'groupedlist'
|
||
|
],
|
||
|
'text' => [
|
||
|
'calendar', 'color', 'editor', 'email', 'number', 'password', 'range', 'tel', 'text', 'textarea', 'url'
|
||
|
],
|
||
|
'list' => [
|
||
|
'checkbox', 'checkboxes', 'list', 'radio', 'groupedlist', 'combo'
|
||
|
],
|
||
|
'dynamic' => [
|
||
|
'category', 'file', 'filelist', 'folderlist', 'headertag', 'imagelist', 'integer', 'media', 'meter', 'rules', 'tag', 'timezone', 'user'
|
||
|
],
|
||
|
'spacer' => [
|
||
|
'note', 'spacer'
|
||
|
],
|
||
|
'special' => [
|
||
|
'contentlanguage', 'moduleposition', 'plugin', 'repeatable', 'subform'
|
||
|
],
|
||
|
'search' => [
|
||
|
'editor', 'email', 'tel', 'text', 'textarea', 'url', 'subform'
|
||
|
]
|
||
|
];
|
||
|
|
||
|
/**
|
||
|
* Database object to query local DB
|
||
|
*
|
||
|
* @var \JDatabaseDriver
|
||
|
* @since 3.2.0
|
||
|
*/
|
||
|
protected \JDatabaseDriver $db;
|
||
|
|
||
|
/**
|
||
|
* Constructor
|
||
|
*
|
||
|
* @param \JDatabaseDriver|null $db The Database Driver object.
|
||
|
*
|
||
|
* @since 3.2.0
|
||
|
*/
|
||
|
public function __construct(?\JDatabaseDriver $db = null)
|
||
|
{
|
||
|
$this->db = $db ?: Factory::getDbo();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Field Checker
|
||
|
*
|
||
|
* @param string $type The field type
|
||
|
* @param string $option The field grouping
|
||
|
*
|
||
|
* @return bool if the field was found
|
||
|
* @since 3.2.0
|
||
|
*/
|
||
|
public function check(string $type, string $option = 'default'): bool
|
||
|
{
|
||
|
// now check
|
||
|
if (isset($this->groups[$option]) && in_array($type, $this->groups[$option]))
|
||
|
{
|
||
|
return true;
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* get the field types id -> name of a group or groups
|
||
|
*
|
||
|
* @param array $groups The groups
|
||
|
*
|
||
|
* @return array|null ids of the spacer field types
|
||
|
* @since 3.2.0
|
||
|
*/
|
||
|
public function types(array $groups = []): ?array
|
||
|
{
|
||
|
// make sure we have a group
|
||
|
if (($ids = $this->typesIds($groups)) !== null)
|
||
|
{
|
||
|
// Create a new query object.
|
||
|
$query = $this->db->getQuery(true);
|
||
|
$query->select($this->db->quoteName(array('id', 'name')));
|
||
|
$query->from($this->db->quoteName('#__componentbuilder_fieldtype'));
|
||
|
$query->where($this->db->quoteName('published') . ' = 1');
|
||
|
$query->where($this->db->quoteName('id') . ' IN (' . implode(',',$ids) . ')');
|
||
|
|
||
|
// Reset the query using our newly populated query object.
|
||
|
$this->db->setQuery($query);
|
||
|
$this->db->execute();
|
||
|
|
||
|
if ($this->db->getNumRows())
|
||
|
{
|
||
|
return $this->db->loadAssocList('id', 'name');
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* get the field types IDs of a group or groups
|
||
|
*
|
||
|
* @param array $groups The groups
|
||
|
*
|
||
|
* @return array|null ids of the spacer field types
|
||
|
* @since 3.2.0
|
||
|
*/
|
||
|
public function typesIds(array $groups = []): ?array
|
||
|
{
|
||
|
// make sure we have a group
|
||
|
if (ArrayHelper::check($groups))
|
||
|
{
|
||
|
$merge_groups = [];
|
||
|
foreach ($groups as $group)
|
||
|
{
|
||
|
if (isset($this->groups[$group]))
|
||
|
{
|
||
|
$merge_groups[] = $this->groups[$group];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// make sure we have these types of groups
|
||
|
if (ArrayHelper::check($merge_groups))
|
||
|
{
|
||
|
// get the database object to use quote
|
||
|
return GetHelper::vars(
|
||
|
'fieldtype',
|
||
|
(array) array_map(function($name) {
|
||
|
return $this->db->quote(ucfirst($name));
|
||
|
}, ArrayHelper::merge($merge_groups)),
|
||
|
'name',
|
||
|
'id'
|
||
|
);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* get the spacer IDs
|
||
|
*
|
||
|
* @return array|null ids of the spacer field types
|
||
|
* @since 3.2.0
|
||
|
*/
|
||
|
public function spacerIds(): ?array
|
||
|
{
|
||
|
return $this->typesIds(['spacer']);
|
||
|
}
|