Add email templates, page layouts, and shop themes (template system)
Deploy to Production (witstore.wende.it) / deploy (push) Successful in 7s

- E-Mail-Templates: DB-gespeicherte HTML-Templates mit {{placeholder}}-System,
  Admin-UI zum Bearbeiten von Betreff und Body, alle 4 Mailables aktualisiert
- Seiten-Layouts: 4 Layouts für CMS-Seiten (Standard, Sidebar, Volle Breite, Landing),
  Layout-Auswahl im Admin-Formular
- Shop-Themes: 5 Farbthemen via CSS-Variablen, Picker in Einstellungen
- Deployment: EmailTemplateSeeder wird automatisch beim Deploy ausgeführt

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-20 22:04:54 +02:00
co-authored by Claude Sonnet 4.6
parent 4f42b64f24
commit 5dad8b9324
23 changed files with 700 additions and 55 deletions
+133
View File
@@ -0,0 +1,133 @@
<?php
namespace Database\Seeders;
use App\Models\EmailTemplate;
use Illuminate\Database\Seeder;
class EmailTemplateSeeder extends Seeder
{
public function run(): void
{
$templates = [
[
'key' => 'order_confirmation',
'label' => 'Bestellbestätigung',
'subject' => 'Bestellbestätigung {{order_number}} – {{shop_name}}',
'variables' => ['customer_name','order_number','order_total','payment_info','order_items_table','shop_name','shop_email','shop_address','shop_owner','bank_name','bank_iban','bank_bic','invoice_payment_days'],
'body' => <<<'HTML'
<!DOCTYPE html>
<html lang="de">
<head><meta charset="UTF-8"><style>
body { font-family: Arial, sans-serif; color: #333; max-width: 600px; margin: 0 auto; }
h1 { color: #1d4ed8; }
table { width: 100%; border-collapse: collapse; }
th, td { padding: 8px; border-bottom: 1px solid #eee; text-align: left; }
th { background: #f8fafc; }
.total { font-weight: bold; font-size: 1.1em; }
.box { background: #f8fafc; padding: 16px; border-radius: 8px; margin: 16px 0; }
</style></head>
<body>
<h1>Vielen Dank für Ihre Bestellung!</h1>
<p>Guten Tag {{customer_name}},</p>
<p>wir haben Ihre Bestellung <strong>{{order_number}}</strong> erhalten und bestätigen sie hiermit.</p>
{{payment_info}}
<h2>Bestellübersicht</h2>
{{order_items_table}}
<hr>
<p style="font-size:0.85em;color:#666;">
{{shop_name}} | {{shop_address}}<br>
Bei Fragen: <a href="mailto:{{shop_email}}">{{shop_email}}</a>
</p>
</body>
</html>
HTML,
],
[
'key' => 'order_shipped',
'label' => 'Versandbestätigung',
'subject' => 'Ihre Bestellung {{order_number}} ist unterwegs',
'variables' => ['order_number','tracking_code','shop_name','shop_email'],
'body' => <<<'HTML'
<!DOCTYPE html>
<html lang="de">
<head><meta charset="UTF-8"><style>
body { font-family: Arial, sans-serif; color: #333; max-width: 600px; margin: 0 auto; }
h1 { color: #1d4ed8; }
.box { background: #f0fdf4; padding: 16px; border-radius: 8px; border: 1px solid #86efac; }
</style></head>
<body>
<h1>Ihre Bestellung ist unterwegs!</h1>
<p>Ihre Bestellung <strong>{{order_number}}</strong> wurde versendet.</p>
{{tracking_info}}
<p>Bei Fragen zu Ihrer Lieferung können Sie uns jederzeit kontaktieren.</p>
<hr>
<p style="font-size:0.85em;color:#666;">{{shop_name}} | {{shop_email}}</p>
</body>
</html>
HTML,
],
[
'key' => 'payment_received',
'label' => 'Zahlungsbestätigung',
'subject' => 'Zahlung eingegangen – Bestellung {{order_number}}',
'variables' => ['customer_name','order_number','order_total','shop_name','shop_email'],
'body' => <<<'HTML'
<!DOCTYPE html>
<html lang="de">
<head><meta charset="UTF-8"><style>
body { font-family: Arial, sans-serif; color: #333; max-width: 600px; margin: 0 auto; }
h1 { color: #16a34a; }
</style></head>
<body>
<h1>Zahlung eingegangen</h1>
<p>Guten Tag {{customer_name}},</p>
<p>Ihre Zahlung für Bestellung <strong>{{order_number}}</strong> ({{order_total}} €) ist eingegangen.</p>
<p>Im Anhang finden Sie Ihre Rechnung als PDF.</p>
<p>Wir werden Ihre Bestellung schnellstmöglich bearbeiten und versenden.</p>
<hr>
<p style="font-size:0.85em;color:#666;">{{shop_name}} | {{shop_email}}</p>
</body>
</html>
HTML,
],
[
'key' => 'widerruf_confirmation',
'label' => 'Widerrufsbestätigung',
'subject' => 'Bestätigung Ihres Widerrufs',
'variables' => ['customer_name','widerruf_name','widerruf_email','widerruf_order_number','widerruf_product','widerruf_date','widerruf_reason','shop_name'],
'body' => <<<'HTML'
<!DOCTYPE html>
<html lang="de">
<head><meta charset="UTF-8"><style>
body { font-family: Arial, sans-serif; color: #333; max-width: 600px; margin: 0 auto; }
</style></head>
<body>
<h2>Bestätigung Ihres Widerrufs</h2>
<p>Guten Tag {{customer_name}},</p>
<p>Ihr Widerruf ist bei uns eingegangen. Wir werden ihn schnellstmöglich bearbeiten.</p>
<table style="border-collapse:collapse;width:100%">
<tr><td style="padding:6px;font-weight:bold">Name</td><td style="padding:6px">{{widerruf_name}}</td></tr>
<tr><td style="padding:6px;font-weight:bold">E-Mail</td><td style="padding:6px">{{widerruf_email}}</td></tr>
<tr><td style="padding:6px;font-weight:bold">Bestellnummer</td><td style="padding:6px">{{widerruf_order_number}}</td></tr>
<tr><td style="padding:6px;font-weight:bold">Produkt</td><td style="padding:6px">{{widerruf_product}}</td></tr>
<tr><td style="padding:6px;font-weight:bold">Datum</td><td style="padding:6px">{{widerruf_date}}</td></tr>
<tr><td style="padding:6px;font-weight:bold">Begründung</td><td style="padding:6px">{{widerruf_reason}}</td></tr>
</table>
<p style="font-size:0.85em;color:#666;">{{shop_name}}</p>
</body>
</html>
HTML,
],
];
foreach ($templates as $tpl) {
EmailTemplate::updateOrCreate(['key' => $tpl['key']], $tpl);
}
}
}