From 75656d940a5c695f75d0d6e7b1101e1e5ffbe385 Mon Sep 17 00:00:00 2001 From: Llewellyn van der Merwe Date: Sat, 22 Jun 2019 12:43:26 +0200 Subject: [PATCH] Added many events to the compiler as the first step to allow 3rd party integration with the compiler via plugins. gh-429 --- README.md | 6 +- admin/README.txt | 6 +- admin/compiler/joomla_3/router.php | 2 + admin/config.xml | 10 ++ admin/helpers/compiler.php | 6 ++ admin/helpers/compiler/a_Get.php | 96 +++++++++++++++++++ admin/helpers/compiler/b_Structure.php | 4 + admin/helpers/compiler/c_Fields.php | 8 ++ admin/helpers/compiler/e_Interpretation.php | 59 +++++++++--- admin/helpers/compiler/f_Infusion.php | 43 ++++++++- .../en-GB/en-GB.com_componentbuilder.ini | 2 + admin/sql/install.mysql.utf8.sql | 2 +- componentbuilder.xml | 2 +- site/router.php | 2 + 14 files changed, 227 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index ad18f9cb6..53a4587a1 100644 --- a/README.md +++ b/README.md @@ -146,12 +146,12 @@ TODO + *Author*: [Llewellyn van der Merwe](mailto:llewellyn@joomlacomponentbuilder.com) + *Name*: [Component Builder](https://github.com/vdm-io/Joomla-Component-Builder) + *First Build*: 30th April, 2015 -+ *Last Build*: 18th June, 2019 ++ *Last Build*: 22nd June, 2019 + *Version*: 2.9.20 + *Copyright*: Copyright (C) 2015 - 2019 Vast Development Method. All rights reserved. + *License*: GNU General Public License version 2 or later; see LICENSE.txt -+ *Line count*: **206959** -+ *Field count*: **1141** ++ *Line count*: **206973** ++ *Field count*: **1142** + *File count*: **1346** + *Folder count*: **209** diff --git a/admin/README.txt b/admin/README.txt index ad18f9cb6..53a4587a1 100644 --- a/admin/README.txt +++ b/admin/README.txt @@ -146,12 +146,12 @@ TODO + *Author*: [Llewellyn van der Merwe](mailto:llewellyn@joomlacomponentbuilder.com) + *Name*: [Component Builder](https://github.com/vdm-io/Joomla-Component-Builder) + *First Build*: 30th April, 2015 -+ *Last Build*: 18th June, 2019 ++ *Last Build*: 22nd June, 2019 + *Version*: 2.9.20 + *Copyright*: Copyright (C) 2015 - 2019 Vast Development Method. All rights reserved. + *License*: GNU General Public License version 2 or later; see LICENSE.txt -+ *Line count*: **206959** -+ *Field count*: **1141** ++ *Line count*: **206973** ++ *Field count*: **1142** + *File count*: **1346** + *Folder count*: **209** diff --git a/admin/compiler/joomla_3/router.php b/admin/compiler/joomla_3/router.php index c3084c95a..272e42940 100644 --- a/admin/compiler/joomla_3/router.php +++ b/admin/compiler/joomla_3/router.php @@ -143,6 +143,8 @@ class ###Component###Router extends JComponentRouterBase { $getTable = '#__categories'; $query->from($db->quoteName($getTable)); + // we need this to target the components categories (TODO will keep an eye on this) + $query->where($db->quoteName('extension') . ' LIKE '. $db->quote((string)'com_' . $main . '%')); } else { diff --git a/admin/config.xml b/admin/config.xml index 220ced4d6..b976865fa 100644 --- a/admin/config.xml +++ b/admin/config.xml @@ -57,6 +57,16 @@ folder="editors" filter="cmd" /> + + diff --git a/admin/helpers/compiler.php b/admin/helpers/compiler.php index 08e3a672a..96a740dd2 100644 --- a/admin/helpers/compiler.php +++ b/admin/helpers/compiler.php @@ -253,6 +253,8 @@ class Compiler extends Infusion */ protected function setFileContent(&$name, &$path, &$bom, $view = null) { + // Trigger Event: jcb_ce_onBeforeSetFileContent + $this->triggerEvent('jcb_ce_onBeforeSetFileContent', array(&$name, &$path, &$bom, &$view)); // set the file name $this->fileContentStatic[$this->hhh . 'FILENAME' . $this->hhh] = $name; // check if the file should get PHP opening @@ -263,6 +265,8 @@ class Compiler extends Infusion } // get content of the file $string = ComponentbuilderHelper::getFileContents($path); + // Trigger Event: jcb_ce_onGetFileContents + $this->triggerEvent('jcb_ce_onGetFileContents', array(&$string, &$name, &$path, &$bom, &$view)); // see if we should add a BOM if (strpos($string, $this->hhh . 'BOM' . $this->hhh) !== false) { @@ -281,6 +285,8 @@ class Compiler extends Infusion { $answer = $this->setDynamicValues($answer); } + // Trigger Event: jcb_ce_onBeforeSetFileContent + $this->triggerEvent('jcb_ce_onBeforeWriteFileContent', array(&$answer, &$name, &$path, &$bom, &$view)); // add answer back to file $this->writeFile($path, $answer); // count the file lines diff --git a/admin/helpers/compiler/a_Get.php b/admin/helpers/compiler/a_Get.php index 4283c3073..d257f2aac 100644 --- a/admin/helpers/compiler/a_Get.php +++ b/admin/helpers/compiler/a_Get.php @@ -736,6 +736,13 @@ class Get */ public $mysqlTableSetting = array(); + /** + * event plugin trigger switch + * + * @var boolean + */ + protected $active_plugins = false; + /** * Constructor */ @@ -748,6 +755,21 @@ class Get $this->app = JFactory::getApplication(); // Set the params $this->params = JComponentHelper::getParams('com_componentbuilder'); + // get active plugins + if (($plugins = $this->params->get('compiler_plugin', false)) !== false) + { + foreach ($plugins as $plugin) + { + // get posible plugins + if (\JPluginHelper::isEnabled('extension', $plugin)) + { + // Import the appropriate plugin group. + \JPluginHelper::importPlugin('extension', $plugin); + // activate events + $this->active_plugins = true; + } + } + } // set the minfy switch of the JavaScript $this->minify = (isset($config['minify']) && $config['minify'] != 2) ? $config['minify'] : $this->params->get('minify', 0); // set the global language @@ -866,6 +888,40 @@ class Get return ''; } + /** + * Trigger events + * + * @param string $event The event to trigger + * @param mix $data The values to pass to the event/plugin + * + * @return string + * + */ + public function triggerEvent($event, $data) + { + // only exicute if plugins were loaded (active) + if ($this->active_plugins) + { + // Get the dispatcher. + $dispatcher = \JEventDispatcher::getInstance(); + + // Trigger the form preparation event. + $results = $dispatcher->trigger($event, $data); + + // Check for errors encountered while trigger the event + if (count($results) && in_array(false, $results, true)) + { + // Get the last error. + $error = $dispatcher->getError(); + + if (!($error instanceof \Exception)) + { + throw new \Exception($error); + } + } + } + } + /** * get all System Placeholders * @@ -963,12 +1019,18 @@ class Get $query->join('LEFT', $this->db->quoteName('#__componentbuilder_component_placeholders', 'k') . ' ON (' . $this->db->quoteName('a.id') . ' = ' . $this->db->quoteName('k.joomla_component') . ')'); $query->where($this->db->quoteName('a.id') . ' = ' . (int) $this->componentID); + // Trigger Event: jcb_ce_onBeforeQueryComponentData + $this->triggerEvent('jcb_ce_onBeforeQueryComponentData', array(&$this->componentID, &$query, &$this->db)); + // Reset the query using our newly populated query object. $this->db->setQuery($query); // Load the results as a list of stdClass objects $component = $this->db->loadObject(); + // Trigger Event: jcb_ce_onBeforeModelComponentData + $this->triggerEvent('jcb_ce_onBeforeModelComponentData', array(&$component)); + // set upater $updater = array( 'unique' => array( @@ -1510,6 +1572,9 @@ class Get $component->toignore = array('.git'); } + // Trigger Event: jcb_ce_onAfterModelComponentData + $this->triggerEvent('jcb_ce_onAfterModelComponentData', array(&$component)); + // return the found component data return $component; } @@ -1556,6 +1621,9 @@ class Get $query->join('LEFT', $this->db->quoteName('#__componentbuilder_admin_custom_tabs', 't') . ' ON (' . $this->db->quoteName('a.id') . ' = ' . $this->db->quoteName('t.admin_view') . ')'); $query->where($this->db->quoteName('a.id') . ' = ' . (int) $id); + // Trigger Event: jcb_ce_onBeforeQueryViewData + $this->triggerEvent('jcb_ce_onBeforeQueryViewData', array(&$id, &$query, &$this->db)); + // Reset the query using our newly populated query object. $this->db->setQuery($query); @@ -1611,6 +1679,10 @@ class Get $this->placeholders[$this->bbb . 'Views' . $this->ddd] = $this->placeholders[$this->hhh . 'Views' . $this->hhh]; $this->placeholders[$this->bbb . 'VIEW' . $this->ddd] = $this->placeholders[$this->hhh . 'VIEW' . $this->hhh]; $this->placeholders[$this->bbb . 'VIEWS' . $this->ddd] = $this->placeholders[$this->hhh . 'VIEWS' . $this->hhh]; + + // Trigger Event: jcb_ce_onBeforeModelViewData + $this->triggerEvent('jcb_ce_onBeforeModelViewData', array(&$view, &$this->placeholders)); + // add the tables $view->addtables = (isset($view->addtables) && ComponentbuilderHelper::checkJson($view->addtables)) ? json_decode($view->addtables, true) : null; if (ComponentbuilderHelper::checkArray($view->addtables)) @@ -2205,6 +2277,10 @@ class Get // remove the table values since we moved to another object unset($view->{'mysql_table_' . $_mysqlTableKey}); } + + // Trigger Event: jcb_ce_onAfterModelViewData + $this->triggerEvent('jcb_ce_onAfterModelViewData', array(&$view, &$this->placeholders)); + // clear placeholders unset($this->placeholders[$this->hhh . 'view' . $this->hhh]); unset($this->placeholders[$this->hhh . 'views' . $this->hhh]); @@ -2244,11 +2320,18 @@ class Get $query->from('#__componentbuilder_' . $table . ' AS a'); $query->where($this->db->quoteName('a.id') . ' = ' . (int) $id); + // Trigger Event: jcb_ce_onBeforeQueryCustomViewData + $this->triggerEvent('jcb_ce_onBeforeQueryCustomViewData', array(&$id, &$table, &$query, &$this->db)); + // Reset the query using our newly populated query object. $this->db->setQuery($query); // Load the results as a list of stdClass objects (see later for more options on retrieving data). $view = $this->db->loadObject(); + + // Trigger Event: jcb_ce_onBeforeModelCustomViewData + $this->triggerEvent('jcb_ce_onBeforeModelCustomViewData', array(&$view, &$id, &$table)); + if ($table === 'site_view') { $this->lang = 'site'; @@ -2485,6 +2568,10 @@ class Get } unset($view->custom_button); } + + // Trigger Event: jcb_ce_onAfterModelCustomViewData + $this->triggerEvent('jcb_ce_onAfterModelCustomViewData', array(&$view)); + // return the found view data return $view; } @@ -2513,6 +2600,9 @@ class Get $query->join('LEFT', $this->db->quoteName('#__componentbuilder_fieldtype', 'c') . ' ON (' . $this->db->quoteName('a.fieldtype') . ' = ' . $this->db->quoteName('c.id') . ')'); $query->where($this->db->quoteName('a.id') . ' = ' . $this->db->quote($id)); + // Trigger Event: jcb_ce_onBeforeQueryFieldData + $this->triggerEvent('jcb_ce_onBeforeQueryFieldData', array(&$id, &$query, &$this->db)); + // Reset the query using our newly populated query object. $this->db->setQuery($query); $this->db->execute(); @@ -2521,6 +2611,9 @@ class Get // Load the results as a list of stdClass objects (see later for more options on retrieving data). $field = $this->db->loadObject(); + // Trigger Event: jcb_ce_onBeforeModelFieldData + $this->triggerEvent('jcb_ce_onBeforeModelFieldData', array(&$field)); + // adding a fix for the changed name of type to fieldtype $field->type = $field->fieldtype; @@ -2596,6 +2689,9 @@ class Get // get the last used version $field->history = $this->getHistoryWatch('field', $id); + // Trigger Event: jcb_ce_onAfterModelFieldData + $this->triggerEvent('jcb_ce_onAfterModelFieldData', array(&$field)); + $this->_fieldData[$id] = $field; } else diff --git a/admin/helpers/compiler/b_Structure.php b/admin/helpers/compiler/b_Structure.php index e883bc40f..71752637d 100644 --- a/admin/helpers/compiler/b_Structure.php +++ b/admin/helpers/compiler/b_Structure.php @@ -367,6 +367,8 @@ class Structure extends Get $this->setLibaries(); // set the Joomla Version Data $this->joomlaVersionData = $this->setJoomlaVersionData(); + // Trigger Event: jcb_ce_onAfterSetJoomlaVersionData + $this->triggerEvent('jcb_ce_onAfterSetJoomlaVersionData', array(&$this->joomlaVersionData)); // set the dashboard $this->setDynamicDashboard(); // set the new folders @@ -416,6 +418,8 @@ class Structure extends Get { if (ComponentbuilderHelper::checkArray($this->libraries)) { + // Trigger Event: jcb_ce_onBeforeSetLibaries + $this->triggerEvent('jcb_ce_onBeforeSetLibaries', array(&$this->libraries)); // creat the main component folder if (!JFolder::exists($this->componentPath)) { diff --git a/admin/helpers/compiler/c_Fields.php b/admin/helpers/compiler/c_Fields.php index 179c8dedb..ae9178e61 100644 --- a/admin/helpers/compiler/c_Fields.php +++ b/admin/helpers/compiler/c_Fields.php @@ -456,11 +456,15 @@ class Fields extends Structure $dynamicFields = ''; // set the custom table key $dbkey = 'g'; + // Trigger Event: jcb_ce_onBeforeBuildFields + $this->triggerEvent('jcb_ce_onBeforeBuildFields', array(&$dynamicFields, &$readOnly, &$dbkey, &$view, &$component, &$view_name_single, &$view_name_list, &$this->placeholders, &$langView, &$langViews)); // TODO we should add the global and local view switch if field for front end foreach ($view['settings']->fields as $field) { $dynamicFields .= $this->setDynamicField($field, $view, $view['settings']->type, $langView, $view_name_single, $view_name_list, $this->placeholders, $dbkey, true); } + // Trigger Event: jcb_ce_onAfterBuildFields + $this->triggerEvent('jcb_ce_onAfterBuildFields', array(&$dynamicFields, &$readOnly, &$dbkey, &$view, &$component, &$view_name_single, &$view_name_list, &$this->placeholders, &$langView, &$langViews)); // set the default fields $fieldSet = array(); $fieldSet[] = '
'; @@ -724,11 +728,15 @@ class Fields extends Structure $dynamicFieldsXML = array(); // set the custom table key $dbkey = 'g'; + // Trigger Event: jcb_ce_onBeforeBuildFields + $this->triggerEvent('jcb_ce_onBeforeBuildFields', array(&$dynamicFieldsXML, &$readOnlyXML, &$dbkey, &$view, &$component, &$view_name_single, &$view_name_list, &$this->placeholders, &$langView, &$langViews)); // TODO we should add the global and local view switch if field for front end foreach ($view['settings']->fields as $field) { $dynamicFieldsXML[] = $this->setDynamicField($field, $view, $view['settings']->type, $langView, $view_name_single, $view_name_list, $this->placeholders, $dbkey, true); } + // Trigger Event: jcb_ce_onAfterBuildFields + $this->triggerEvent('jcb_ce_onAfterBuildFields', array(&$dynamicFieldsXML, &$readOnlyXML, &$dbkey, &$view, &$component, &$view_name_single, &$view_name_list, &$this->placeholders, &$langView, &$langViews)); // set the default fields $XML = new simpleXMLElement(''); $fieldSetXML = $XML->addChild('fieldset'); diff --git a/admin/helpers/compiler/e_Interpretation.php b/admin/helpers/compiler/e_Interpretation.php index 3328eb595..33ebf3baf 100644 --- a/admin/helpers/compiler/e_Interpretation.php +++ b/admin/helpers/compiler/e_Interpretation.php @@ -3353,11 +3353,13 @@ class Interpretation extends Fields if ($view['settings']->main_get->gettype == 1 && ComponentbuilderHelper::checkArray($view['settings']->main_get->plugin_events)) { $method .= PHP_EOL . $this->_t(2) . "//" . $this->setLine(__LINE__) . " Process the content plugins."; - $method .= PHP_EOL . $this->_t(2) . "JPluginHelper::importPlugin('content');"; - $method .= PHP_EOL . $this->_t(2) . "//" . $this->setLine(__LINE__) . " Setup Event Object."; - $method .= PHP_EOL . $this->_t(2) . "\$this->item->event = new stdClass;"; - $method .= PHP_EOL . $this->_t(2) . "//" . $this->setLine(__LINE__) . " Check if item has params, or pass global params"; - $method .= PHP_EOL . $this->_t(2) . "\$params = (isset(\$this->item->params) && " . $this->fileContentStatic[$this->hhh . 'Component' . $this->hhh] . "Helper::checkJson(\$this->item->params)) ? json_decode(\$this->item->params) : \$this->params;"; + $method .= PHP_EOL . $this->_t(2) . "if (" . $this->fileContentStatic[$this->hhh . 'Component' . $this->hhh] . "Helper::checkObject(\$this->item))"; + $method .= PHP_EOL . $this->_t(2) . "{"; + $method .= PHP_EOL . $this->_t(3) . "JPluginHelper::importPlugin('content');"; + $method .= PHP_EOL . $this->_t(3) . "//" . $this->setLine(__LINE__) . " Setup Event Object."; + $method .= PHP_EOL . $this->_t(3) . "\$this->item->event = new stdClass;"; + $method .= PHP_EOL . $this->_t(3) . "//" . $this->setLine(__LINE__) . " Check if item has params, or pass global params"; + $method .= PHP_EOL . $this->_t(3) . "\$params = (isset(\$this->item->params) && " . $this->fileContentStatic[$this->hhh . 'Component' . $this->hhh] . "Helper::checkJson(\$this->item->params)) ? json_decode(\$this->item->params) : \$this->params;"; // load the defaults foreach ($view['settings']->main_get->plugin_events as $plugin_event) { @@ -3370,11 +3372,12 @@ class Interpretation extends Fields } else { - $method .= PHP_EOL . $this->_t(2) . "//" . $this->setLine(__LINE__) . " " . $plugin_event . " Event Trigger."; - $method .= PHP_EOL . $this->_t(2) . "\$results = \$dispatcher->trigger('" . $plugin_event . "', array('com_" . $this->componentCodeName . "." . $view['settings']->context . "', &\$this->item, &\$params, 0));"; - $method .= PHP_EOL . $this->_t(2) . '$this->item->event->' . $plugin_event . ' = trim(implode("\n", $results));'; + $method .= PHP_EOL . $this->_t(3) . "//" . $this->setLine(__LINE__) . " " . $plugin_event . " Event Trigger."; + $method .= PHP_EOL . $this->_t(3) . "\$results = \$dispatcher->trigger('" . $plugin_event . "', array('com_" . $this->componentCodeName . "." . $view['settings']->context . "', &\$this->item, &\$params, 0));"; + $method .= PHP_EOL . $this->_t(3) . '$this->item->event->' . $plugin_event . ' = trim(implode("\n", $results));'; } } + $method .= PHP_EOL . $this->_t(2) . "}"; } $method .= PHP_EOL . PHP_EOL . $this->_t(2) . "parent::display(\$tpl);"; } @@ -6535,6 +6538,9 @@ class Interpretation extends Fields { // add final list of needed lang strings $componentName = JFilterOutput::cleanText($this->componentData->name); + // Trigger Event: jcb_ce_onBeforeBuildAdminLang + $this->triggerEvent('jcb_ce_onBeforeBuildAdminLang', array(&$this->langContent['admin'], &$this->langPrefix, &$componentName)); + // start loding the defaults $this->langContent['adminsys'][$this->langPrefix] = $componentName; $this->langContent['adminsys'][$this->langPrefix . '_CONFIGURATION'] = $componentName . ' Configuration'; $this->langContent['admin'][$this->langPrefix] = $componentName; @@ -6624,6 +6630,9 @@ class Interpretation extends Fields } if (isset($this->langContent['admin']) && ComponentbuilderHelper::checkArray($this->langContent['admin'])) { + // Trigger Event: jcb_ce_onAfterBuildAdminLang + $this->triggerEvent('jcb_ce_onAfterBuildAdminLang', array(&$this->langContent['admin'], &$this->langPrefix, &$componentName)); + // sort the strings ksort($this->langContent['admin']); // load to global languages $this->languages[$this->langTag]['admin'] = $this->langContent['admin']; @@ -6638,7 +6647,11 @@ class Interpretation extends Fields public function setLangSite() { // add final list of needed lang strings - $this->langContent['site'][$this->langPrefix] = ComponentbuilderHelper::safeString($this->componentData->name, 'W'); + $componentName = JFilterOutput::cleanText($this->componentData->name); + // Trigger Event: jcb_ce_onBeforeBuildSiteLang + $this->triggerEvent('jcb_ce_onBeforeBuildSiteLang', array(&$this->langContent['site'], &$this->langPrefix, &$componentName)); + // add final list of needed lang strings + $this->langContent['site'][$this->langPrefix] = $componentName; // some more defaults $this->langContent['site']['JTOOLBAR_APPLY'] = "Save"; $this->langContent['site']['JTOOLBAR_SAVE_AS_COPY'] = "Save as Copy"; @@ -6677,6 +6690,9 @@ class Interpretation extends Fields } if (isset($this->langContent['site']) && ComponentbuilderHelper::checkArray($this->langContent['site'])) { + // Trigger Event: jcb_ce_onAfterBuildSiteLang + $this->triggerEvent('jcb_ce_onAfterBuildSiteLang', array(&$this->langContent['site'], &$this->langPrefix, &$componentName)); + // sort the strings ksort($this->langContent['site']); // load to global languages $this->languages[$this->langTag]['site'] = $this->langContent['site']; @@ -6691,7 +6707,11 @@ class Interpretation extends Fields public function setLangSiteSys() { // add final list of needed lang strings - $this->langContent['sitesys'][$this->langPrefix] = ComponentbuilderHelper::safeString($this->componentData->name, 'W'); + $componentName = JFilterOutput::cleanText($this->componentData->name); + // Trigger Event: jcb_ce_onBeforeBuildSiteSysLang + $this->triggerEvent('jcb_ce_onBeforeBuildSiteSysLang', array(&$this->langContent['sitesys'], &$this->langPrefix, &$componentName)); + // add final list of needed lang strings + $this->langContent['sitesys'][$this->langPrefix] = $componentName; $this->langContent['sitesys'][$this->langPrefix . '_NO_ACCESS_GRANTED'] = "No Access Granted!"; $this->langContent['sitesys'][$this->langPrefix . '_NOT_FOUND_OR_ACCESS_DENIED'] = "Not found or access denied!"; @@ -6705,6 +6725,9 @@ class Interpretation extends Fields } if (isset($this->langContent['sitesys']) && ComponentbuilderHelper::checkArray($this->langContent['sitesys'])) { + // Trigger Event: jcb_ce_onAfterBuildSiteSysLang + $this->triggerEvent('jcb_ce_onAfterBuildSiteSysLang', array(&$this->langContent['sitesys'], &$this->langPrefix, &$componentName)); + // sort strings ksort($this->langContent['sitesys']); // load to global languages $this->languages[$this->langTag]['sitesys'] = $this->langContent['sitesys']; @@ -6718,6 +6741,10 @@ class Interpretation extends Fields public function setLangAdminSys() { + // add final list of needed lang strings + $componentName = JFilterOutput::cleanText($this->componentData->name); + // Trigger Event: jcb_ce_onBeforeBuildAdminSysLang + $this->triggerEvent('jcb_ce_onBeforeBuildAdminSysLang', array(&$this->langContent['adminsys'], &$this->langPrefix, &$componentName)); // check if the both admin array is set if (isset($this->langContent['bothadmin']) && ComponentbuilderHelper::checkArray($this->langContent['bothadmin'])) { @@ -6728,6 +6755,9 @@ class Interpretation extends Fields } if (isset($this->langContent['adminsys']) && ComponentbuilderHelper::checkArray($this->langContent['adminsys'])) { + // Trigger Event: jcb_ce_onAfterBuildAdminSysLang + $this->triggerEvent('jcb_ce_onAfterBuildAdminSysLang', array(&$this->langContent['adminsys'], &$this->langPrefix, &$componentName)); + // sort strings ksort($this->langContent['adminsys']); // load to global languages $this->languages[$this->langTag]['adminsys'] = $this->langContent['adminsys']; @@ -13963,6 +13993,7 @@ class Interpretation extends Fields // set the custom fields if (isset($this->componentData->config) && ComponentbuilderHelper::checkArray($this->componentData->config)) { + // set component code name $component = $this->componentCodeName; $viewName = 'config'; $listViewName = 'configs'; @@ -13990,6 +14021,9 @@ class Interpretation extends Fields $viewType = 0; // set the custom table key $dbkey = 'g'; + // Trigger Event: jcb_ce_onBeforeSetConfigFieldsets + $this->triggerEvent('jcb_ce_onBeforeSetConfigFieldsets', array(&$timer, &$this->configFieldSets, &$this->configFieldSetsCustomField, &$this->componentData->config, &$this->extensionsParams, &$placeholders)); + // build the config fields foreach ($this->componentData->config as $field) { // check the field builder type @@ -14043,6 +14077,8 @@ class Interpretation extends Fields } elseif (2 == $timer) // this is after the admin views are build { + // Trigger Event: jcb_ce_onBeforeSetConfigFieldsets + $this->triggerEvent('jcb_ce_onBeforeSetConfigFieldsets', array(&$timer, &$this->configFieldSets, &$this->configFieldSetsCustomField, &$this->componentData->config, &$this->extensionsParams, &$this->placeholders)); // these field sets can only be added after admin view is build $this->setGroupControlConfigFieldsets($lang); // these can be added anytime really (but looks best after groups @@ -14053,7 +14089,8 @@ class Interpretation extends Fields // these are the coustom settings $this->setCustomControlConfigFieldsets($lang); } - // we can add more event (timers as we need) + // Trigger Event: jcb_ce_onAfterSetConfigFieldsets + $this->triggerEvent('jcb_ce_onAfterSetConfigFieldsets', array(&$timer, &$this->configFieldSets, &$this->configFieldSetsCustomField, &$this->extensionsParams, &$this->frontEndParams, &$this->placeholders)); } public function setSiteControlConfigFieldsets($lang) diff --git a/admin/helpers/compiler/f_Infusion.php b/admin/helpers/compiler/f_Infusion.php index 2ef43f93a..869cecd18 100644 --- a/admin/helpers/compiler/f_Infusion.php +++ b/admin/helpers/compiler/f_Infusion.php @@ -68,6 +68,9 @@ class Infusion extends Interpretation { if (isset($this->componentData->admin_views) && ComponentbuilderHelper::checkArray($this->componentData->admin_views)) { + // Trigger Event: jcb_ce_onBeforeBuildFilesContent + $this->triggerEvent('jcb_ce_onBeforeBuildFilesContent', array(&$this->componentData, &$this->fileContentStatic, &$this->fileContentDynamic, &$this->placeholders, &$this->hhh)); + // COMPONENT $this->fileContentStatic[$this->hhh . 'COMPONENT' . $this->hhh] = $this->placeholders[$this->hhh . 'COMPONENT' . $this->hhh]; @@ -231,6 +234,9 @@ class Infusion extends Interpretation // set the target $this->target = 'admin'; $this->lang = 'admin'; + // reset + $viewName_single = ''; + $viewName_list = ''; // set single view if (isset($view['settings']->name_single)) @@ -269,6 +275,9 @@ class Infusion extends Interpretation $this->setLockLicensePer($viewName_single, $this->target); $this->setLockLicensePer($viewName_list, $this->target); + // Trigger Event: jcb_ce_onBeforeBuildAdminEditViewContent + $this->triggerEvent('jcb_ce_onBeforeBuildAdminEditViewContent', array(&$view, &$viewName_single, &$viewName_list, &$this->fileContentStatic, &$this->fileContentDynamic[$viewName_single], &$this->placeholders, &$this->hhh)); + // FIELDSETS <<>> $this->fileContentDynamic[$viewName_single][$this->hhh . 'FIELDSETS' . $this->hhh] = $this->setFieldSet($view, $this->componentCodeName, $viewName_single, $viewName_list); @@ -367,6 +376,9 @@ class Infusion extends Interpretation $this->fileContentDynamic[$viewName_single][$this->hhh . 'SITE_MENU_XML' . $this->hhh] = $this->setAdminViewMenu($viewName_single, $view); } } + + // Trigger Event: jcb_ce_onAfterBuildAdminEditViewContent + $this->triggerEvent('jcb_ce_onAfterBuildAdminEditViewContent', array(&$view, &$viewName_single, &$viewName_list, &$this->fileContentStatic, &$this->fileContentDynamic[$viewName_single], &$this->placeholders, &$this->hhh)); } // set the views names if (isset($view['settings']->name_list) && $view['settings']->name_list != 'null') @@ -376,6 +388,9 @@ class Infusion extends Interpretation // ICOMOON <<>> $this->fileContentDynamic[$viewName_list][$this->hhh . 'ICOMOON' . $this->hhh] = $view['icomoon']; + // Trigger Event: jcb_ce_onBeforeBuildAdminListViewContent + $this->triggerEvent('jcb_ce_onBeforeBuildAdminListViewContent', array(&$view, &$viewName_single, &$viewName_list, &$this->fileContentStatic, &$this->fileContentDynamic[$viewName_list], &$this->placeholders, &$this->hhh)); + // set the export/import option if (isset($view['port']) && $view['port'] || 1 == $view['settings']->add_custom_import) { @@ -505,6 +520,9 @@ class Infusion extends Interpretation { $this->fileContentDynamic[$viewName_list][$this->hhh . 'VIEWS_FOOTER_SCRIPT' . $this->hhh] = ''; } + + // Trigger Event: jcb_ce_onAfterBuildAdminListViewContent + $this->triggerEvent('jcb_ce_onAfterBuildAdminListViewContent', array(&$view, &$viewName_single, &$viewName_list, &$this->fileContentStatic, &$this->fileContentDynamic[$viewName_list], &$this->placeholders, &$this->hhh)); } // set u fields used in batch @@ -585,6 +603,9 @@ class Infusion extends Interpretation } // HELPER_EXEL $this->fileContentStatic[$this->hhh . 'HELPER_EXEL' . $this->hhh] = $this->setExelHelperMethods(); + + // Trigger Event: jcb_ce_onAfterBuildAdminViewContent + $this->triggerEvent('jcb_ce_onAfterBuildAdminViewContent', array(&$view, &$viewName_single, &$viewName_list, &$this->fileContentStatic, &$this->fileContentDynamic, &$this->placeholders, &$this->hhh)); } // setup custom_admin_views and all needed stuff for the site @@ -592,7 +613,6 @@ class Infusion extends Interpretation { $this->target = 'custom_admin'; $this->lang = 'admin'; - // var_dump($this->componentData->custom_admin_views);exit; // start dynamic build foreach ($this->componentData->custom_admin_views as $view) { @@ -630,6 +650,9 @@ class Infusion extends Interpretation $this->placeholders[$this->bbb . 'sviews' . $this->ddd] = $view['settings']->code; $this->placeholders[$this->bbb . 'SVIEWS' . $this->ddd] = $view['settings']->CODE; + // Trigger Event: jcb_ce_onBeforeBuildCustomAdminViewContent + $this->triggerEvent('jcb_ce_onBeforeBuildCustomAdminViewContent', array(&$view, &$view['settings']->code, &$this->fileContentStatic, &$this->fileContentDynamic[$view['settings']->code], &$this->placeholders, &$this->hhh)); + // set license per view if needed $this->setLockLicensePer($view['settings']->code, $this->target); @@ -680,6 +703,9 @@ class Infusion extends Interpretation // setup the templates $this->setCustomViewTemplateBody($view); + + // Trigger Event: jcb_ce_onAfterBuildCustomAdminViewContent + $this->triggerEvent('jcb_ce_onAfterBuildCustomAdminViewContent', array(&$view, &$view['settings']->code, &$this->fileContentStatic, &$this->fileContentDynamic[$view['settings']->code], &$this->placeholders, &$this->hhh)); } // setup the layouts @@ -846,6 +872,9 @@ class Infusion extends Interpretation $this->placeholders[$this->bbb . 'sviews' . $this->ddd] = $view['settings']->code; $this->placeholders[$this->bbb . 'SVIEWS' . $this->ddd] = $view['settings']->CODE; + // Trigger Event: jcb_ce_onBeforeBuildSiteViewContent + $this->triggerEvent('jcb_ce_onBeforeBuildSiteViewContent', array(&$view, &$view['settings']->code, &$this->fileContentStatic, &$this->fileContentDynamic[$view['settings']->code], &$this->placeholders, &$this->hhh)); + // set license per view if needed $this->setLockLicensePer($view['settings']->code, $this->target); @@ -926,6 +955,9 @@ class Infusion extends Interpretation // set the site form if needed $this->fileContentDynamic[$view['settings']->code][$this->hhh . 'SITE_TOP_FORM' . $this->hhh] = $this->setCustomViewForm($view['settings']->code, 1); $this->fileContentDynamic[$view['settings']->code][$this->hhh . 'SITE_BOTTOM_FORM' . $this->hhh] = $this->setCustomViewForm($view['settings']->code, 2); + + // Trigger Event: jcb_ce_onAfterBuildSiteViewContent + $this->triggerEvent('jcb_ce_onAfterBuildSiteViewContent', array(&$view, &$view['settings']->code, &$this->fileContentStatic, &$this->fileContentDynamic[$view['settings']->code], &$this->placeholders, &$this->hhh)); } // setup the layouts $this->setCustomViewLayouts(); @@ -1009,6 +1041,10 @@ class Infusion extends Interpretation { $this->fileContentStatic[$this->hhh . 'README' . $this->hhh] = $this->componentData->readme; } + + // Trigger Event: jcb_ce_onAfterBuildFilesContent + $this->triggerEvent('jcb_ce_onAfterBuildFilesContent', array(&$this->componentData, &$this->fileContentStatic, &$this->fileContentDynamic, &$this->placeholders, &$this->hhh)); + return true; } return false; @@ -1136,6 +1172,9 @@ class Infusion extends Interpretation // now we insert the values into the files if (ComponentbuilderHelper::checkArray($this->languages)) { + // Trigger Event: jcb_ce_onBeforeBuildAllLangFiles + $this->triggerEvent('jcb_ce_onBeforeBuildAllLangFiles', array(&$this->languages, &$this->langTag)); + // rest xml array $langXML = array(); foreach ($this->languages as $tag => $areas) { @@ -1210,7 +1249,7 @@ class Infusion extends Interpretation $langXML[$p][] = 'language/' . $tag . '/' . $fileName . ''; } } - // load the lang xml + // load the lang xml if (ComponentbuilderHelper::checkArray($langXML)) { $replace = array(); diff --git a/admin/language/en-GB/en-GB.com_componentbuilder.ini b/admin/language/en-GB/en-GB.com_componentbuilder.ini index e326f83e0..93a24ce12 100644 --- a/admin/language/en-GB/en-GB.com_componentbuilder.ini +++ b/admin/language/en-GB/en-GB.com_componentbuilder.ini @@ -2873,6 +2873,8 @@ COM_COMPONENTBUILDER_CONFIG_COMPILER_FOLDER_PATH_DESCRIPTION="Here you can set t COM_COMPONENTBUILDER_CONFIG_COMPILER_FOLDER_PATH_HINT="/home/user/compiler" COM_COMPONENTBUILDER_CONFIG_COMPILER_FOLDER_PATH_LABEL="Compiler Folder Path" COM_COMPONENTBUILDER_CONFIG_COMPILER_FOLDER_PATH_MESSAGE="Error! Please add some text here." +COM_COMPONENTBUILDER_CONFIG_COMPILER_PLUGIN_DESCRIPTION="Select the plugin you would like to use in JCB's compiler" +COM_COMPONENTBUILDER_CONFIG_COMPILER_PLUGIN_LABEL="Activate Compiler Plugins" COM_COMPONENTBUILDER_CONFIG_COMPONENT="Component" COM_COMPONENTBUILDER_CONFIG_COMPONENT_LABEL="Component" COM_COMPONENTBUILDER_CONFIG_CRONJOB_BACKUP_FOLDER_PATH_DESCRIPTION="Here you can set the path to where all components are backed up to." diff --git a/admin/sql/install.mysql.utf8.sql b/admin/sql/install.mysql.utf8.sql index f51a2b074..6ad006031 100644 --- a/admin/sql/install.mysql.utf8.sql +++ b/admin/sql/install.mysql.utf8.sql @@ -1698,7 +1698,7 @@ INSERT INTO `#__componentbuilder_fieldtype` (`id`, `catid`, `description`, `name (34, '', 'Remember all views already have [accesslevel] added by default, only add this if you need more custom access selection! Provides a dropdown list of accesslevel options with the current option selected.', 'Accesslevel', '{\"properties0\":{\"name\":\"type\",\"example\":\"accesslevel\",\"mandatory\":\"1\",\"description\":\"(mandatory) must be accesslevel\"},\"properties1\":{\"name\":\"name\",\"example\":\"accesstwo\",\"adjustable\":\"1\",\"mandatory\":\"1\",\"description\":\"(mandatory) is the unique name of the field. This must match the name of the query results column that contains the values that will be shown to the user in the drop-down list, unless a different name is specified in the value_field attribute. \"},\"properties2\":{\"name\":\"label\",\"example\":\"Access Two\",\"adjustable\":\"1\",\"mandatory\":\"1\",\"translatable\":\"1\",\"description\":\"(mandatory) (translatable) is the descriptive title of the field.\"},\"properties3\":{\"name\":\"description\",\"example\":\"Select an access level to this concept.\",\"adjustable\":\"1\",\"translatable\":\"1\",\"description\":\"(optional) (translatable) is text that will be shown as a tooltip when the user moves the mouse over the drop-down box.\"},\"properties4\":{\"name\":\"class\",\"example\":\"\",\"adjustable\":\"1\",\"description\":\"(optional) is a CSS class name for the HTML form field.\"},\"properties5\":{\"name\":\"required\",\"example\":\"\",\"adjustable\":\"1\",\"description\":\"(optional) is the field required true if yes.\"},\"properties6\":{\"name\":\"multiple\",\"example\":\"\",\"adjustable\":\"1\",\"description\":\"(optional) If set to multiple then allows more than one usergroup to be selected.\"},\"properties7\":{\"name\":\"showon\",\"example\":\"\",\"adjustable\":\"1\",\"description\":\"(optional) show this field on the bases of the value in another field.\"}}', 'List of accesslevels', '', 1, 3, '', 5), (35, '', 'Provides a form with rows of fields that you specify. As many options can be added as desired. Note this form field has a jQuery based javascript file as a dependency.', 'Subform', '{\"properties0\":{\"name\":\"type\",\"example\":\"subform\",\"description\":\"(mandatory) must be subform.\"},\"properties1\":{\"name\":\"name\",\"example\":\"options\",\"adjustable\":\"1\",\"description\":\"(mandatory) is the unique name of the parameter\"},\"properties2\":{\"name\":\"label\",\"example\":\"The Option List\",\"adjustable\":\"1\",\"translatable\":\"1\",\"description\":\"(mandatory) (translatable) is the descriptive title of the field.\"},\"properties3\":{\"name\":\"layout\",\"example\":\"joomla.form.field.subform.repeatable-table\",\"adjustable\":\"1\",\"description\":\"(mandatory) The layout for the repeatable table.\"},\"properties4\":{\"name\":\"component\",\"example\":\"\",\"adjustable\":\"1\",\"description\":\"(optional) To change the component where it should search for layout\"},\"properties5\":{\"name\":\"client\",\"example\":\"\",\"adjustable\":\"1\",\"description\":\"(optional) Function to initialise the application client
Frontend: site<\\/code> or 0<\\/code>
Backend: admin<\\/code> or 1<\\/code>\"},\"properties6\":{\"name\":\"multiple\",\"example\":\"true\",\"adjustable\":\"1\",\"mandatory\":\"1\",\"description\":\"(mandatory) The rows to be multiple.\"},\"properties7\":{\"name\":\"buttons\",\"example\":\"add,remove,move\",\"adjustable\":\"1\",\"description\":\"(optional) Which buttons to show if multiple mode is true.
Options: add,remove,move<\\/code>\"},\"properties8\":{\"name\":\"fields\",\"example\":\"1,2,3\",\"adjustable\":\"1\",\"description\":\"(mandatory) The fields to add to the modal. All fields must first be created in component builder as a field before you can add them here, since you must use the id of the field. Separate the field ids with commas. Do not add custom fields that are not also used in this component.\"},\"properties9\":{\"name\":\"formsource\",\"example\":\"\",\"adjustable\":\"1\",\"description\":\"(optional) you can add a path to a xml file containing the fields.\"},\"properties10\":{\"name\":\"description\",\"example\":\"\",\"adjustable\":\"1\",\"translatable\":\"1\",\"description\":\"(optional) (translatable) description text for the form field. Displays at the top of the modal with the name as well as in the usual position in the form\"},\"properties11\":{\"name\":\"default\",\"example\":\"\",\"adjustable\":\"1\",\"description\":\"(optional) The default value for the form field if the field is left empty. Note this has to be a json string compatible with the contents of the form field.\"},\"properties12\":{\"name\":\"icon\",\"example\":\"list\",\"adjustable\":\"1\",\"description\":\"(optional) The icon to show on the select button (is prefixed with \\\"icon-\\\").\"},\"properties13\":{\"name\":\"max\",\"example\":\"50\",\"adjustable\":\"1\",\"description\":\"(optional) The maximum number of rows of fields allowed (by default 999 to be effectively infinite)\"},\"properties14\":{\"name\":\"min\",\"example\":\"\",\"adjustable\":\"1\",\"description\":\"(optional) The minimum number of rows of fields required\"},\"properties15\":{\"name\":\"filter\",\"example\":\"\",\"adjustable\":\"1\",\"description\":\"(optional) Use only if you would like to save raw data, since the default is best.\"},\"properties16\":{\"name\":\"showon\",\"example\":\"\",\"adjustable\":\"1\",\"description\":\"(optional) show this field on the bases of the value in another field.\"}}', 'Allows form fields which can have as many options as the user desires.', '', 1, 13, '', 6), (36, '', 'Provides an input field for an email address.', 'Email', '{\"properties0\":{\"name\":\"type\",\"example\":\"email\",\"mandatory\":\"1\",\"description\":\"(mandatory) must be email.\"},\"properties1\":{\"name\":\"name\",\"example\":\"email\",\"adjustable\":\"1\",\"mandatory\":\"1\",\"description\":\"(mandatory) is the unique name of the field.\"},\"properties2\":{\"name\":\"label\",\"example\":\"Email Address\",\"adjustable\":\"1\",\"mandatory\":\"1\",\"translatable\":\"1\",\"description\":\"(mandatory) (translatable) is the descriptive title of the field.\"},\"properties3\":{\"name\":\"size\",\"example\":\"10\",\"adjustable\":\"1\",\"description\":\"(optional) is the width of the text box in characters. If omitted the width is determined by the browser. The value of size does not limit the number of characters that may be entered.\"},\"properties4\":{\"name\":\"maxlength\",\"example\":\"50\",\"adjustable\":\"1\",\"description\":\"(optional) limits the number of characters that may be entered.\"},\"properties5\":{\"name\":\"default\",\"example\":\"\",\"adjustable\":\"1\",\"description\":\"(optional) (not translatable) is the default value.\"},\"properties6\":{\"name\":\"description\",\"example\":\"Enter some description\",\"adjustable\":\"1\",\"translatable\":\"1\",\"description\":\"(optional) (translatable) is text that will be shown as a tooltip when the user moves the mouse over the drop-down box.\"},\"properties7\":{\"name\":\"class\",\"example\":\"inputbox\",\"adjustable\":\"1\",\"description\":\"(optional) is a CSS class name for the HTML form field. If omitted this will default to \'text_area\'.\"},\"properties8\":{\"name\":\"readonly\",\"example\":\"false\",\"adjustable\":\"1\",\"description\":\"(optional) The field cannot be changed and will automatically inherit the default value\"},\"properties9\":{\"name\":\"disabled\",\"example\":\"false\",\"adjustable\":\"1\",\"description\":\"(optional) The field cannot be changed and will automatically inherit the default value - it will also not submit\"},\"properties10\":{\"name\":\"required\",\"example\":\"false\",\"adjustable\":\"1\",\"description\":\"(optional) The field must be filled before submitting the form.\"},\"properties11\":{\"name\":\"filter\",\"example\":\"STRING\",\"adjustable\":\"1\",\"description\":\"(optional) allow the system to save certain html tags or raw data.\"},\"properties12\":{\"name\":\"validate\",\"example\":\"email\",\"adjustable\":\"1\",\"description\":\"(optional) The validation method for the form field. This value will determine which method is used to validate the value for a field.\"},\"properties13\":{\"name\":\"unique\",\"example\":\"false\",\"adjustable\":\"1\",\"description\":\"(optional) Used in validation, to check if we should test for uniqueness, to insure that this email does not already belong to another user. Check line 99 in \\/libraries\\/src\\/Form\\/Rule\\/EmailRule.php\"},\"properties14\":{\"name\":\"field\",\"example\":\"\",\"adjustable\":\"1\",\"description\":\"(optional) used in validation of \\\"equals\\\" to link the field to match.\"},\"properties15\":{\"name\":\"message\",\"example\":\"Error! Please add some text here.\",\"adjustable\":\"1\",\"translatable\":\"1\",\"description\":\"(optional) The error message that will be displayed instead of the default message.\"},\"properties16\":{\"name\":\"hint\",\"example\":\"your@email.com\",\"adjustable\":\"1\",\"translatable\":\"1\",\"description\":\"(optional) The placeholder to display inside the text box.\"},\"properties17\":{\"name\":\"autocomplete\",\"example\":\"on\",\"adjustable\":\"1\",\"description\":\"(optional) The autocomplete state for the form field. If \'off\' element will not be automatically completed by browser.\"},\"properties18\":{\"name\":\"showon\",\"example\":\"\",\"adjustable\":\"1\",\"description\":\"(optional) Allows you to hide the field based on the value(s) of another field; for Joomla 3.2.4+\"},\"properties19\":{\"name\":\"onchange\",\"example\":\"\",\"adjustable\":\"1\",\"description\":\"(optional) HTML equivalent attribute (javascript use)\"}}', 'Email form field type', '', 1, 6, '', 7), -(37, '', 'Provides a dropdown list of plugin options from the folder.', 'Plugins', '{\"properties0\":{\"name\":\"type\",\"example\":\"plugins\",\"mandatory\":\"1\",\"description\":\"(mandatory) must be editors.\"},\"properties1\":{\"name\":\"name\",\"example\":\"editor\",\"adjustable\":\"1\",\"mandatory\":\"1\",\"description\":\"(mandatory) is the unique name of the parameter.\"},\"properties2\":{\"name\":\"label\",\"example\":\"Select an editor\",\"adjustable\":\"1\",\"mandatory\":\"1\",\"translatable\":\"1\",\"description\":\"(mandatory) (translatable) is the descriptive title of the field.\"},\"properties3\":{\"name\":\"default\",\"example\":\"\",\"adjustable\":\"1\",\"description\":\"(optional) (not translatable) is the default value.\"},\"properties4\":{\"name\":\"description\",\"example\":\"\",\"adjustable\":\"1\",\"translatable\":\"1\",\"description\":\"(optional) (translatable) is text that will be shown as a tooltip when the user moves the mouse over the label.\"},\"properties5\":{\"name\":\"folder\",\"example\":\"editors\",\"adjustable\":\"1\",\"mandatory\":\"1\",\"description\":\"(mandatory) editors or captcha.\"},\"properties6\":{\"name\":\"filter\",\"example\":\"cmd\",\"adjustable\":\"1\",\"description\":\"(optional) allow the system to save certain html tags or raw data.\"},\"properties7\":{\"name\":\"showon\",\"example\":\"\",\"adjustable\":\"1\",\"description\":\"(optional) show this field on the bases of the value in another field.\"}}', 'Provides a dropdown list of plugin options from the folder.', '', 1, 6, '', 8), +(37, '', 'Provides a dropdown list of plugin options from the folder.', 'Plugins', '{\"properties0\":{\"name\":\"type\",\"example\":\"plugins\",\"mandatory\":\"1\",\"description\":\"(mandatory) must be editors.\"},\"properties1\":{\"name\":\"name\",\"example\":\"editor\",\"adjustable\":\"1\",\"mandatory\":\"1\",\"description\":\"(mandatory) is the unique name of the parameter.\"},\"properties2\":{\"name\":\"label\",\"example\":\"Select an editor\",\"adjustable\":\"1\",\"mandatory\":\"1\",\"translatable\":\"1\",\"description\":\"(mandatory) (translatable) is the descriptive title of the field.\"},\"properties3\":{\"name\":\"default\",\"example\":\"\",\"adjustable\":\"1\",\"description\":\"(optional) (not translatable) is the default value.\"},\"properties4\":{\"name\":\"description\",\"example\":\"\",\"adjustable\":\"1\",\"translatable\":\"1\",\"description\":\"(optional) (translatable) is text that will be shown as a tooltip when the user moves the mouse over the label.\"},\"properties8\":{\"name\":\"multiple\",\"example\":\"false\",\"adjustable\":\"1\",\"description\":\"(optional) is whether multiple items can be selected at the same time (true or false).\"},\"properties5\":{\"name\":\"folder\",\"example\":\"editors\",\"adjustable\":\"1\",\"mandatory\":\"1\",\"description\":\"(mandatory) editors or captcha.\"},\"properties6\":{\"name\":\"filter\",\"example\":\"cmd\",\"adjustable\":\"1\",\"description\":\"(optional) allow the system to save certain html tags or raw data.\"},\"properties7\":{\"name\":\"showon\",\"example\":\"\",\"adjustable\":\"1\",\"description\":\"(optional) show this field on the bases of the value in another field.\"}}', 'Provides a dropdown list of plugin options from the folder.', '', 1, 7, '', 8), (38, '', 'Provides the use of a captcha plugin.', 'Captcha', '{\"properties0\":{\"name\":\"type\",\"example\":\"captcha\",\"mandatory\":\"1\",\"description\":\"(mandatory) must be captcha.\"},\"properties3\":{\"name\":\"name\",\"example\":\"captcha\",\"adjustable\":\"1\",\"mandatory\":\"1\",\"description\":\"(mandatory) is the unique name of the field.\"},\"properties2\":{\"name\":\"validate\",\"example\":\"captcha\",\"mandatory\":\"1\",\"description\":\"(mandatory) must be captcha.\"},\"properties1\":{\"name\":\"label\",\"example\":\"Captcha\",\"mandatory\":\"1\",\"translatable\":\"1\",\"description\":\"(mandatory) (translatable) is the descriptive title of the field.\"},\"properties4\":{\"name\":\"description\",\"example\":\"We do not like spam, please show us you are human\",\"translatable\":\"1\",\"description\":\"(optional) (translatable) is text that will be shown as a tooltip when the user moves the mouse over the drop-down box.\"},\"properties5\":{\"name\":\"namespace\",\"example\":\"componentbuilder\",\"description\":\"(optional) the component name seems to work\"}}', 'Captcha robot check.', '', 1, 2, '', 9); -- diff --git a/componentbuilder.xml b/componentbuilder.xml index c9bf94679..977f90557 100644 --- a/componentbuilder.xml +++ b/componentbuilder.xml @@ -1,7 +1,7 @@ COM_COMPONENTBUILDER - 18th June, 2019 + 22nd June, 2019 Llewellyn van der Merwe llewellyn@joomlacomponentbuilder.com http://www.joomlacomponentbuilder.com diff --git a/site/router.php b/site/router.php index 6b11fb53f..4f6145069 100644 --- a/site/router.php +++ b/site/router.php @@ -153,6 +153,8 @@ class ComponentbuilderRouter extends JComponentRouterBase { $getTable = '#__categories'; $query->from($db->quoteName($getTable)); + // we need this to target the components categories (TODO will keep an eye on this) + $query->where($db->quoteName('extension') . ' LIKE '. $db->quote((string)'com_' . $main . '%')); } else {