This page documents the technical structure of the Wine Club offer portal.
The portal uses Grav page content, a theme template, Grav Forms, Grav Email, and a small custom validation/helper plugin.
The page lets members or public visitors submit a wine request linked to a Club Wine Club meeting.
The request is sent to:
wineclub@coulsdoncomrades.co.uk;winecluborganiser@coulsdoncomrades.co.uk;The Club does not take wine payment or fulfil wine orders.
Current live page:
/service-landing-pages/wine-offer-grape-variety
Local page folder:
user/pages/09.service-landing-pages/07.wine-offer-grape-variety/
Main page file:
user/pages/09.service-landing-pages/07.wine-offer-grape-variety/wine-order.md
Offer-specific images live in the same page folder so Grav Admin can manage them as page media.
Main template:
user/themes/members-hub/templates/wine-order.html.twig
Wine offer card partial:
user/themes/members-hub/templates/forms/partials/wine-offers.html.twig
Supplier email template:
user/themes/members-hub/templates/forms/emails/wine-order-request.txt.twig
User receipt template:
user/themes/members-hub/templates/forms/emails/wine-order-receipt.txt.twig
Shared email total partial:
user/themes/members-hub/templates/forms/emails/partials/wine-order-total.txt.twig
Admin blueprint:
user/themes/members-hub/blueprints/wine-order.yaml
Custom plugin:
user/plugins/request-portal/request-portal.php
Plugin config:
user/plugins/request-portal/request-portal.yaml
The plugin:
wine_offers data.The portal depends on:
request-portal plugin.The form process is defined in the page frontmatter under form.process.
The page data is intentionally held on the page.
Important sections:
portal: public page words and confirmation text;meeting_payment: meeting subscription payment buttons;supplier: supplier details and supplier delivery email;wine_offers.bottles: wine list, images, price text, and form codes;form: Grav Form fields and email process.The Admin blueprint presents these fields in visual page order so editors do not need to work directly in YAML.
Supplier and Club email:
forms/emails/wine-order-request.txt.twig
User thank-you receipt:
forms/emails/wine-order-receipt.txt.twig
Both include:
forms/emails/partials/wine-order-total.txt.twig
The total summary is calculated by the plugin function wine_order_summary.
Club-owned official assets:
user/data/clubdocs/websiteresources/
Theme/interface assets:
user/themes/members-hub/images/
Offer-specific assets:
user/pages/09.service-landing-pages/07.wine-offer-grape-variety/
This separation keeps Club records, theme assets, and temporary supplier offer media under different ownership.
Deploy these files or folders when moving this feature:
user/pages/09.service-landing-pages/07.wine-offer-grape-variety/user/themes/members-hub/templates/wine-order.html.twiguser/themes/members-hub/templates/forms/partials/wine-offers.html.twiguser/themes/members-hub/templates/forms/emails/wine-order-request.txt.twiguser/themes/members-hub/templates/forms/emails/wine-order-receipt.txt.twiguser/themes/members-hub/templates/forms/emails/partials/wine-order-total.txt.twiguser/themes/members-hub/blueprints/wine-order.yamluser/plugins/request-portal/request-portal.phpuser/plugins/request-portal/request-portal.yamlIf the live site does not already have the Club crest configured, also deploy:
user/config/site.yamluser/data/clubdocs/websiteresources/logos/ClubCrestV1.pngClear the Grav cache after deployment.
After deployment:
Do not edit Grav core, vendor files, or the base Learn2 theme.
Keep customisations in:
members-hub overlay theme;request-portal plugin;If the form field code for a wine changes, check the form output and email summary before publishing.