From b26c19fedb402a4d4c71e37b6835655e102b9abf Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 22 Jan 2026 16:05:05 +0000 Subject: [PATCH] Update error.php to match index.php structure and functionality Co-authored-by: jmiller-moko <230051081+jmiller-moko@users.noreply.github.com> --- src/templates/error.php | 338 +++++++++++++++++++++++++++++++++------- 1 file changed, 281 insertions(+), 57 deletions(-) diff --git a/src/templates/error.php b/src/templates/error.php index 9610ede..0c241e6 100644 --- a/src/templates/error.php +++ b/src/templates/error.php @@ -26,72 +26,156 @@ $app = Factory::getApplication(); $params = $this->params; $wa = $this->getWebAssetManager(); +// Template params +$params_LightColorName = (string) $params->get('colorLightName', 'colors_standard'); // colors_standard|colors_alternative|colors_custom + +$params_DarkColorName = (string) $params->get('colorDarkName', 'colors_standard'); // colors_standard|colors_alternative|colors_custom + +$params_googletagmanager = $params->get('googletagmanager', false); +$params_googletagmanagerid = $params->get('googletagmanagerid', null); +$params_googleanalytics = $params->get('googleanalytics', false); +$params_googleanalyticsid = $params->get('googleanalyticsid', null); +$params_custom_head_start = $params->get('custom_head_start', null); +$params_custom_head_end = $params->get('custom_head_end', null); +$params_developmentmode = $params->get('developmentmode', false); + +// Bootstrap behaviors (assets handled via WAM) +HTMLHelper::_('bootstrap.framework'); +HTMLHelper::_('bootstrap.loadCss', true); +HTMLHelper::_('bootstrap.alert'); +HTMLHelper::_('bootstrap.button'); +HTMLHelper::_('bootstrap.carousel'); +HTMLHelper::_('bootstrap.collapse'); +HTMLHelper::_('bootstrap.dropdown'); +HTMLHelper::_('bootstrap.modal'); +HTMLHelper::_('bootstrap.offcanvas'); +HTMLHelper::_('bootstrap.popover'); +HTMLHelper::_('bootstrap.scrollspy'); +HTMLHelper::_('bootstrap.tab'); +HTMLHelper::_('bootstrap.tooltip'); +HTMLHelper::_('bootstrap.toast'); + // ------------------ Params ------------------ -$colorLight = (string) $params->get('colorLightName', 'colors_standard'); -$colorDark = (string) $params->get('colorDarkName', 'colors_standard'); -$themeFab = (int) $params->get('theme_fab_enabled', 1); -$fABodyPos = (string) $params->get('theme_fab_pos', 'br'); -$gtmEnabled = (int) $params->get('googletagmanager', 0); -$gtmId = (string) $params->get('googletagmanagerid', ''); -$fa6KitCode = (string) $params->get('fA6KitCode', ''); $stickyHeader = (bool) $params->get('stickyHeader', 0); $brandEnabled = (int) $params->get('brand', 1); $siteDescription = (string) $params->get('siteDescription', ''); // Drawer icon params (escaped) -$params_leftIcon = htmlspecialchars($params->get('drawerLeftIcon', 'fa-solid fa-chevron-right'), ENT_QUOTES, 'UTF-8'); -$params_rightIcon = htmlspecialchars($params->get('drawerRightIcon', 'fa-solid fa-chevron-left'), ENT_QUOTES, 'UTF-8'); +$params_leftIcon = htmlspecialchars($params->get('drawerLeftIcon', 'fa-solid fa-chevron-left'), ENT_QUOTES, 'UTF-8'); +$params_rightIcon = htmlspecialchars($params->get('drawerRightIcon', 'fa-solid fa-chevron-right'), ENT_QUOTES, 'UTF-8'); -// ------------------ Styles ------------------ -$wa->useStyle('template.base'); -$wa->useStyle('template.user'); +// Template/Media path +$templatePath = 'media/templates/site/moko-cassiopeia'; -// Light/Dark variable sheets (load before consumers) -if ($wa->assetExists('style', 'template.light.' . $colorLight)) { - $wa->useStyle('template.light.' . $colorLight); +// =========================== +// Web Asset Manager (WAM) — matches your joomla.asset.json +// =========================== + +// Core template CSS +$wa->useStyle('template.global.base'); // css/template.css +$wa->useStyle('template.global.social-media-demo'); // css/user.css + +// Optional vendor CSS +$wa->useStyle('vendor.bootstrap-toc'); + +// Color theme (light + optional dark) +$colorLightKey = strtolower(preg_replace('/[^a-z0-9_.-]/i', '', $params_LightColorName)); +$colorDarkKey = strtolower(preg_replace('/[^a-z0-9_.-]/i', '', $params_DarkColorName)); +$lightKey = 'template.light.' . $colorLightKey; +$darkKey = 'template.dark.' . $colorDarkKey; +try { + $wa->useStyle('template.light.colors_standard'); +} catch (\Throwable $e) { + $wa->registerAndUseStyle('template.light.colors_standard', $templatePath . '/css/global/light/colors_standard.css'); } -if ($wa->assetExists('style', 'template.dark.' . $colorDark)) { - $wa->useStyle('template.dark.' . $colorDark); +try { + $wa->useStyle('template.dark.colors_standard'); +} catch (\Throwable $e) { + $wa->registerAndUseStyle('template.dark.colors_standard', $templatePath . '/css/global/dark/colors_standard.css'); +} +try { + $wa->useStyle($lightKey); +} catch (\Throwable $e) { + $wa->registerAndUseStyle('template.light.dynamic', $templatePath . '/css/global/light/' . $colorLightKey . '.css'); +} +try { + $wa->useStyle($darkKey); +} catch (\Throwable $e) { + $wa->registerAndUseStyle('template.dark.dynamic', $templatePath . '/css/global/dark/' . $colorDarkKey . '.css'); } -// ------------------ Scripts ------------------ +// Scripts +$wa->useScript('template.js'); $wa->useScript('theme-init.js'); -if ($themeFab === 1) { - $wa->useScript('darkmode-toggle.js'); -} -if ($gtmEnabled === 1) { - $wa->useScript('gtm.js'); +$wa->useScript('darkmode-toggle.js'); +$wa->useScript('vendor.bootstrap-toc.js'); + +// Meta +$this->setMetaData('viewport', 'width=device-width, initial-scale=1'); + +if ($this->params->get('faKitCode')) { + $faKit = "https://kit.fontawesome.com/" . $this->params->get('faKitCode') . ".js"; + HTMLHelper::_('script', $faKit, ['crossorigin' => 'anonymous']); +} else { + try { + if($params_developmentmode){ + $wa->useStyle('vendor.fa7free.all'); + $wa->useStyle('vendor.fa7free.brands'); + $wa->useStyle('vendor.fa7free.fontawesome'); + $wa->useStyle('vendor.fa7free.regular'); + $wa->useStyle('vendor.fa7free.solid'); + } else { + $wa->useStyle('vendor.fa7free.all.min'); + $wa->useStyle('vendor.fa7free.brands.min'); + $wa->useStyle('vendor.fa7free.fontawesome.min'); + $wa->useStyle('vendor.fa7free.regular.min'); + $wa->useStyle('vendor.fa7free.solid.min'); + } + } catch (\Throwable $e) { + if($params_developmentmode){ + $wa->registerAndUseStyle('vendor.fa7free.all.dynamic', $templatePath . '/vendor/fa7free/css/all.css'); + $wa->registerAndUseStyle('vendor.fa7free.brands.dynamic', $templatePath . '/vendor/fa7free/css/brands.css'); + $wa->registerAndUseStyle('vendor.fa7free.fontawesome.dynamic', $templatePath . '/vendor/fa7free/css/fontawesome.css'); + $wa->registerAndUseStyle('vendor.fa7free.regular.dynamic', $templatePath . '/vendor/fa7free/css/regular.css'); + $wa->registerAndUseStyle('vendor.fa7free.solid.dynamic', $templatePath . '/vendor/fa7free/css/solid.css'); + } else { + $wa->registerAndUseStyle('vendor.fa7free.all.min.dynamic', $templatePath . '/vendor/fa7free/css/all.min.css'); + $wa->registerAndUseStyle('vendor.fa7free.brands.min.dynamic', $templatePath . '/vendor/fa7free/css/brands.min.css'); + $wa->registerAndUseStyle('vendor.fa7free.fontawesome.min.dynamic', $templatePath . '/vendor/fa7free/css/fontawesome.min.css'); + $wa->registerAndUseStyle('vendor.fa7free.regular.min.dynamic', $templatePath . '/vendor/fa7free/css/regular.min.css'); + $wa->registerAndUseStyle('vendor.fa7free.solid.min.dynamic', $templatePath . '/vendor/fa7free/css/solid.min.css'); + } + + } } -// Optional Font Awesome 6 Kit (preferred) or FA5 fallback -if (!empty($fa6KitCode)) { - HTMLHelper::_('script', 'https://kit.fontawesome.com/' . rawurlencode($fa6KitCode) . '.js', [ - 'crossorigin' => 'anonymous' - ]); -} else { - HTMLHelper::_('stylesheet', 'https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css', ['version' => 'auto'], [ - 'crossorigin' => 'anonymous', - 'referrerpolicy' => 'no-referrer', - ]); -} +$wa->useStyle('template.user'); // css/user.css // ------------------ Context (logo, bootstrap needs) ------------------ $sitename = htmlspecialchars($app->get('sitename'), ENT_QUOTES, 'UTF-8'); -// Build logo/title -if ($params->get('logoFile')) { - $logo = HTMLHelper::_( +// ------------------------------------- +// Brand: logo from params OR siteTitle +// ------------------------------------- +$brandHtml = ''; +$logoFile = (string) $this->params->get('logoFile'); + +if ($logoFile !== '') { + $brandHtml = HTMLHelper::_( 'image', - Uri::root(false) . htmlspecialchars($params->get('logoFile'), ENT_QUOTES), + Uri::root(false) . htmlspecialchars($logoFile, ENT_QUOTES, 'UTF-8'), $sitename, - ['loading' => 'eager', 'decoding' => 'async'], + ['class' => 'logo d-inline-block', 'loading' => 'eager', 'decoding' => 'async'], false, 0 ); -} elseif ($params->get('siteTitle')) { - $logo = '' . htmlspecialchars($params->get('siteTitle'), ENT_COMPAT, 'UTF-8') . ''; +} elseif ($this->params->get('siteTitle')) { + $brandHtml = '' + . htmlspecialchars($this->params->get('siteTitle'), ENT_COMPAT, 'UTF-8') + . ''; } else { - $logo = HTMLHelper::_('image', 'full_logo.png', $sitename, ['class' => 'logo d-inline-block', 'loading' => 'eager', 'decoding' => 'async'], true, 0); + // Fallback to a bundled image (relative to media paths) + $brandHtml = HTMLHelper::_('image', 'full_logo.png', $sitename, ['class' => 'logo d-inline-block', 'loading' => 'eager', 'decoding' => 'async'], true, 0); } // ------------------ Error details ------------------ @@ -103,23 +187,107 @@ $debugOn = defined('JDEBUG') && JDEBUG;
- - - +