commit 7f1e4b976e8e5ef196ab0ca40f9d1f87871b0ea5 Author: Llewellyn van der Merwe Date: Thu Oct 14 16:30:52 2021 +0200 first commit - v1.0.0 diff --git a/componentbuilderfieldorderingtabs.php b/componentbuilderfieldorderingtabs.php new file mode 100644 index 0000000..872232d --- /dev/null +++ b/componentbuilderfieldorderingtabs.php @@ -0,0 +1,60 @@ + + * @github 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 + */ + +// No direct access to this file +defined('_JEXEC') or die('Restricted access'); + +use Joomla\CMS\Form\Form; +use Joomla\CMS\Plugin\CMSPlugin; + +JLoader::register('ComponentbuilderHelper', JPATH_ADMINISTRATOR . '/components/com_componentbuilder/helpers/componentbuilder.php'); + +/** + * Content - Componentbuilder Field Ordering Tabs plugin. + * + * @package ComponentbuilderFieldOrderingTabs + * @since 1.0.0 + */ +class PlgContentComponentbuilderFieldOrderingTabs extends CMSPlugin +{ + /** + * Affects constructor behavior. If true, language files will be loaded automatically. + * + * @var boolean + * @since 1.0 + */ + protected $autoloadLanguage = true; + + /** + * Runs on content preparation of form. + * + * @param JForm $form The form + * @param stdClass $data The data + * + * @return boolean + * + * @since 1.0 + */ + public function onContentPrepareForm(Form $form, $data) + { + $context = $form->getName(); + + // When this is componentbuilder admin view + if (strpos($context, 'com_componentbuilder.admin_view') === 0) + { + // Add the forms path + Form::addFormPath(__DIR__ . '/forms'); + // add the admin view params for privacy integration + $form->loadFile('admin_view'); + } + return true; + } +} diff --git a/componentbuilderfieldorderingtabs.xml b/componentbuilderfieldorderingtabs.xml new file mode 100644 index 0000000..a49fa52 --- /dev/null +++ b/componentbuilderfieldorderingtabs.xml @@ -0,0 +1,31 @@ + + + PLG_CONTENT_COMPONENTBUILDERFIELDORDERINGTABS + 20th February, 2021 + Llewellyn van der Merwe + llewellyn@joomlacomponentbuilder.com + http://www.joomlacomponentbuilder.com + Copyright (C) 2015 Vast Development Method. All rights reserved. + GNU General Public License version 2 or later; see LICENSE.txt + 1.0.0 + PLG_CONTENT_COMPONENTBUILDERFIELDORDERINGTABS_XML_DESCRIPTION + + + script.php + + + + en-GB/en-GB.plg_content_componentbuilderfieldorderingtabs.ini + en-GB/en-GB.plg_content_componentbuilderfieldorderingtabs.sys.ini + + + + + componentbuilderfieldorderingtabs.php + index.html + language + fields + forms + rules + + \ No newline at end of file diff --git a/fields/adminlistvieworderfields.php b/fields/adminlistvieworderfields.php new file mode 100644 index 0000000..18b6e20 --- /dev/null +++ b/fields/adminlistvieworderfields.php @@ -0,0 +1,132 @@ + + * @github 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 + */ + +// No direct access to this file +defined('_JEXEC') or die('Restricted access'); + +// import the list field type +jimport('joomla.form.helper'); +JFormHelper::loadFieldClass('list'); + +/** + * Adminlistvieworderfields Form Field class for the Componentbuilder component + */ +class JFormFieldAdminlistvieworderfields extends JFormFieldList +{ + /** + * The adminlistvieworderfields field type. + * + * @var string + */ + public $type = 'adminlistvieworderfields'; + + /** + * Method to get a list of options for a list input. + * + * @return array An array of JHtml options. + */ + protected function getOptions() + { + // load the db object + $db = JFactory::getDBO(); + // get the input from url + $jinput = JFactory::getApplication()->input; + // get the id + $adminView = $jinput->getInt('id', 0); + // set the field trackers + $fieldIds = array(); + $sortIds = array(); + // check if we have an admin view + if (is_numeric($adminView) && $adminView >= 1) + { + // get all the fields linked to the admin view + if ($addFields = ComponentbuilderHelper::getVar('admin_fields', (int) $adminView, 'admin_view', 'addfields')) + { + if (ComponentbuilderHelper::checkJson($addFields)) + { + $addFields = json_decode($addFields, true); + if (ComponentbuilderHelper::checkArray($addFields)) + { + foreach($addFields as $addField) + { + // admin list view and ordering + if (isset($addField['field']) && isset($addField['list']) && ($addField['list'] == 1 || $addField['list'] == 3) + && isset($addField['sort']) && $addField['sort']) + { + $fieldIds[(int) $addField['field']] = (int) $addField['field']; + } + // do track all fields set as sorted + if (isset($addField['field']) && isset($addField['sort']) && $addField['sort']) + { + $sortIds[(int) $addField['field']] = (int) $addField['field']; + } + } + } + } + } + // get all the fields that are also having a relationship on the list view as sorted + if ($addFields = ComponentbuilderHelper::getVar('admin_fields_relations', (int) $adminView, 'admin_view', 'addrelations')) + { + if (ComponentbuilderHelper::checkJson($addFields)) + { + $addFields = json_decode($addFields, true); + if (ComponentbuilderHelper::checkArray($addFields)) + { + foreach($addFields as $addField) + { + // admin list view and ordering + if (isset($addField['joinfields']) && ComponentbuilderHelper::checkArray($addField['joinfields'])) + { + foreach($addField['joinfields'] as $joinfield) + { + if (isset($sortIds[$joinfield])) + { + $fieldIds[(int) $joinfield] = (int) $joinfield; + } + } + } + } + } + } + } + // filter by fields linked + if (ComponentbuilderHelper::checkArray($fieldIds)) + { + $query = $db->getQuery(true); + $query->select($db->quoteName(array('a.id','a.name', 'a.xml', 'b.name'),array('id','name', 'xml', 'type'))); + $query->from($db->quoteName('#__componentbuilder_field', 'a')); + $query->join('LEFT', '#__componentbuilder_fieldtype AS b ON b.id = a.fieldtype'); + $query->where($db->quoteName('a.published') . ' >= 1'); + // only load these fields + $query->where($db->quoteName('a.id') . ' IN (' . implode(',', $fieldIds) . ')'); + $query->order('a.name ASC'); + $db->setQuery((string)$query); + $items = $db->loadObjectList(); + $options = array(); + if ($items) + { + $options[] = JHtml::_('select.option', '', JText::_('PLG_CONTENT_COMPONENTBUILDERFIELDORDERINGTABS_SELECT_AN_OPTION')); + $options[] = JHtml::_('select.option', -1, JText::_('PLG_CONTENT_COMPONENTBUILDERFIELDORDERINGTABS_ID'). ' [ id - text ]'); + $options[] = JHtml::_('select.option', -2, JText::_('PLG_CONTENT_COMPONENTBUILDERFIELDORDERINGTABS_ORDERING'). ' [ ordering - number ]'); + $options[] = JHtml::_('select.option', -3, JText::_('PLG_CONTENT_COMPONENTBUILDERFIELDORDERINGTABS_STATUS'). ' [ published - list ]'); + foreach($items as $item) + { + // get the field name (TODO this could slow down the system so we will need to improve on this) + $field_name = ComponentbuilderHelper::safeFieldName(ComponentbuilderHelper::getBetween(json_decode($item->xml),'name="','"')); + $options[] = JHtml::_('select.option', $item->id, $item->name . ' [ ' . $field_name . ' - ' . $item->type . ' ]'); + } + } + return $options; + } + } + return false; + } +} diff --git a/fields/index.html b/fields/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/fields/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/fields/linkedviewsorderfields.php b/fields/linkedviewsorderfields.php new file mode 100644 index 0000000..599544f --- /dev/null +++ b/fields/linkedviewsorderfields.php @@ -0,0 +1,99 @@ + + * @github 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 + */ + +// No direct access to this file +defined('_JEXEC') or die('Restricted access'); + +// import the list field type +jimport('joomla.form.helper'); +JFormHelper::loadFieldClass('list'); + +/** + * Linkedviewsorderfields Form Field class for the Componentbuilder component + */ +class JFormFieldLinkedviewsorderfields extends JFormFieldList +{ + /** + * The linkedviewsorderfields field type. + * + * @var string + */ + public $type = 'linkedviewsorderfields'; + + /** + * Method to get a list of options for a list input. + * + * @return array An array of JHtml options. + */ + protected function getOptions() + { + // load the db object + $db = JFactory::getDBO(); + // get the input from url + $jinput = JFactory::getApplication()->input; + // get the id + $adminView = $jinput->getInt('id', 0); + // check if we have an admin view + if (is_numeric($adminView) && $adminView >= 1) + { + // get all the fields linked to the admin view + if ($addFields = ComponentbuilderHelper::getVar('admin_fields', (int) $adminView, 'admin_view', 'addfields')) + { + if (ComponentbuilderHelper::checkJson($addFields)) + { + $addFields = json_decode($addFields, true); + if (ComponentbuilderHelper::checkArray($addFields)) + { + foreach($addFields as $addField) + { + // linked list views and ordering + if (isset($addField['field']) && isset($addField['list']) && ($addField['list'] == 1 || $addField['list'] == 4) + && isset($addField['sort']) && $addField['sort']) + { + $fieldIds[] = (int) $addField['field']; + } + } + } + } + } + // filter by fields linked + if (ComponentbuilderHelper::checkArray($fieldIds)) + { + $query = $db->getQuery(true); + $query->select($db->quoteName(array('a.id','a.name', 'a.xml', 'b.name'),array('id','name', 'xml', 'type'))); + $query->from($db->quoteName('#__componentbuilder_field', 'a')); + $query->join('LEFT', '#__componentbuilder_fieldtype AS b ON b.id = a.fieldtype'); + $query->where($db->quoteName('a.published') . ' >= 1'); + // only load these fields + $query->where($db->quoteName('a.id') . ' IN (' . implode(',', $fieldIds) . ')'); + $query->order('a.name ASC'); + $db->setQuery((string)$query); + $items = $db->loadObjectList(); + $options = array(); + if ($items) + { + $options[] = JHtml::_('select.option', '', JText::_('PLG_CONTENT_COMPONENTBUILDERFIELDORDERINGTABS_SELECT_AN_OPTION')); + $options[] = JHtml::_('select.option', -1, JText::_('PLG_CONTENT_COMPONENTBUILDERFIELDORDERINGTABS_ID'). ' [ id - text ]'); + $options[] = JHtml::_('select.option', -2, JText::_('PLG_CONTENT_COMPONENTBUILDERFIELDORDERINGTABS_ORDERING'). ' [ ordering - number ]'); + $options[] = JHtml::_('select.option', -3, JText::_('PLG_CONTENT_COMPONENTBUILDERFIELDORDERINGTABS_STATUS'). ' [ published - list ]'); + foreach($items as $item) + { + // get the field name (TODO this could slow down the system so we will need to improve on this) + $field_name = ComponentbuilderHelper::safeFieldName(ComponentbuilderHelper::getBetween(json_decode($item->xml),'name="','"')); + $options[] = JHtml::_('select.option', $item->id, $item->name . ' [ ' . $field_name . ' - ' . $item->type . ' ]'); + } + } + return $options; + } + } + return false; + } +} diff --git a/forms/admin_view.xml b/forms/admin_view.xml new file mode 100644 index 0000000..b7097ea --- /dev/null +++ b/forms/admin_view.xml @@ -0,0 +1,124 @@ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ \ No newline at end of file diff --git a/forms/index.html b/forms/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/forms/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/language/en-GB/en-GB.plg_content_componentbuilderfieldorderingtabs.ini b/language/en-GB/en-GB.plg_content_componentbuilderfieldorderingtabs.ini new file mode 100644 index 0000000..6711a01 --- /dev/null +++ b/language/en-GB/en-GB.plg_content_componentbuilderfieldorderingtabs.ini @@ -0,0 +1,22 @@ +PLG_CONTENT_COMPONENTBUILDERFIELDORDERINGTABS="Content - Componentbuilder Field Ordering Tabs" +PLG_CONTENT_COMPONENTBUILDERFIELDORDERINGTABS_DESCRIPTION="This plugin is used to set custom ordering to fields in the JCB list views." +PLG_CONTENT_COMPONENTBUILDERFIELDORDERINGTABS_XML_DESCRIPTION="

Content - Componentbuilder Field Ordering Tabs (v.1.0.0)

This plugin is used to set custom ordering to fields in the JCB list views.

Created by Llewellyn van der Merwe
Development started 20th May, 2020

" +PLG_CONTENT_COMPONENTBUILDERFIELDORDERINGTABS_FIELD_ORDERING="Field Ordering" +PLG_CONTENT_COMPONENTBUILDERFIELDORDERINGTABS_ADD_ADMIN_ORDERING_LABEL="Add Admin List View Ordering" +PLG_CONTENT_COMPONENTBUILDERFIELDORDERINGTABS_ADD_ADMIN_ORDERING_DESCRIPTION="Select the ordering behavior, default is by id, and custom lets you select." +PLG_CONTENT_COMPONENTBUILDERFIELDORDERINGTABS_YES="Yes" +PLG_CONTENT_COMPONENTBUILDERFIELDORDERINGTABS_NO="No" +PLG_CONTENT_COMPONENTBUILDERFIELDORDERINGTABS_ADMIN_ORDERING_FIELDS_LABEL="Admin Ordering Fields" +PLG_CONTENT_COMPONENTBUILDERFIELDORDERINGTABS_FIELD_LABEL="Field" +PLG_CONTENT_COMPONENTBUILDERFIELDORDERINGTABS_SELECT_AN_OPTION="Select an option" +PLG_CONTENT_COMPONENTBUILDERFIELDORDERINGTABS_ID="Id" +PLG_CONTENT_COMPONENTBUILDERFIELDORDERINGTABS_ORDERING="Ordering" +PLG_CONTENT_COMPONENTBUILDERFIELDORDERINGTABS_STATUS="Status" +PLG_CONTENT_COMPONENTBUILDERFIELDORDERINGTABS_FIELD="Field" +PLG_CONTENT_COMPONENTBUILDERFIELDORDERINGTABS_DIRECTION_LABEL="Direction" +PLG_CONTENT_COMPONENTBUILDERFIELDORDERINGTABS_ASCENDING="Ascending" +PLG_CONTENT_COMPONENTBUILDERFIELDORDERINGTABS_DESCENDING="Descending" +PLG_CONTENT_COMPONENTBUILDERFIELDORDERINGTABS_RANDOM="Random" +PLG_CONTENT_COMPONENTBUILDERFIELDORDERINGTABS_ADD_LINKED_ORDERING_LABEL="Add Linked List Views Ordering" +PLG_CONTENT_COMPONENTBUILDERFIELDORDERINGTABS_ADD_LINKED_ORDERING_DESCRIPTION="Select the ordering behavior, default is by id, and custom lets you select." +PLG_CONTENT_COMPONENTBUILDERFIELDORDERINGTABS_LINKED_ORDERING_FIELDS_LABEL="Linked Ordering Fields" \ No newline at end of file diff --git a/language/en-GB/en-GB.plg_content_componentbuilderfieldorderingtabs.sys.ini b/language/en-GB/en-GB.plg_content_componentbuilderfieldorderingtabs.sys.ini new file mode 100644 index 0000000..6711a01 --- /dev/null +++ b/language/en-GB/en-GB.plg_content_componentbuilderfieldorderingtabs.sys.ini @@ -0,0 +1,22 @@ +PLG_CONTENT_COMPONENTBUILDERFIELDORDERINGTABS="Content - Componentbuilder Field Ordering Tabs" +PLG_CONTENT_COMPONENTBUILDERFIELDORDERINGTABS_DESCRIPTION="This plugin is used to set custom ordering to fields in the JCB list views." +PLG_CONTENT_COMPONENTBUILDERFIELDORDERINGTABS_XML_DESCRIPTION="

Content - Componentbuilder Field Ordering Tabs (v.1.0.0)

This plugin is used to set custom ordering to fields in the JCB list views.

Created by Llewellyn van der Merwe
Development started 20th May, 2020

" +PLG_CONTENT_COMPONENTBUILDERFIELDORDERINGTABS_FIELD_ORDERING="Field Ordering" +PLG_CONTENT_COMPONENTBUILDERFIELDORDERINGTABS_ADD_ADMIN_ORDERING_LABEL="Add Admin List View Ordering" +PLG_CONTENT_COMPONENTBUILDERFIELDORDERINGTABS_ADD_ADMIN_ORDERING_DESCRIPTION="Select the ordering behavior, default is by id, and custom lets you select." +PLG_CONTENT_COMPONENTBUILDERFIELDORDERINGTABS_YES="Yes" +PLG_CONTENT_COMPONENTBUILDERFIELDORDERINGTABS_NO="No" +PLG_CONTENT_COMPONENTBUILDERFIELDORDERINGTABS_ADMIN_ORDERING_FIELDS_LABEL="Admin Ordering Fields" +PLG_CONTENT_COMPONENTBUILDERFIELDORDERINGTABS_FIELD_LABEL="Field" +PLG_CONTENT_COMPONENTBUILDERFIELDORDERINGTABS_SELECT_AN_OPTION="Select an option" +PLG_CONTENT_COMPONENTBUILDERFIELDORDERINGTABS_ID="Id" +PLG_CONTENT_COMPONENTBUILDERFIELDORDERINGTABS_ORDERING="Ordering" +PLG_CONTENT_COMPONENTBUILDERFIELDORDERINGTABS_STATUS="Status" +PLG_CONTENT_COMPONENTBUILDERFIELDORDERINGTABS_FIELD="Field" +PLG_CONTENT_COMPONENTBUILDERFIELDORDERINGTABS_DIRECTION_LABEL="Direction" +PLG_CONTENT_COMPONENTBUILDERFIELDORDERINGTABS_ASCENDING="Ascending" +PLG_CONTENT_COMPONENTBUILDERFIELDORDERINGTABS_DESCENDING="Descending" +PLG_CONTENT_COMPONENTBUILDERFIELDORDERINGTABS_RANDOM="Random" +PLG_CONTENT_COMPONENTBUILDERFIELDORDERINGTABS_ADD_LINKED_ORDERING_LABEL="Add Linked List Views Ordering" +PLG_CONTENT_COMPONENTBUILDERFIELDORDERINGTABS_ADD_LINKED_ORDERING_DESCRIPTION="Select the ordering behavior, default is by id, and custom lets you select." +PLG_CONTENT_COMPONENTBUILDERFIELDORDERINGTABS_LINKED_ORDERING_FIELDS_LABEL="Linked Ordering Fields" \ No newline at end of file diff --git a/language/en-GB/index.html b/language/en-GB/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/language/en-GB/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/language/index.html b/language/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/language/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/rules/index.html b/rules/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/rules/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/script.php b/script.php new file mode 100644 index 0000000..11cf63f --- /dev/null +++ b/script.php @@ -0,0 +1,79 @@ + + * @github 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 + */ + +// No direct access to this file +defined('_JEXEC') or die('Restricted access'); + +/** + * Content - Componentbuilder Field Ordering Tabs script file. + * + * @package PlgContentComponentbuilderFieldOrderingTabs + */ +class plgContentComponentbuilderFieldOrderingTabsInstallerScript +{ + + /** + * Called before any type of action + * + * @param string $route Which action is happening (install|uninstall|discover_install|update) + * @param JAdapterInstance $adapter The object responsible for running this script + * + * @return boolean True on success + */ + public function preflight($route, JAdapterInstance $adapter) + { + // get application + $app = JFactory::getApplication(); + + // the default for both install and update + $jversion = new JVersion(); + if (!$jversion->isCompatible('3.8.0')) + { + $app->enqueueMessage('Please upgrade to at least Joomla! 3.8.0 before continuing!', 'error'); + return false; + } + + if ('install' === $route) + { + // check that componentbuilder is installed + $pathToCore = JPATH_ADMINISTRATOR . '/components/com_componentbuilder/helpers/componentbuilder.php'; + if (!JFile::exists($pathToCore)) + { + $app->enqueueMessage('Joomla Component Builder must first be installed from Joomla Component Builder.', 'error'); + return false; + } + // load the helper class + JLoader::register('ComponentbuilderHelper', JPATH_ADMINISTRATOR . '/components/com_componentbuilder/helpers/componentbuilder.php'); + // block install + $blockInstall = true; + // check the version of JCB + $manifest = ComponentbuilderHelper::manifest(); + if (isset($manifest->version) && strpos($manifest->version, '.') !== false) + { + // get the version + $jcbVersion = explode('.', $manifest->version); + // check that we have JCB 2.11.1 or higher installed + if (count($jcbVersion) == 3 && $jcbVersion[0] >= 2 && $jcbVersion[1] >= 11 && (($jcbVersion[1] == 11 && $jcbVersion[2] >= 1) || ($jcbVersion[1] > 11))) + { + $blockInstall = false; + } + } + // allow install if all conditions are met + if ($blockInstall) + { + $app->enqueueMessage('Please upgrade to JCB 2.11.1 or higher before installing this plugin.', 'error'); + return false; + } + } + + return true; + } +}