feat(amm): module filtering via onPrepareModuleList + conditions engine
Platform: moko-platform CI / Gate 2: Unit Tests (8.1) (push) Blocked by required conditions
Platform: moko-platform CI / Gate 2: Unit Tests (8.2) (push) Blocked by required conditions
Platform: moko-platform CI / Gate 2: Unit Tests (8.3) (push) Blocked by required conditions
Generic: Project CI / Tests (pull_request) Blocked by required conditions
Platform: moko-platform CI / Gate 3: Self-Health Check (push) Blocked by required conditions
Platform: moko-platform CI / Gate 4: Governance (push) Blocked by required conditions
Platform: moko-platform CI / Gate 5: Template Integrity (push) Blocked by required conditions
Platform: moko-platform CI / CI Summary (push) Blocked by required conditions
Joomla: Extension CI / Tests (PHP 8.2) (pull_request) Blocked by required conditions
Joomla: Extension CI / Tests (PHP 8.3) (pull_request) Blocked by required conditions
Joomla: Extension CI / PHPStan Analysis (pull_request) Blocked by required conditions
Joomla: Extension CI / Build RC Pre-Release (pull_request) Blocked by required conditions
Platform: moko-platform CI / Gate 2: Unit Tests (8.1) (pull_request) Blocked by required conditions
Platform: moko-platform CI / Gate 2: Unit Tests (8.2) (pull_request) Blocked by required conditions
Platform: moko-platform CI / Gate 2: Unit Tests (8.3) (pull_request) Blocked by required conditions
Platform: moko-platform CI / Gate 3: Self-Health Check (pull_request) Blocked by required conditions
Platform: moko-platform CI / Gate 4: Governance (pull_request) Blocked by required conditions
Platform: moko-platform CI / Gate 5: Template Integrity (pull_request) Blocked by required conditions
Platform: moko-platform CI / CI Summary (pull_request) Blocked by required conditions
Universal: PR Check / Build RC Package (pull_request) Blocked by required conditions
Universal: PR Check / Report Issues (pull_request) Blocked by required conditions
Generic: Repo Health / Scripts governance (pull_request) Blocked by required conditions
Generic: Repo Health / Repository health (pull_request) Blocked by required conditions
Generic: Repo Health / Report Issues (pull_request) Blocked by required conditions
Joomla: Extension CI / Lint & Validate (pull_request) Failing after 5s
Joomla: Extension CI / Release Readiness Check (pull_request) Failing after 5s
Generic: Project CI / Lint & Validate (pull_request) Successful in 16s
Universal: PR Check / Branch Policy (pull_request) Successful in 3s
Universal: Secret Scanning / Gitleaks Secret Scan (pull_request) Successful in 15s
Universal: PR Check / Validate PR (pull_request) Failing after 9s
Generic: Repo Health / Access control (pull_request) Successful in 3s
Generic: Repo Health / Site Health (pull_request) Has been skipped
Universal: Auto Version Bump / Version Bump (push) Successful in 25s
Platform: moko-platform CI / Gate 1: Code Quality (push) Failing after 1m0s
Platform: moko-platform CI / Gate 1: Code Quality (pull_request) Failing after 54s
Universal: Pre-Release / Build Pre-Release (${{ inputs.stability || github.ref_name }}) (push) Successful in 27s
Joomla: Metadata Validation / Validate Joomla Metadata (pull_request) Successful in 1m5s

Frontend modules filtered based on condition sets mapped via
ConditionsHelper::shouldDisplay('com_modules', moduleId).
Modules with no conditions pass through. Graceful skip if tables
don't exist. Implements #160.
This commit is contained in:
Jonathan Miller
2026-06-23 12:33:27 -05:00
parent 5b1fe5f806
commit 36bfe59115
@@ -2904,4 +2904,68 @@ class MokoSuiteClient extends CMSPlugin implements BootableExtensionInterface
Log::add('Cache auto-clear failed: ' . $e->getMessage(), Log::WARNING, 'mokosuiteclient');
}
}
// ------------------------------------------------------------------
// Advanced Module Manager — Conditions-based filtering (#160)
// ------------------------------------------------------------------
/**
* Filter the site module list based on ConditionsHelper rules.
*
* Modules that have no condition mappings pass through unchanged.
* Modules with condition sets are evaluated; only those whose
* conditions are satisfied for the current request are kept.
*
* @param array|null &$modules The list of module objects Joomla will render.
*
* @return void
*
* @since 02.47.52
*/
public function onPrepareModuleList(?array &$modules): void
{
if ($modules === null || !$this->getApplication()->isClient('site'))
{
return;
}
// Only filter if the conditions map table exists
try
{
$db = Factory::getContainer()->get(\Joomla\Database\DatabaseInterface::class);
$tables = $db->getTableList();
$prefix = $db->getPrefix();
if (!\in_array($prefix . 'mokosuiteclient_conditions_map', $tables, true))
{
return;
}
}
catch (\Throwable $e)
{
return;
}
$filtered = [];
foreach ($modules as $module)
{
$moduleId = (int) ($module->id ?? 0);
if ($moduleId <= 0)
{
$filtered[] = $module;
continue;
}
// ConditionsHelper::shouldDisplay returns true when no conditions
// are mapped (module shows everywhere) or when conditions pass.
if (\Moko\Component\MokoSuiteClient\Administrator\Helper\ConditionsHelper::shouldDisplay('com_modules', $moduleId))
{
$filtered[] = $module;
}
}
$modules = $filtered;
}
}