PS PrestaShop Beginner

Scheduled Seasonal Decorations — Documentation

Install and configure Scheduled Seasonal Decorations: create a campaign, schedule dates, enable effects, banner and palette, preview safely, manage yearly recurrence and multistore.

Updated Module version 1.1.0

Scheduled Seasonal Decorations (the dfthemescheduler module) automatically dresses up your PrestaShop store for every commercial highlight. You create dated campaigns — Christmas, Black Friday, sales, Valentine’s Day — combining a top bar, banner, color palette, visual effects and a homepage block. Each campaign switches on and off on its own at the scheduled dates, with no cron job.

Overview

The module is built on a simple idea: a campaign is a set of visual elements tied to a date range. When the current date falls within that range, the campaign becomes “live” and its makeover applies to the storefront. Outside that range, the store returns to its normal appearance without a trace.

Only one campaign is displayed at a time. When several campaigns overlap, the one with the highest priority wins. This lets you layer a long Christmas campaign with a higher-priority Black Friday peak in the middle.

Each campaign can combine any of the following: a top bar with a message and countdown, a per-language banner image, a seven-color palette, an ambient effect (snow, confetti, hearts, leaves, stars, fireworks), an HTML block on the homepage and custom CSS. Every element is optional.

Installation

Install the module like any PrestaShop module:

  1. In the back office, go to Modules > Module Manager.
  2. Click Upload a module and select the dfthemescheduler.zip file.
  3. Once installed, click Configure to open the campaign planner.

The module creates its tables, registers its display hooks and adds an admin tab reachable through the Configure button. No external dependency is required: no Composer, no jQuery, no third-party service.

If you are already on version 1.0.0, simply replace the module folder with 1.1.0: the upgrade script automatically adds the banner position column and registers the new hooks. No reinstall is needed.

Creating a campaign

From the configuration screen, click Add a campaign. The form is organized from the most important to the most optional settings.

General information

  • Campaign name: internal label, such as “Christmas 2026” or “Black Friday”. It is never shown to visitors.
  • Enabled: master switch. A disabled campaign is never displayed, even inside its date range.
  • Priority: an integer. On overlap, the highest priority wins. Leave it at 0 if you only run one campaign at a time.

Dates

The Start date and End date fields use a native date-and-time picker, accurate to the second. Dates are interpreted in your store’s server time.

If your browser shows a text field instead of the picker, the expected format is YYYY-MM-DD HH:MM:SS, for example 2026-11-27 00:00:00.

Yearly recurrence

Tick Repeat every year so a campaign comes back automatically on the same dates, year after year. Only the month, day and time are compared: the year is ignored.

The module natively handles campaigns crossing New Year. A December 20 to January 6 campaign works perfectly and reactivates every winter, without having to duplicate it.

For a recurring campaign, the “end date after start date” validation is intentionally disabled, since the end may fall in the following calendar year.

Top bar

The Top bar message field (multilingual) displays a bar at the top of every page. It accepts basic HTML: links, bold. Leave it empty to hide the bar.

Enable Show countdown to add a real-time count to the campaign’s end date, formatted as “12d 04:31:07”. For a recurring campaign, the countdown automatically targets the next occurrence of the end date.

The bar colors (background and text) are set in the Palette section.

You can upload a different banner per language, with a clickable link and alt text. Accepted formats are jpg, png, gif and webp. A generous width is recommended (for example 1920 × 300).

The Banner position field determines the theme area where the image appears:

  • Top strip — displayBanner: default position, at the top of the page.
  • Below the header, full width — displayNavFullWidth: just under the main menu.
  • Above the content — displayWrapperTop: above the page body.

If your banner does not show up, your theme most likely does not implement the chosen hook. Simply try another position from the list.

Color palette

A campaign exposes seven colors: primary, secondary, links, header background, footer background, top bar background and top bar text.

These seven values are always exposed as CSS variables (--dfts-primary, --dfts-secondary, etc.) that your theme or custom CSS can reuse.

Enable Apply palette to theme to let the module apply these colors to buttons, links, header and footer itself. Leave the option off if you prefer to drive the makeover only through the CSS variables and your own stylesheet.

Visual effects

The Visual effect field offers six pure-JavaScript animations drawn on a full-screen canvas: snow, confetti, hearts, autumn leaves, twinkling stars and fireworks. Choose None to disable the effect.

The Intensity (low, medium, high) sets the particle density. The particle count is capped to preserve performance.

Effects load only while a campaign is active. They automatically switch off for visitors who enabled the “reduced motion” preference in their system, and pause when the tab is not visible.

Homepage block and custom CSS

The Homepage block field (multilingual, visual editor) displays free HTML content on the homepage for the whole duration of the campaign — ideal for an offer, an enriched promotional banner or a seasonal message.

The Custom CSS field lets you go further. The CSS is sanitized before injection (attempts to escape the style container are neutralized) and is loaded only while the campaign is active. You may use the --dfts-* variables there.

Secure preview

Each campaign has a preview link protected by a unique 32-character token. From the campaign list, click the Preview button: the store opens with the campaign’s makeover applied, exactly as your visitors will see it on launch day.

The preview persists while you browse: you can navigate every page of the store. A fixed bar “Preview: {name} — Exit” appears at the bottom left; click Exit to return to the normal display.

The preview is completely invisible to your visitors: it only activates through the secret link carrying the correct token. You can check your Christmas look in the middle of August, or share the link with a client for sign-off, without changing anything for the public.

Year planner

At the top of the campaign list, the back office shows a summary dashboard: number of campaigns, active campaigns, the currently “live” campaign, and the next campaign to start with the number of days remaining.

Below it, a twelve-month timeline represents each campaign as a colored bar positioned by its dates. A vertical marker shows the current day, recurring campaigns crossing New Year are shown as two segments, and every bar is clickable to open the campaign for editing.

Duplicate, export, import

From the list, the Duplicate action creates a copy of the campaign with a new preview token, disabled by default, whose banner images are physically copied — deleting one never affects the other. Shop associations are preserved.

The Export JSON button (in the toolbar) downloads all your campaigns into a file. The Import JSON form on the dashboard lets you re-inject that file on another store. Imported campaigns arrive disabled by default; banner images are not included in the export.

Multistore and multilingual

In a multistore context, each campaign is associated with the shops of your choice through the Shop association section of the form. A campaign is only displayed on the shops it is attached to.

The top bar message, the banner (image, link, alt text) and the homepage block are translatable per language. Fill in each language from the form’s language tabs.

Theme developer integration

When a campaign is active, the module adds classes on the body tag: dfts-active, dfts-campaign-{id}, dfts-effect-{effect}, and dfts-preview in preview mode. You can therefore target your CSS precisely.

A dfts:ready JavaScript event is also dispatched on the document once the script is initialized, with the campaign configuration in its detail. Combined with the --dfts-* CSS variables, this enables custom integrations without touching the module.

Performance

The module is lightweight by design. Resolving the active campaign takes a single memoized SQL query per page view. The front CSS and JavaScript load only when a campaign is genuinely active. No class override is used: only native PrestaShop hooks.

Troubleshooting

The banner does not show up

Your theme probably does not implement the chosen position hook. Change the Banner position to another value from the list.

The colors do not apply

Make sure Apply palette to theme is enabled. If it is but some elements remain unchanged, your theme uses specific selectors: add a few rules in the custom CSS field, relying on the --dfts-* variables.

The effect does not animate

Animations are intentionally disabled for visitors who enabled reduced motion in their operating system, and pause when the tab is in the background. Also check that an effect other than “None” is selected.

Two campaigns overlap

This is expected behavior: only one campaign is displayed, the one with the highest priority. Adjust the priorities to choose which one prevails.

The campaign does not trigger at the expected time

Dates are interpreted in server time, which may differ from your local time. Check your store’s time zone in the PrestaShop settings.

Was this page helpful?

Still stuck? Contact support