diff --git a/src/packages/com_mokowaas/admin/src/Model/DashboardModel.php b/src/packages/com_mokowaas/admin/src/Model/DashboardModel.php index b8674dc5..fbcb447f 100644 --- a/src/packages/com_mokowaas/admin/src/Model/DashboardModel.php +++ b/src/packages/com_mokowaas/admin/src/Model/DashboardModel.php @@ -267,11 +267,46 @@ class DashboardModel extends BaseDatabaseModel { try { - $app = Factory::getApplication(); - $app->get('cache_handler', 'file'); + // Purge all file-based cache directories + $root = JPATH_ROOT; + $dirs = [ + $root . '/cache', + $root . '/administrator/cache', + ]; - // Clear site and admin caches - $cache = Factory::getContainer()->get(\Joomla\CMS\Cache\CacheControllerFactoryInterface::class); + foreach ($dirs as $dir) + { + if (!is_dir($dir)) + { + continue; + } + + $it = new \RecursiveIteratorIterator( + new \RecursiveDirectoryIterator($dir, \RecursiveDirectoryIterator::SKIP_DOTS), + \RecursiveIteratorIterator::CHILD_FIRST + ); + + foreach ($it as $file) + { + $name = $file->getFilename(); + + if ($name === 'index.html' || $name === '.htaccess') + { + continue; + } + + if ($file->isDir()) + { + @rmdir($file->getPathname()); + } + else + { + @unlink($file->getPathname()); + } + } + } + + // Also run Joomla's built-in cache GC for non-file handlers Factory::getCache('', '')->gc(); Factory::getCache('', '', 'administrator')->gc(); @@ -281,7 +316,7 @@ class DashboardModel extends BaseDatabaseModel \opcache_reset(); } - return ['success' => true, 'message' => 'Cache cleared successfully.']; + return ['success' => true, 'message' => 'All cache cleared successfully.']; } catch (\Throwable $e) { diff --git a/src/packages/mod_mokowaas_cache/language/en-GB/mod_mokowaas_cache.ini b/src/packages/mod_mokowaas_cache/language/en-GB/mod_mokowaas_cache.ini new file mode 100644 index 00000000..dd3acea8 --- /dev/null +++ b/src/packages/mod_mokowaas_cache/language/en-GB/mod_mokowaas_cache.ini @@ -0,0 +1,3 @@ +MOD_MOKOWAAS_CACHE="MokoWaaS Cache Cleaner" +MOD_MOKOWAAS_CACHE_DESC="One-click cache cleaner in the admin status bar. Clears all Joomla cache (site, admin, and expired)." +MOD_MOKOWAAS_CACHE_CLEAR_ALL="Clear All Cache" diff --git a/src/packages/mod_mokowaas_cache/language/en-GB/mod_mokowaas_cache.sys.ini b/src/packages/mod_mokowaas_cache/language/en-GB/mod_mokowaas_cache.sys.ini new file mode 100644 index 00000000..25f62d28 --- /dev/null +++ b/src/packages/mod_mokowaas_cache/language/en-GB/mod_mokowaas_cache.sys.ini @@ -0,0 +1,2 @@ +MOD_MOKOWAAS_CACHE="MokoWaaS Cache Cleaner" +MOD_MOKOWAAS_CACHE_DESC="One-click cache cleaner in the admin status bar. Clears all Joomla cache (site, admin, and expired)." diff --git a/src/packages/mod_mokowaas_cache/mod_mokowaas_cache.xml b/src/packages/mod_mokowaas_cache/mod_mokowaas_cache.xml new file mode 100644 index 00000000..f6782c0c --- /dev/null +++ b/src/packages/mod_mokowaas_cache/mod_mokowaas_cache.xml @@ -0,0 +1,24 @@ + + + mod_mokowaas_cache + Moko Consulting + 2026-06-04 + Copyright (C) 2026 Moko Consulting. All rights reserved. + GPL-3.0-or-later + hello@mokoconsulting.tech + https://mokoconsulting.tech + 02.32.46 + MOD_MOKOWAAS_CACHE_DESC + Moko\Module\MokoWaaSCache + + + services + src + tmpl + + + + en-GB/mod_mokowaas_cache.ini + en-GB/mod_mokowaas_cache.sys.ini + + diff --git a/src/packages/mod_mokowaas_cache/services/provider.php b/src/packages/mod_mokowaas_cache/services/provider.php new file mode 100644 index 00000000..cf5c25c4 --- /dev/null +++ b/src/packages/mod_mokowaas_cache/services/provider.php @@ -0,0 +1,23 @@ +registerServiceProvider(new ModuleDispatcherFactory('\\Moko\\Module\\MokoWaaSCache')); + $container->registerServiceProvider(new Module()); + } +}; diff --git a/src/packages/mod_mokowaas_cache/src/Dispatcher/Dispatcher.php b/src/packages/mod_mokowaas_cache/src/Dispatcher/Dispatcher.php new file mode 100644 index 00000000..b67aad8d --- /dev/null +++ b/src/packages/mod_mokowaas_cache/src/Dispatcher/Dispatcher.php @@ -0,0 +1,14 @@ + + +
+ +
+ + diff --git a/src/packages/mod_mokowaas_menu/tmpl/default.php b/src/packages/mod_mokowaas_menu/tmpl/default.php index d95b4df2..794f4b0d 100644 --- a/src/packages/mod_mokowaas_menu/tmpl/default.php +++ b/src/packages/mod_mokowaas_menu/tmpl/default.php @@ -2,8 +2,9 @@ /** * MokoWaaS Admin Sidebar Menu * - * Renders a dedicated MokoWaaS section in the admin sidebar, - * similar to Community Builder's mod_cbadmin. + * Collapsible sidebar section — collapsed by default, auto-expands + * when on a MokoWaaS page. Mirrors Joomla's own mm-active/mm-show + * pattern used by CB's mod_cbadmin. */ defined('_JEXEC') or die; @@ -22,35 +23,75 @@ $items = [ ['icon' => 'icon-power-off', 'title' => 'Feature Plugins', 'link' => 'index.php?option=com_plugins&filter[folder]=system&filter[search]=mokowaas'], ]; -$currentOption = \Joomla\CMS\Factory::getApplication()->getInput()->get('option', ''); -$currentView = \Joomla\CMS\Factory::getApplication()->getInput()->get('view', ''); +$app = \Joomla\CMS\Factory::getApplication(); +$currentOption = $app->getInput()->get('option', ''); +$currentView = $app->getInput()->get('view', ''); + +// Auto-expand when on a MokoWaaS page +$isMokoPage = ($currentOption === 'com_mokowaas') + || ($currentOption === 'com_plugins' && stripos($app->getInput()->get('filter', [], 'array')['search'] ?? $app->getInput()->getString('filter_search', ''), 'mokowaas') !== false); + +$collapseId = 'mokowaas-menu-collapse'; ?> -
+
+ + diff --git a/src/pkg_mokowaas.xml b/src/pkg_mokowaas.xml index dc020611..ab3b4e00 100644 --- a/src/pkg_mokowaas.xml +++ b/src/pkg_mokowaas.xml @@ -21,6 +21,7 @@ com_mokowaas.zip mod_mokowaas_cpanel.zip mod_mokowaas_menu.zip + mod_mokowaas_cache.zip plg_webservices_mokowaas.zip plg_webservices_perfectpublisher.zip plg_task_mokowaasdemo.zip @@ -30,6 +31,6 @@ - https://git.mokoconsulting.tech/MokoConsulting/MokoWaaS/raw/branch/main/updates.xml + https://git.mokoconsulting.tech/MokoConsulting/MokoWaaS/updates.xml diff --git a/src/script.php b/src/script.php index 8d659f98..5d55bf36 100644 --- a/src/script.php +++ b/src/script.php @@ -58,6 +58,9 @@ class Pkg_MokowaasInstallerScript // Set up admin sidebar menu module $this->setupAdminMenuModule(); + // Set up cache cleaner status bar module + $this->setupCacheModule(); + // Create Support portal menu item on frontend $this->setupSupportMenuItem(); @@ -773,6 +776,70 @@ class Pkg_MokowaasInstallerScript } } + /** + * Set up the cache cleaner module in the admin status bar position. + */ + private function setupCacheModule(): void + { + try + { + $db = Factory::getDbo(); + + // Enable the module extension + $db->setQuery( + $db->getQuery(true) + ->update($db->quoteName('#__extensions')) + ->set($db->quoteName('enabled') . ' = 1') + ->where($db->quoteName('type') . ' = ' . $db->quote('module')) + ->where($db->quoteName('element') . ' = ' . $db->quote('mod_mokowaas_cache')) + )->execute(); + + // Check if module instance exists + $db->setQuery( + $db->getQuery(true) + ->select('COUNT(*)') + ->from($db->quoteName('#__modules')) + ->where($db->quoteName('module') . ' = ' . $db->quote('mod_mokowaas_cache')) + ); + + if ((int) $db->loadResult() > 0) + { + return; + } + + $module = (object) [ + 'title' => 'MokoWaaS Cache Cleaner', + 'note' => '', + 'content' => '', + 'ordering' => 8, + 'position' => 'status', + 'checked_out' => null, + 'checked_out_time' => null, + 'publish_up' => null, + 'publish_down' => null, + 'published' => 1, + 'module' => 'mod_mokowaas_cache', + 'access' => 3, + 'showtitle' => 0, + 'params' => '{}', + 'client_id' => 1, + 'language' => '*', + ]; + + $db->insertObject('#__modules', $module, 'id'); + + if ((int) $module->id) + { + $mm = (object) ['moduleid' => (int) $module->id, 'menuid' => 0]; + $db->insertObject('#__modules_menu', $mm, 'moduleid'); + } + } + catch (\Throwable $e) + { + Log::add('Cache module setup error: ' . $e->getMessage(), Log::WARNING, 'mokowaas'); + } + } + /** * Create a "Support" menu item on the frontend main menu. */