diff --git a/src/packages/mod_mokojoomhero/language/en-GB/mod_mokojoomhero.ini b/src/packages/mod_mokojoomhero/language/en-GB/mod_mokojoomhero.ini index e3e1f6b..204e7fc 100644 --- a/src/packages/mod_mokojoomhero/language/en-GB/mod_mokojoomhero.ini +++ b/src/packages/mod_mokojoomhero/language/en-GB/mod_mokojoomhero.ini @@ -90,6 +90,25 @@ MOD_MOKOJOOMHERO_PARALLAX_DESC="Background moves at a slower rate than page cont MOD_MOKOJOOMHERO_PARALLAX_SPEED_LABEL="Parallax Speed" MOD_MOKOJOOMHERO_PARALLAX_SPEED_DESC="How much the background moves relative to scroll (0.1 = subtle, 0.9 = dramatic)." +; A/B testing +MOD_MOKOJOOMHERO_FIELDSET_AB="A/B Testing" +MOD_MOKOJOOMHERO_AB_ENABLED_LABEL="Enable A/B Testing" +MOD_MOKOJOOMHERO_AB_ENABLED_DESC="Randomly show different content variations to visitors. Assignment is sticky per session." +MOD_MOKOJOOMHERO_AB_VARIATIONS_LABEL="Variations" +MOD_MOKOJOOMHERO_AB_VARIATIONS_DESC="Define content variations with relative weights. Higher weight = higher chance of being shown." +MOD_MOKOJOOMHERO_AB_VAR_LABEL="Label" +MOD_MOKOJOOMHERO_AB_VAR_CONTENT="Content" +MOD_MOKOJOOMHERO_AB_VAR_WEIGHT="Weight" + +; Scheduling +MOD_MOKOJOOMHERO_FIELDSET_SCHEDULING="Scheduling" +MOD_MOKOJOOMHERO_SCHEDULE_ENABLED_LABEL="Enable Scheduling" +MOD_MOKOJOOMHERO_SCHEDULE_ENABLED_DESC="Only display the hero during a specific date/time range. Uses the site timezone." +MOD_MOKOJOOMHERO_SCHEDULE_START_LABEL="Start Date/Time" +MOD_MOKOJOOMHERO_SCHEDULE_START_DESC="The hero will not display before this date and time. Leave empty for no start restriction." +MOD_MOKOJOOMHERO_SCHEDULE_END_LABEL="End Date/Time" +MOD_MOKOJOOMHERO_SCHEDULE_END_DESC="The hero will not display after this date and time. Leave empty for no end restriction." + ; Video poster MOD_MOKOJOOMHERO_VIDEO_POSTER_LABEL="Video Poster Image" MOD_MOKOJOOMHERO_VIDEO_POSTER_DESC="Fallback image displayed while the video loads. Prevents a blank hero on slow connections." diff --git a/src/packages/mod_mokojoomhero/language/en-GB/mod_mokojoomhero.sys.ini b/src/packages/mod_mokojoomhero/language/en-GB/mod_mokojoomhero.sys.ini index 9b25b22..e1eb746 100644 --- a/src/packages/mod_mokojoomhero/language/en-GB/mod_mokojoomhero.sys.ini +++ b/src/packages/mod_mokojoomhero/language/en-GB/mod_mokojoomhero.sys.ini @@ -91,6 +91,25 @@ MOD_MOKOJOOMHERO_PARALLAX_DESC="Background moves at a slower rate than page cont MOD_MOKOJOOMHERO_PARALLAX_SPEED_LABEL="Parallax Speed" MOD_MOKOJOOMHERO_PARALLAX_SPEED_DESC="How much the background moves relative to scroll (0.1 = subtle, 0.9 = dramatic)." +; A/B testing +MOD_MOKOJOOMHERO_FIELDSET_AB="A/B Testing" +MOD_MOKOJOOMHERO_AB_ENABLED_LABEL="Enable A/B Testing" +MOD_MOKOJOOMHERO_AB_ENABLED_DESC="Randomly show different content variations to visitors." +MOD_MOKOJOOMHERO_AB_VARIATIONS_LABEL="Variations" +MOD_MOKOJOOMHERO_AB_VARIATIONS_DESC="Define content variations with relative weights." +MOD_MOKOJOOMHERO_AB_VAR_LABEL="Label" +MOD_MOKOJOOMHERO_AB_VAR_CONTENT="Content" +MOD_MOKOJOOMHERO_AB_VAR_WEIGHT="Weight" + +; Scheduling +MOD_MOKOJOOMHERO_FIELDSET_SCHEDULING="Scheduling" +MOD_MOKOJOOMHERO_SCHEDULE_ENABLED_LABEL="Enable Scheduling" +MOD_MOKOJOOMHERO_SCHEDULE_ENABLED_DESC="Only display the hero during a specific date/time range." +MOD_MOKOJOOMHERO_SCHEDULE_START_LABEL="Start Date/Time" +MOD_MOKOJOOMHERO_SCHEDULE_START_DESC="The hero will not display before this date and time." +MOD_MOKOJOOMHERO_SCHEDULE_END_LABEL="End Date/Time" +MOD_MOKOJOOMHERO_SCHEDULE_END_DESC="The hero will not display after this date and time." + ; Video poster MOD_MOKOJOOMHERO_VIDEO_POSTER_LABEL="Video Poster Image" MOD_MOKOJOOMHERO_VIDEO_POSTER_DESC="Fallback image displayed while the video loads." diff --git a/src/packages/mod_mokojoomhero/language/en-US/mod_mokojoomhero.ini b/src/packages/mod_mokojoomhero/language/en-US/mod_mokojoomhero.ini index e941b99..1d4a62e 100644 --- a/src/packages/mod_mokojoomhero/language/en-US/mod_mokojoomhero.ini +++ b/src/packages/mod_mokojoomhero/language/en-US/mod_mokojoomhero.ini @@ -107,6 +107,25 @@ MOD_MOKOJOOMHERO_PARALLAX_DESC="Background moves at a slower rate than page cont MOD_MOKOJOOMHERO_PARALLAX_SPEED_LABEL="Parallax Speed" MOD_MOKOJOOMHERO_PARALLAX_SPEED_DESC="How much the background moves relative to scroll (0.1 = subtle, 0.9 = dramatic)." +; A/B testing +MOD_MOKOJOOMHERO_FIELDSET_AB="A/B Testing" +MOD_MOKOJOOMHERO_AB_ENABLED_LABEL="Enable A/B Testing" +MOD_MOKOJOOMHERO_AB_ENABLED_DESC="Randomly show different content variations to visitors. Assignment is sticky per session." +MOD_MOKOJOOMHERO_AB_VARIATIONS_LABEL="Variations" +MOD_MOKOJOOMHERO_AB_VARIATIONS_DESC="Define content variations with relative weights. Higher weight = higher chance of being shown." +MOD_MOKOJOOMHERO_AB_VAR_LABEL="Label" +MOD_MOKOJOOMHERO_AB_VAR_CONTENT="Content" +MOD_MOKOJOOMHERO_AB_VAR_WEIGHT="Weight" + +; Scheduling +MOD_MOKOJOOMHERO_FIELDSET_SCHEDULING="Scheduling" +MOD_MOKOJOOMHERO_SCHEDULE_ENABLED_LABEL="Enable Scheduling" +MOD_MOKOJOOMHERO_SCHEDULE_ENABLED_DESC="Only display the hero during a specific date/time range. Uses the site timezone." +MOD_MOKOJOOMHERO_SCHEDULE_START_LABEL="Start Date/Time" +MOD_MOKOJOOMHERO_SCHEDULE_START_DESC="The hero will not display before this date and time. Leave empty for no start restriction." +MOD_MOKOJOOMHERO_SCHEDULE_END_LABEL="End Date/Time" +MOD_MOKOJOOMHERO_SCHEDULE_END_DESC="The hero will not display after this date and time. Leave empty for no end restriction." + ; Video poster MOD_MOKOJOOMHERO_VIDEO_POSTER_LABEL="Video Poster Image" MOD_MOKOJOOMHERO_VIDEO_POSTER_DESC="Fallback image displayed while the video loads. Prevents a blank hero on slow connections." diff --git a/src/packages/mod_mokojoomhero/language/en-US/mod_mokojoomhero.sys.ini b/src/packages/mod_mokojoomhero/language/en-US/mod_mokojoomhero.sys.ini index 188e3c8..d8737a3 100644 --- a/src/packages/mod_mokojoomhero/language/en-US/mod_mokojoomhero.sys.ini +++ b/src/packages/mod_mokojoomhero/language/en-US/mod_mokojoomhero.sys.ini @@ -91,6 +91,25 @@ MOD_MOKOJOOMHERO_PARALLAX_DESC="Background moves at a slower rate than page cont MOD_MOKOJOOMHERO_PARALLAX_SPEED_LABEL="Parallax Speed" MOD_MOKOJOOMHERO_PARALLAX_SPEED_DESC="How much the background moves relative to scroll (0.1 = subtle, 0.9 = dramatic)." +; A/B testing +MOD_MOKOJOOMHERO_FIELDSET_AB="A/B Testing" +MOD_MOKOJOOMHERO_AB_ENABLED_LABEL="Enable A/B Testing" +MOD_MOKOJOOMHERO_AB_ENABLED_DESC="Randomly show different content variations to visitors." +MOD_MOKOJOOMHERO_AB_VARIATIONS_LABEL="Variations" +MOD_MOKOJOOMHERO_AB_VARIATIONS_DESC="Define content variations with relative weights." +MOD_MOKOJOOMHERO_AB_VAR_LABEL="Label" +MOD_MOKOJOOMHERO_AB_VAR_CONTENT="Content" +MOD_MOKOJOOMHERO_AB_VAR_WEIGHT="Weight" + +; Scheduling +MOD_MOKOJOOMHERO_FIELDSET_SCHEDULING="Scheduling" +MOD_MOKOJOOMHERO_SCHEDULE_ENABLED_LABEL="Enable Scheduling" +MOD_MOKOJOOMHERO_SCHEDULE_ENABLED_DESC="Only display the hero during a specific date/time range." +MOD_MOKOJOOMHERO_SCHEDULE_START_LABEL="Start Date/Time" +MOD_MOKOJOOMHERO_SCHEDULE_START_DESC="The hero will not display before this date and time." +MOD_MOKOJOOMHERO_SCHEDULE_END_LABEL="End Date/Time" +MOD_MOKOJOOMHERO_SCHEDULE_END_DESC="The hero will not display after this date and time." + ; Video poster MOD_MOKOJOOMHERO_VIDEO_POSTER_LABEL="Video Poster Image" MOD_MOKOJOOMHERO_VIDEO_POSTER_DESC="Fallback image displayed while the video loads." diff --git a/src/packages/mod_mokojoomhero/mod_mokojoomhero.php b/src/packages/mod_mokojoomhero/mod_mokojoomhero.php index 075841b..8cab268 100644 --- a/src/packages/mod_mokojoomhero/mod_mokojoomhero.php +++ b/src/packages/mod_mokojoomhero/mod_mokojoomhero.php @@ -23,6 +23,73 @@ $wa = $app->getDocument()->getWebAssetManager(); $wa->getRegistry()->addExtensionRegistryFile('mod_mokojoomhero'); $wa->usePreset('mod_mokojoomhero'); +// Schedule check — skip rendering if outside the configured date range +$scheduleEnabled = (bool) $params->get('scheduleEnabled', 0); + +if ($scheduleEnabled) { + $now = new \DateTime('now', new \DateTimeZone($app->get('offset', 'UTC'))); + $scheduleStart = $params->get('scheduleStart', ''); + $scheduleEnd = $params->get('scheduleEnd', ''); + + if ($scheduleStart) { + $start = new \DateTime($scheduleStart, new \DateTimeZone($app->get('offset', 'UTC'))); + + if ($now < $start) { + return; + } + } + + if ($scheduleEnd) { + $end = new \DateTime($scheduleEnd, new \DateTimeZone($app->get('offset', 'UTC'))); + + if ($now > $end) { + return; + } + } +} + +// A/B testing — weighted random variation, session-sticky per module instance +$abEnabled = (bool) $params->get('abEnabled', 0); +$abVariationContent = ''; + +if ($abEnabled) { + $abVariations = $params->get('abVariations', ''); + $abData = is_string($abVariations) ? json_decode($abVariations, true) : (array) $abVariations; + + if (is_array($abData) && count($abData) > 0) { + $session = \Joomla\CMS\Factory::getSession(); + $sessionKey = 'mokojoomhero.ab.' . $module->id; + $picked = $session->get($sessionKey, null); + + if ($picked === null || !isset($abData[$picked])) { + // Weighted random selection + $totalWeight = 0; + + foreach ($abData as $v) { + $totalWeight += (int) (((array) $v)['weight'] ?? 50); + } + + $rand = mt_rand(1, max($totalWeight, 1)); + $cumulative = 0; + $picked = 0; + + foreach ($abData as $i => $v) { + $cumulative += (int) (((array) $v)['weight'] ?? 50); + + if ($rand <= $cumulative) { + $picked = $i; + break; + } + } + + $session->set($sessionKey, $picked); + } + + $variation = (array) ($abData[$picked] ?? []); + $abVariationContent = $variation['content'] ?? ''; + } +} + // Module parameters $heroMode = $params->get('heroMode', 'images'); $imageFolder = $params->get('imageFolder', 'images/heroes'); @@ -118,6 +185,11 @@ if (!in_array($contentAnimation, $allowedContentAnimations, true)) { $parallaxSpeed = max(0.1, min(0.9, $parallaxSpeed)); $gradientAngle = max(0, min(360, $gradientAngle)); +// Apply A/B variation content if active +if ($abEnabled && $abVariationContent) { + $heroContent = $abVariationContent; +} + // Collect hero images $heroImages = []; diff --git a/src/packages/mod_mokojoomhero/mod_mokojoomhero.xml b/src/packages/mod_mokojoomhero/mod_mokojoomhero.xml index adc5c07..d022784 100644 --- a/src/packages/mod_mokojoomhero/mod_mokojoomhero.xml +++ b/src/packages/mod_mokojoomhero/mod_mokojoomhero.xml @@ -274,6 +274,89 @@ +
+ + + + + +
+ + + + + +
+
+ + + + + + +
diff --git a/src/pkg_mokojoomhero.xml b/src/pkg_mokojoomhero.xml index a95d66b..5996f8d 100644 --- a/src/pkg_mokojoomhero.xml +++ b/src/pkg_mokojoomhero.xml @@ -25,6 +25,6 @@ - https://git.mokoconsulting.tech/MokoConsulting/MokoJoomHero/raw/branch/main/updates.xml + https://git.mokoconsulting.tech/MokoConsulting/MokoJoomHero/updates.xml diff --git a/updates.xml b/updates.xml index 17001d0..80cd2ac 100644 --- a/updates.xml +++ b/updates.xml @@ -1,7 +1,7 @@ @@ -104,13 +104,13 @@ pkg_mokojoomhero package site - 01.08.00 + 01.09.00 2026-06-04 https://git.mokoconsulting.tech/MokoConsulting/MokoJoomHero/releases/tag/stable - https://git.mokoconsulting.tech/MokoConsulting/MokoJoomHero/releases/download/stable/pkg_mokojoomhero-01.08.00.zip + https://git.mokoconsulting.tech/MokoConsulting/MokoJoomHero/releases/download/stable/pkg_mokojoomhero-01.09.00.zip - 111fef438f7c30a74019124134ed461e2b92f9db992c45eef7d5f63091a5e0d7 + fd8235cee1a6f08a7821ccae95776f2f57e32ccaad5efe64ef8b377dd7ec47df stable https://git.mokoconsulting.tech/MokoConsulting/MokoJoomHero/raw/branch/main/CHANGELOG.md Moko Consulting