tenbruggencate / legal-pages
Standalone Dutch/German/English legal page templates with configurable merge fields for company details
Package info
bitbucket.org/Bruggencate/sw-plugin-legalpages
Type:shopware-platform-plugin
pkg:composer/tenbruggencate/legal-pages
Requires
- php: >=8.1
- shopware/core: ~6.7
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.94
- phpstan/phpstan: ^2.1
- phpunit/phpunit: ^11.0
- shopware/storefront: ~6.7
- dev-main
- 1.1.3
- 1.1.2
- dev-release/v1.1.3
- dev-chore/gitignore-claude-skills
- dev-ci/junit-test-reports
- dev-polish/store-icon
- dev-polish/audit-screenshots
- dev-polish/multi-locale-docs
- dev-polish/multi-locale-changelogs
- dev-polish/why-comparison-related
- dev-fix/meta-description-and-engb-dpa
- dev-fix/german-privacy-dpa-reference
This package is not auto-updated.
Last update: 2026-04-27 23:07:42 UTC
README
TenBruggencateLegalPages
![]()
Dutch / English / German legal page templates with configurable merge fields for company details. Drop in, fill in the admin fields, ship.
License: MIT · Shopware: 6.7.x · PHP: 8.1 / 8.2
🇬🇧 English · 🇳🇱 Nederlands · 🇩🇪 Deutsch
📖 More context: Why we built this · How it compares
⚠️ IMPORTANT — this plugin provides TEMPLATE legal text. Have a legal professional (Dutch / German / EU consumer law) review your configured text before it's exposed to real customers. Templates are a starting point, not a guarantee.
What it does
Every Shopware store needs imprint, privacy, shipping, returns, and a disclaimer. Most shops either (a) copy-paste text from another site (legal risk) or (b) leave them as Lorem Ipsum until launch day (worse legal risk). This plugin ships sensible nl/en/de defaults based on Dutch EU-compliant consumer-law templates, with your company details merged in from the admin at render time.
- Five pages, routable out of the box
- Merge-field pattern — admin fills in company details once; every page picks them up
- Three locales — nl-NL, en-GB, de-DE
- Per-page toggle — disable pages you don't need (e.g. if you already have a custom privacy page elsewhere)
Install
composer require tenbruggencate/legal-pages
bin/console plugin:refresh
bin/console plugin:install --activate TenBruggencateLegalPages
bin/console cache:clear
Pages
| Route | Path | Content |
|---|---|---|
legal.voorwaarden | /legal/voorwaarden | Algemene Voorwaarden (Terms & Conditions) |
legal.privacy | /legal/privacy | Privacyverklaring (Privacy Policy) |
legal.verzending | /legal/verzending | Verzendinformatie (Shipping Info) |
legal.retour | /legal/retour | Retourbeleid (Return Policy) |
legal.disclaimer | /legal/disclaimer | Disclaimer |
Configuration
Configurable per sales channel from Extensions → Legal Pages.
| Field | Purpose |
|---|---|
companyName | Company name (e.g. "Mijn Webshop B.V.") |
companyAddress | Full postal address |
companyEmail | Contact email |
companyPhone | Phone number |
kvkNumber | Chamber of Commerce number (KvK) |
btwNumber | VAT / BTW number |
returnDays | Return period in days (EU minimum: 14) |
shippingCost | Standard shipping cost |
freeShippingThreshold | Free shipping above this amount |
enableVoorwaarden / enablePrivacy / enableVerzending / enableRetour / enableDisclaimer | Per-page kill switches |
Merge fields
The following placeholders are replaced with your configured values at render time:
{companyName}, {companyAddress}, {companyEmail}, {companyPhone}, {kvkNumber}, {btwNumber}, {returnDays}, {shippingCost}, {freeShippingThreshold}
To override any page's template, copy src/Resources/views/storefront/page/legal/<slug>.html.twig into your theme and edit. The merge-field resolver runs against whatever HTML/Twig you ship.
Standards
- Performance — static template rendering; no DB queries at request time. Merge-field substitution is a single
strtr()call. - SEO — every legal page ships with appropriate
<meta name="robots">defaults: indexable (search engines should see your terms & privacy), proper<title>and<meta description>derived from the page content, stable URLs. - GDPR — the privacy page template explicitly documents what you collect, why, and how long you keep it. Adapt the template to match your actual processing; don't leave the defaults unread. The plugin itself stores no visitor data — full data-flow documentation in
GDPR.md. - WCAG 2.2 AA — semantic heading hierarchy (
h1/h2/h3), proper lists for enumerated terms, keyboard-accessible<a>tags, no colour-only information. Live axe-core audit output + desktop + mobile screenshots:docs/ACCESSIBILITY.md. - Security — merge-field substitution is done on server-side; no user input reaches the templates. All admin-supplied values are escaped via Twig.
- Uninstall —
plugin:uninstall --keep-user-datapreserves everyTenBruggencateLegalPages.config.*row (company name, VAT, KvK, per-page toggles); without the flag the destructive path clears them all. No owned tables.
Compatibility
Core platform
| Shopware | PHP | Status |
|---|---|---|
| 6.7.x — tested against 6.7.8, 6.7.9 | 8.1, 8.2 | Stable |
| 6.6.x | — | Not supported |
| 6.5.x and earlier | — | Not supported |
Database
| Engine | Version | Notes |
|---|---|---|
| MySQL | 8.0+ | Primary target; JSON functions used for config-row manipulation in migrations |
| MariaDB | 10.11+ | Tested end-to-end; earlier versions lack some JSON operator support |
Browsers (storefront)
Evergreen browsers only — the two most recent stable releases of each:
| Browser | Desktop | Mobile |
|---|---|---|
| Chrome / Chromium | ✅ | ✅ |
| Firefox | ✅ | ✅ |
| Safari | ✅ (macOS) | ✅ (iOS 16+) |
| Edge | ✅ | — |
Internet Explorer and legacy Edge are not supported. The plugin emits no runtime JS (where applicable) so graceful degradation on older browsers usually still renders content, just without progressive enhancements.
Admin browsers
Same evergreen matrix — the Shopware admin is Vue-based and has its own compatibility baseline that this plugin doesn't extend or narrow.
Development
| Tool | Version | Scope |
|---|---|---|
| PHP | ≥ 8.1 | Runtime + test suite |
| Composer | 2.x | Dependency management |
| Node.js | ≥ 18 | Only needed if you edit SCSS and re-run the theme compile |
| Python | ≥ 3.9 | Only needed for the repo's asset-pipeline scripts (scripts/*.py) |
Accessibility
WCAG 2.2 level A + AA — see docs/ACCESSIBILITY.md for axe-core audit output and per-page violations.
What we test before each release
- Full PHPUnit unit suite against PHP 8.1 + 8.2 (source-inspection tests don't need a kernel)
- PHPStan level 8 + PHP-CS-Fixer (@PSR12 + @Symfony)
- Composer validate on every plugin
- Live-DB smoke tests (plugin install → activate → route render → uninstall cycle)
- axe-core audit on the primary storefront surfaces (see ACCESSIBILITY.md)
Related plugins
- TenBruggencateMultiBrand — per-brand configuration: each sales channel carries its own
companyName/kvkNumber/ etc., so a multi-brand store renders each brand's legal pages with its own entity details - TenBruggencateMaintenance — legal footer links render in the maintenance footer so visitors can still reach imprint / privacy during downtime
- TenBruggencateNewsletterLite —
/legal/privacyis the natural target for theprivacyPageUrlconfig in NewsletterLite
Support
- Email: guy@tenbruggencatedevelopment.nl
- Docs & news: tenbruggencatedevelopment.nl
- Source / issues: Bitbucket repo
- Security vulnerabilities: see
SECURITY.md— email first, no public issues, 72-hour acknowledgement SLA
License
MIT © Ten Bruggencate Development
Legal template text in snippets is provided under MIT for reuse, but template text alone does not constitute legal advice. You are responsible for adapting it to your business and jurisdiction.