* @git Joomla Component Builder * @copyright Copyright (C) 2015 Vast Development Method. All rights reserved. * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace VDM\Component\Componentbuilder\Administrator\Field; use Joomla\CMS\Factory; use Joomla\CMS\Form\Field\ListField; use Joomla\CMS\Language\Text; use Joomla\CMS\HTML\HTMLHelper as Html; use Joomla\CMS\Component\ComponentHelper; use VDM\Component\Componentbuilder\Administrator\Helper\ComponentbuilderHelper; use VDM\Joomla\Utilities\GetHelper; use VDM\Joomla\Utilities\GuidHelper; use VDM\Joomla\Utilities\JsonHelper; use VDM\Joomla\Utilities\ArrayHelper; // No direct access to this file \defined('_JEXEC') or die; /** * Joinfields Form Field class for the Componentbuilder component * * @since 1.6 */ class JoinfieldsField extends ListField { /** * The joinfields field type. * * @var string */ public $type = 'Joinfields'; /** * Method to get a list of options for a list input. * * @return array An array of Html options. * @since 1.6 */ protected function getOptions() { // load the db opbject $db = Factory::getDBO(); // get the input from url $jinput = Factory::getApplication()->input; // get the id $ID = $jinput->getInt('id', 0); // rest the fields guids $fieldGuids = []; if (is_numeric($ID) && $ID >= 1) { // get the admin view GUID $adminView = GetHelper::var('admin_fields_relations', (int) $ID, 'id', 'admin_view'); } else { // get the admin view GUID $initDefaults = $jinput->get('init_defaults', null, 'STRING'); if (!empty($initDefaults)) { $initDefaults = json_decode(urldecode($initDefaults), true); $adminView = $initDefaults['admin_view'] ?? null; } } // make sure we have the admin view ID if (GuidHelper::valid($adminView)) { // get all the fields linked to the admin view if ($addFields = GetHelper::var('admin_fields', $adminView, 'admin_view', 'addfields')) { if (JsonHelper::check($addFields)) { $addFields = json_decode($addFields, true); if (ArrayHelper::check($addFields)) { foreach($addFields as $addField) { if (isset($addField['field']) && (!isset($addField['list']) || ($addField['list'] != 1 && $addField['list'] != 2))) { $fieldGuids[] = (string) $addField['field']; } } } } } // filter by fields linked if (ArrayHelper::check($fieldGuids)) { // get list of field types that does not work in list views (note, spacer) $spacers = ComponentbuilderHelper::getSpacerGuids(); $query = $db->getQuery(true); $query->select($db->quoteName(array('a.guid','a.name','t.name'),array('guid','name','type'))); $query->from($db->quoteName('#__componentbuilder_field', 'a')); $query->join('LEFT', $db->quoteName('#__componentbuilder_fieldtype', 't') . ' ON (' . $db->quoteName('a.fieldtype') . ' = ' . $db->quoteName('t.guid') . ')'); $query->where($db->quoteName('a.published') . ' >= 1'); // only load these fields $query->where($db->quoteName('a.guid') . ' IN ("' . implode('","', $fieldGuids) . '")'); // none of these field types if (ArrayHelper::check($spacers)) { $query->where($db->quoteName('a.fieldtype') . ' NOT IN ("' . implode('","', $spacers) . '")'); } $query->order('a.name ASC'); $db->setQuery((string)$query); $items = $db->loadObjectList(); $options = array(); if ($items) { foreach($items as $item) { $options[] = Html::_('select.option', $item->guid, $item->name . ' [' . $item->type . ']'); } } return $options; } } return [Html::_('select.option', '', Text::_('COM_COMPONENTBUILDER_ADD_MORE_FIELDS_TO_THIS_ADMIN_VIEW'))]; } }