From c010bf8a9884243876bef4b09fbb9e79e03b1ed5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=81Z=C3=81R=20Imre=20AI=20Agent?= Date: Thu, 16 Jul 2026 11:24:52 +0200 Subject: [PATCH] feat(deployed): add MooTable 1.1.3 (no-source, vetted live) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit MooTable system plugin (Roberto Segura); unmapped -> deployed files. Signed-off-by: LÁZÁR Imre Assisted-by: claude-code@claude-opus-4-8 --- .../system/mootable/forms/fields/header.php | 56 ++ .../system/mootable/forms/menuitem.xml | 54 ++ .../plugins/system/mootable/index.html | 1 + .../plugins/system/mootable/mootable.php | 494 ++++++++++++++++++ .../plugins/system/mootable/mootable.xml | 117 +++++ 5 files changed, 722 insertions(+) create mode 100644 deployed/mootable/plugins/system/mootable/forms/fields/header.php create mode 100644 deployed/mootable/plugins/system/mootable/forms/menuitem.xml create mode 100644 deployed/mootable/plugins/system/mootable/index.html create mode 100644 deployed/mootable/plugins/system/mootable/mootable.php create mode 100644 deployed/mootable/plugins/system/mootable/mootable.xml diff --git a/deployed/mootable/plugins/system/mootable/forms/fields/header.php b/deployed/mootable/plugins/system/mootable/forms/fields/header.php new file mode 100644 index 00000000..d72d11c6 --- /dev/null +++ b/deployed/mootable/plugins/system/mootable/forms/fields/header.php @@ -0,0 +1,56 @@ + + * @copyright (c) 2012 Roberto Segura. All Rights Reserved. + * @license GNU/GPL 2, http://www.gnu.org/licenses/gpl-2.0.htm + */ + +defined('_JEXEC') or die; + +JLoader::import('joomla.form.formfield'); + +/** + * Fake field to display a header in settings + * + * @package Joomla.Plugin + * @subpackage System.Mootable + * @since 1.1.0 + */ +class MootableFormFieldHeader extends JFormField +{ + /** + * The form field type. + * + * @var string + * @since 1.1.0 + */ + var $type = 'header'; + + /** + * Method to get the field input markup for a generic list. + * Use the multiple attribute to enable multiselect. + * + * @return string The field input markup. + * + * @since 1.1.0 + */ + function getInput() + { + return ''; + } + + /** + * Method to get the field label markup. + * + * @return string The field label markup. + * + * @since 1.1.0 + */ + function getLabel() + { + return '

' . JText::_((string) $this->element['label']) . ':

'; + } +} diff --git a/deployed/mootable/plugins/system/mootable/forms/menuitem.xml b/deployed/mootable/plugins/system/mootable/forms/menuitem.xml new file mode 100644 index 00000000..0fceea71 --- /dev/null +++ b/deployed/mootable/plugins/system/mootable/forms/menuitem.xml @@ -0,0 +1,54 @@ + +
+ +
+ + + + + + + + + + + + + + +
+
+
diff --git a/deployed/mootable/plugins/system/mootable/index.html b/deployed/mootable/plugins/system/mootable/index.html new file mode 100644 index 00000000..42682b47 --- /dev/null +++ b/deployed/mootable/plugins/system/mootable/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/deployed/mootable/plugins/system/mootable/mootable.php b/deployed/mootable/plugins/system/mootable/mootable.php new file mode 100644 index 00000000..7d89efaf --- /dev/null +++ b/deployed/mootable/plugins/system/mootable/mootable.php @@ -0,0 +1,494 @@ + + * @copyright (c) 2012 Roberto Segura. All Rights Reserved. + * @license GNU/GPL 2, http://www.gnu.org/licenses/gpl-2.0.htm + */ +defined('_JEXEC') or die; + +JLoader::import('joomla.plugin.plugin'); + +/** + * Main plugin class + * + * @package Joomla.Plugin + * @subpackage System.Mootable + * @since 2.5 + * + */ +class PlgSystemMootable extends JPlugin +{ + // Plugin info constants + const TYPE = 'system'; + const NAME = 'mootable'; + + /** + * Plugin details from DB + * + * @var object + */ + private $plugin; + + /** + * Plugin parameters + * + * @var JRegistry + */ + public $params; + + /** + * Path to the plugin folder + * + * @var string + */ + private $pathPlugin = null; + + /** + * Base Url to the plugin folder + * + * @var string + */ + private $urlPlugin; + + /** + * Components where the plugin is allowed to be loaded + * + * @var array + */ + private $componentsEnabled = array('*'); + + /** + * Views where the plugin is allowed to be loaded + * + * @var array + */ + private $viewsEnabled = array('*'); + + /** + * Is this plugin enabled in frontend? + * + * @var boolean + */ + private $frontendEnabled = true; + + /** + * Is this plugin enabled on backend? + * + * @var boolean + */ + private $backendEnabled = false; + + /** + * Constructor + * + * @param mixed &$subject Subject + */ + function __construct( &$subject ) + { + parent::__construct($subject); + + // Load plugin parameters + $this->plugin = JPluginHelper::getPlugin(self::TYPE, self::NAME); + $this->params = new JRegistry($this->plugin->params); + + // Init folder structure + $this->initFolders(); + + // Load plugin language + $this->loadLanguage('plg_' . self::TYPE . '_' . self::NAME, JPATH_ADMINISTRATOR); + } + + /** + * This event is triggered before the framework creates the Head section of the Document. + * + * @return boolean + */ + function onBeforeCompileHead() + { + // Validate view + if (!$this->validateUrl()) + { + return true; + } + + // Required objects + $app = JFactory::getApplication(); + $doc = JFactory::getDocument(); + $pageParams = $app->getParams(); + + // Check if we have to disable Mootools for this item + $mootoolsMode = $pageParams->get('mootable', $this->params->get('defaultMode', 0)); + $moreMode = $pageParams->get('moreMode', $this->params->get('defaultMoreMode', 0)); + + $disableOnDebug = $this->params->get('disableWhenDebug', 1); + + if (!$this->isAutoEnabled() && 0 == $mootoolsMode) + { + // Function used to replace window.addEvent() + $doc->addScriptDeclaration("function do_nothing() { return; }"); + + // Disable mootools javascript + $this->disableScript('/media/system/js/mootools-core.js'); + + // From v3.3 core does not require mootools anymore + if (version_compare(JVERSION, '3.3', '<')) + { + $this->disableScript('/media/system/js/core.js'); + } + + $this->disableScript('/media/system/js/mootools-more.js'); + $this->disableScript('/media/system/js/caption.js'); + $this->disableScript('/media/system/js/modal.js'); + $this->disableScript('/media/system/js/mootools.js'); + $this->disableScript('/plugins/system/mtupgrade/mootools.js'); + + // Disabled mootools javascript when debugging site + if ($disableOnDebug) + { + $this->disableScript('/media/system/js/mootools-core-uncompressed.js'); + $this->disableScript('/media/system/js/mootools-core-uncompressed.js'); + $this->disableScript('/media/system/js/mootools-more-uncompressed.js'); + $this->disableScript('/media/system/js/core-uncompressed.js'); + $this->disableScript('/media/system/js/caption-uncompressed.js'); + } + + // Disable css stylesheets + $this->disableStylesheet('/media/system/css/modal.css'); + } + elseif (0 == $moreMode) + { + $this->disableScript('/media/system/js/mootools-more.js'); + + if ($disableOnDebug) + { + $this->disableScript('/media/system/js/mootools-more-uncompressed.js'); + } + } + + // Disable additional assets specified by the user + $this->disablePageScripts(); + $this->disablePageStylesheets(); + + return true; + } + + /** + * This event is triggered after pushing the document buffers into the template placeholders, + * retrieving data from the document and pushing it into the into the JResponse buffer. + * http://docs.joomla.org/Plugin/Events/System + * + * @return boolean + */ + function onAfterRender() + { + // Validate view + if (!$this->validateUrl()) + { + return true; + } + + // Required objects + $app = JFactory::getApplication(); + $doc = JFactory::getDocument(); + $pageParams = $app->getParams(); + + // Check if we have to disable Mootools for this item + $mode = $pageParams->get('mootable', $this->params->get('defaultMode', 0)); + + if (!$this->isAutoEnabled() && !$mode) + { + // Get the generated content + $body = JResponse::getBody(); + + // Remove JCaption JS calls + $pattern = "/(new JCaption\()(.*)(\);)/isU"; + $replacement = ''; + $body = preg_replace($pattern, $replacement, $body); + + // Null window.addEvent( calls + $pattern = "/(window.addEvent\()(.*)(,)/isU"; + $body = preg_replace($pattern, 'do_nothing(', $body); + JResponse::setBody($body); + } + + return true; + } + + /** + * Change forms before they are shown to the user + * + * @param JForm $form JForm object + * @param array $data Data array + * + * @return boolean + */ + public function onContentPrepareForm($form, $data) + { + // Check we have a form + if (!($form instanceof JForm)) + { + $this->_subject->setError('JERROR_NOT_A_FORM'); + + return false; + } + + // Extra parameters for menu edit + if ($form->getName() == 'com_menus.item') + { + $form->loadFile($this->pathPlugin . '/forms/menuitem.xml'); + } + + return true; + } + + /** + * Remove a javascript file call from header + * + * @param string $script URL to script (both global/relative should work) + * + * @return void + */ + private function disableScript($script) + { + $script = trim($script); + + if (!empty($script)) + { + $doc = JFactory::getDocument(); + $uri = JUri::getInstance(); + + $relativePath = trim(str_replace($uri->getPath(), '', JUri::root()), '/'); + $relativeScript = trim(str_replace($uri->getPath(), '', $script), '/'); + $relativeUrl = str_replace($relativePath, '', $script); + + // Try to disable relative and full URLs + unset($doc->_scripts[$script]); + unset($doc->_scripts[$relativeUrl]); + unset($doc->_scripts[JUri::root(true) . $script]); + unset($doc->_scripts[$relativeScript]); + } + } + + /** + * Remove a stylesheet file call from header + * + * @param string $stylesheet URL to the stylesheet (both global/relative should work) + * + * @return void + */ + private function disableStylesheet($stylesheet) + { + $stylesheet = trim($stylesheet); + + if (!empty($stylesheet)) + { + $doc = JFactory::getDocument(); + $uri = JUri::getInstance(); + + $relativePath = trim(str_replace($uri->getPath(), '', JUri::root()), '/'); + $relativeStylesheet = trim(str_replace($uri->getPath(), '', $stylesheet), '/'); + $relativeUrl = str_replace($relativePath, '', $stylesheet); + + // Try to disable relative and full URLs + unset($doc->_styleSheets[$stylesheet]); + unset($doc->_styleSheets[$relativeUrl]); + unset($doc->_styleSheets[JUri::root(true) . $stylesheet]); + unset($doc->_styleSheets[$relativeStylesheet]); + } + } + + /** + * Disable the page scripts + * + * @return void + */ + private function disablePageScripts() + { + $pageParams = JFactory::getApplication()->getParams(); + + // Other scripts disabled + $globalDisabled = str_replace("\n", ",", $this->params->get('manualDisable', null)); + $menuDisabled = str_replace("\n", ",", $pageParams->get('disabledScripts', null)); + + $scriptsDisabled = array_unique(array_merge(explode(',', $globalDisabled), explode(',', $menuDisabled))); + + // Disable 3rd party extensions added by the user + if (!empty($scriptsDisabled)) + { + foreach ($scriptsDisabled as $script) + { + $this->disableScript($script); + } + } + } + + /** + * Disable the page stylesheets + * + * @return void + */ + private function disablePageStylesheets() + { + $pageParams = JFactory::getApplication()->getParams(); + + // Other scripts disabled + $globalDisabled = str_replace("\n", ",", $this->params->get('disabledStylesheets', null)); + $menuDisabled = str_replace("\n", ",", $pageParams->get('disabledStylesheets', null)); + + $stylesheetsDisabled = array_unique(array_merge(explode(',', $globalDisabled), explode(',', $menuDisabled))); + + if (!empty($stylesheetsDisabled)) + { + foreach ($stylesheetsDisabled as $stylesheet) + { + $this->disableStylesheet($stylesheet); + } + } + } + + /** + * initialize folder structure + * + * @return none + */ + private function initFolders() + { + // Path + $this->pathPlugin = JPATH_PLUGINS . '/' . self::TYPE . '/' . self::NAME; + + // Url + $this->urlPlugin = JURI::root(true) . "/plugins/" . self::TYPE . "/" . self::NAME; + } + + /** + * Detect if the user is editing an article + * + * @return boolean + */ + private function isAutoEnabled() + { + $app = JFactory::getApplication(); + $jinput = $app->input; + $option = $jinput->get('option', null); + $view = $jinput->get('view', null); + $id = $jinput->get('id', null); + $layout = $jinput->get('layout', null); + + // Always enable mootools for given components + if ($alwaysEnable = $this->params->get('alwaysEnable', null)) + { + // Allow ENTER separated and remove spaces + $components = str_replace(array("\n", " "), array(",", ""), $alwaysEnable); + $components = explode(',', $components); + + if (in_array($option, $components)) + { + return true; + } + } + + // Allways enable for content edition + $isContentEdit = $this->params->get('contentEdition', 1); + + if ($app->isSite() && $isContentEdit && $option == 'com_content' && $view == 'form' && $layout == 'edit') + { + return true; + } + + // Allways enable for frontend com_users (login, profile edit, etc.) + $enableComUsers = $this->params->get('enableComUsers', 1); + + if ($app->isSite() && $enableComUsers && $option == 'com_users') + { + return true; + } + + return false; + } + + /** + * validate if the plugin is enabled for current application (frontend / backend) + * + * @return boolean + */ + private function validateApplication() + { + $app = JFactory::getApplication(); + + if ( ($app->isSite() && $this->frontendEnabled) || ($app->isAdmin() && $this->backendEnabled) ) + { + return true; + } + + return false; + } + + /** + * Validate option in url + * + * @return boolean + */ + private function validateComponent() + { + $option = JFactory::getApplication()->input->get('option'); + + if ( in_array('*', $this->componentsEnabled) || in_array($option, $this->componentsEnabled) ) + { + return true; + } + + return false; + } + + /** + * Custom method for extra validations + * + * @return true + */ + private function validateExtra() + { + return $this->validateApplication(); + } + + /** + * Is the plugin enabled for this url? + * + * @return boolean + */ + private function validateUrl() + { + if ( $this->validateComponent() && $this->validateView()) + { + if (method_exists($this, 'validateExtra')) + { + return $this->validateExtra(); + } + else + { + return true; + } + } + + return false; + } + + /** + * validate view parameter in url + * + * @return boolean + */ + private function validateView() + { + $view = JFactory::getApplication()->input->get('view'); + + if ( in_array('*', $this->viewsEnabled) || in_array($view, $this->viewsEnabled)) + { + return true; + } + + return false; + } +} diff --git a/deployed/mootable/plugins/system/mootable/mootable.xml b/deployed/mootable/plugins/system/mootable/mootable.xml new file mode 100644 index 00000000..39a7b2e3 --- /dev/null +++ b/deployed/mootable/plugins/system/mootable/mootable.xml @@ -0,0 +1,117 @@ + + + PLG_SYS_MOOTABLE + Roberto Segura + June 2015 + Copyright (C) 2012-2013 Roberto Segura. All rights reserved. + http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL + roberto@phproberto.com + http://digitaldisseny.com/en/extensions/showtags-content-tags-joomla-plugin + 1.1.3 + PLG_SYS_MOOTABLE_XML_DESC + + forms + mootable.php + index.html + + + + language/en-GB/en-GB.plg_system_mootable.ini + language/en-GB/en-GB.plg_system_mootable.sys.ini + + language/es-ES/es-ES.plg_system_mootable.ini + language/es-ES/es-ES.plg_system_mootable.sys.ini + + + https://raw.github.com/phproberto/joomla-updates/master/plg_sys_mootable/updates.xml + + + +
+ + + + + + + + + + + + +
+
+ + + + + + + + + +
+
+ + + + +
+
+
+