Newwebshop/app/Front/controllers/NewsletterController.php

350 lines
12 KiB
PHP

<?php
/**
* Copyright seit 2024 Webshop System
*
* Frontend-Newsletter-Controller für das Webshop-System
*
* @author Webshop System
* @license GPL v3
*/
namespace App\Front\Controllers;
use Doctrine\DBAL\DriverManager;
use Doctrine\DBAL\Exception;
class NewsletterController
{
public function subscribe()
{
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
header('Content-Type: application/json');
echo json_encode(['success' => false, 'message' => 'Ungültige Anfrage']);
return;
}
$email = $_POST['email'] ?? '';
$firstName = $_POST['first_name'] ?? '';
$lastName = $_POST['last_name'] ?? '';
$customerId = $_SESSION['customer_id'] ?? null;
// Validierung
if (empty($email) || !filter_var($email, FILTER_VALIDATE_EMAIL)) {
header('Content-Type: application/json');
echo json_encode(['success' => false, 'message' => 'Ungültige E-Mail-Adresse']);
return;
}
$connectionParams = [
'dbname' => getenv('DB_DATABASE') ?: 'freeshop',
'user' => getenv('DB_USERNAME') ?: 'freeshop_user',
'password' => getenv('DB_PASSWORD') ?: 'freeshop_password',
'host' => getenv('DB_HOST') ?: 'db',
'driver' => 'pdo_mysql',
'port' => getenv('DB_PORT') ?: 3306,
'charset' => 'utf8mb4',
];
try {
$conn = DriverManager::getConnection($connectionParams);
// Prüfen ob bereits abonniert
$stmt = $conn->prepare('SELECT id FROM ws_newsletter WHERE email = ? AND active = 1');
$stmt->execute([$email]);
$existing = $stmt->fetchAssociative();
if ($existing) {
header('Content-Type: application/json');
echo json_encode(['success' => false, 'message' => 'E-Mail-Adresse ist bereits abonniert']);
return;
}
// Newsletter-Abonnement erstellen
$stmt = $conn->prepare('
INSERT INTO ws_newsletter (email, first_name, last_name, customer_id, active, created_at)
VALUES (?, ?, ?, ?, 1, NOW())
');
$stmt->execute([$email, $firstName, $lastName, $customerId]);
// Willkommens-E-Mail senden
$this->sendWelcomeNewsletterEmail($email, $firstName);
header('Content-Type: application/json');
echo json_encode([
'success' => true,
'message' => 'Newsletter-Abonnement erfolgreich!'
]);
} catch (Exception $e) {
header('Content-Type: application/json');
echo json_encode(['success' => false, 'message' => 'Fehler: ' . $e->getMessage()]);
}
}
public function unsubscribe()
{
$token = $_GET['token'] ?? '';
if (empty($token)) {
$this->render('front/newsletter/error.html.twig', [
'title' => 'Webshop - Newsletter Fehler',
'message' => 'Ungültiger Abmelde-Link'
]);
return;
}
$connectionParams = [
'dbname' => getenv('DB_DATABASE') ?: 'freeshop',
'user' => getenv('DB_USERNAME') ?: 'freeshop_user',
'password' => getenv('DB_PASSWORD') ?: 'freeshop_password',
'host' => getenv('DB_HOST') ?: 'db',
'driver' => 'pdo_mysql',
'port' => getenv('DB_PORT') ?: 3306,
'charset' => 'utf8mb4',
];
try {
$conn = DriverManager::getConnection($connectionParams);
// Newsletter-Abonnement deaktivieren
$stmt = $conn->prepare('
UPDATE ws_newsletter
SET active = 0, unsubscribed_at = NOW()
WHERE unsubscribe_token = ?
');
$stmt->execute([$token]);
if ($stmt->rowCount() > 0) {
$this->render('front/newsletter/unsubscribed.html.twig', [
'title' => 'Webshop - Newsletter abgemeldet',
'message' => 'Sie wurden erfolgreich vom Newsletter abgemeldet.'
]);
} else {
$this->render('front/newsletter/error.html.twig', [
'title' => 'Webshop - Newsletter Fehler',
'message' => 'Ungültiger Abmelde-Link'
]);
}
} catch (Exception $e) {
$this->render('front/newsletter/error.html.twig', [
'title' => 'Webshop - Newsletter Fehler',
'message' => 'Fehler: ' . $e->getMessage()
]);
}
}
public function preferences()
{
if (!isset($_SESSION['customer_id'])) {
header('Location: /login?redirect=' . urlencode('/newsletter/preferences'));
exit;
}
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$this->updatePreferences();
} else {
$this->loadPreferences();
}
}
private function loadPreferences()
{
$connectionParams = [
'dbname' => getenv('DB_DATABASE') ?: 'freeshop',
'user' => getenv('DB_USERNAME') ?: 'freeshop_user',
'password' => getenv('DB_PASSWORD') ?: 'freeshop_password',
'host' => getenv('DB_HOST') ?: 'db',
'driver' => 'pdo_mysql',
'port' => getenv('DB_PORT') ?: 3306,
'charset' => 'utf8mb4',
];
try {
$conn = DriverManager::getConnection($connectionParams);
$stmt = $conn->prepare('
SELECT * FROM ws_newsletter
WHERE customer_id = ? AND active = 1
');
$stmt->execute([$_SESSION['customer_id']]);
$newsletter = $stmt->fetchAssociative();
$this->render('front/newsletter/preferences.html.twig', [
'title' => 'Webshop - Newsletter-Einstellungen',
'newsletter' => $newsletter
]);
} catch (Exception $e) {
$this->render('front/newsletter/preferences.html.twig', [
'title' => 'Webshop - Newsletter-Einstellungen',
'error' => 'Fehler beim Laden der Einstellungen: ' . $e->getMessage()
]);
}
}
private function updatePreferences()
{
$active = isset($_POST['active']) ? 1 : 0;
$categories = $_POST['categories'] ?? [];
$connectionParams = [
'dbname' => getenv('DB_DATABASE') ?: 'freeshop',
'user' => getenv('DB_USERNAME') ?: 'freeshop_user',
'password' => getenv('DB_PASSWORD') ?: 'freeshop_password',
'host' => getenv('DB_HOST') ?: 'db',
'driver' => 'pdo_mysql',
'port' => getenv('DB_PORT') ?: 3306,
'charset' => 'utf8mb4',
];
try {
$conn = DriverManager::getConnection($connectionParams);
if ($active) {
// Newsletter aktivieren/aktualisieren
$stmt = $conn->prepare('
INSERT INTO ws_newsletter (customer_id, email, first_name, last_name, preferences, active, created_at)
VALUES (?, ?, ?, ?, ?, 1, NOW())
ON DUPLICATE KEY UPDATE
preferences = VALUES(preferences),
active = 1,
updated_at = NOW()
');
$preferences = json_encode($categories);
$stmt->execute([
$_SESSION['customer_id'],
$_SESSION['customer_email'],
explode(' ', $_SESSION['customer_name'])[0],
explode(' ', $_SESSION['customer_name'])[1] ?? '',
$preferences
]);
} else {
// Newsletter deaktivieren
$stmt = $conn->prepare('
UPDATE ws_newsletter
SET active = 0, unsubscribed_at = NOW()
WHERE customer_id = ?
');
$stmt->execute([$_SESSION['customer_id']]);
}
$this->render('front/newsletter/preferences.html.twig', [
'title' => 'Webshop - Newsletter-Einstellungen',
'success' => 'Einstellungen erfolgreich gespeichert',
'newsletter' => ['active' => $active, 'preferences' => json_encode($categories)]
]);
} catch (Exception $e) {
$this->render('front/newsletter/preferences.html.twig', [
'title' => 'Webshop - Newsletter-Einstellungen',
'error' => 'Fehler beim Speichern: ' . $e->getMessage()
]);
}
}
public function preview($id)
{
if (!isset($_SESSION['admin_id'])) {
header('Location: /admin/login');
exit;
}
$connectionParams = [
'dbname' => getenv('DB_DATABASE') ?: 'freeshop',
'user' => getenv('DB_USERNAME') ?: 'freeshop_user',
'password' => getenv('DB_PASSWORD') ?: 'freeshop_password',
'host' => getenv('DB_HOST') ?: 'db',
'driver' => 'pdo_mysql',
'port' => getenv('DB_PORT') ?: 3306,
'charset' => 'utf8mb4',
];
try {
$conn = DriverManager::getConnection($connectionParams);
$stmt = $conn->prepare('SELECT * FROM ws_newsletter_template WHERE id = ?');
$stmt->execute([$id]);
$template = $stmt->fetchAssociative();
if (!$template) {
$this->render('front/newsletter/error.html.twig', [
'title' => 'Webshop - Newsletter Fehler',
'message' => 'Template nicht gefunden'
]);
return;
}
// Template mit Testdaten rendern
$content = $this->renderNewsletterTemplate($template, [
'first_name' => 'Test',
'last_name' => 'Kunde',
'unsubscribe_url' => '#'
]);
$this->render('front/newsletter/preview.html.twig', [
'title' => 'Webshop - Newsletter Vorschau',
'template' => $template,
'content' => $content
]);
} catch (Exception $e) {
$this->render('front/newsletter/error.html.twig', [
'title' => 'Webshop - Newsletter Fehler',
'message' => 'Fehler: ' . $e->getMessage()
]);
}
}
private function sendWelcomeNewsletterEmail($email, $firstName)
{
$subject = 'Willkommen zum Newsletter!';
$message = "
<html>
<head>
<title>Newsletter Anmeldung</title>
</head>
<body>
<h2>Hallo $firstName!</h2>
<p>Vielen Dank für Ihre Anmeldung zum Webshop Newsletter!</p>
<p>Sie erhalten ab sofort regelmäßig Informationen über:</p>
<ul>
<li>Neue Produkte und Angebote</li>
<li>Exklusive Rabatte und Gutscheine</li>
<li>Interessante Artikel und Tipps</li>
</ul>
<p>Falls Sie den Newsletter nicht mehr erhalten möchten, können Sie sich jederzeit <a href='/newsletter/unsubscribe'>hier abmelden</a>.</p>
<p>Mit freundlichen Grüßen<br>Ihr Webshop-Team</p>
</body>
</html>
";
$headers = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=UTF-8' . "\r\n";
$headers .= 'From: Webshop <noreply@webshop-system.de>' . "\r\n";
$headers .= 'Reply-To: info@webshop-system.de' . "\r\n";
$headers .= 'X-Mailer: PHP/' . phpversion();
mail($email, $subject, $message, $headers);
}
private function renderNewsletterTemplate($template, $data)
{
$content = $template['content'];
// Platzhalter ersetzen
foreach ($data as $key => $value) {
$content = str_replace('{{' . $key . '}}', $value, $content);
}
return $content;
}
protected function render($template, $data = [])
{
// Einfache Template-Engine (später durch Twig ersetzen)
extract($data);
include __DIR__ . '/../../templates/' . $template;
}
}