' . '
' . htmlspecialchars($title, ENT_QUOTES, 'UTF-8') . '
' . '
' . '' . '' . '
' . ''; }); Shortcodes::register('newsletter-unsubscribe', static function (array $attrs = []): string { $label = trim((string)($attrs['label'] ?? 'Unsubscribe')); if ($label === '') { $label = 'Unsubscribe'; } $token = trim((string)($attrs['token'] ?? '')); $href = '/newsletter/unsubscribe'; if ($token !== '') { $href .= '?token=' . rawurlencode($token); } return '' . htmlspecialchars($label, ENT_QUOTES, 'UTF-8') . ''; }); Shortcodes::register('newsletter-unsubscribe-form', static function (array $attrs = []): string { $title = trim((string)($attrs['title'] ?? 'Unsubscribe from newsletter')); $button = trim((string)($attrs['button'] ?? 'Unsubscribe')); if ($title === '') { $title = 'Unsubscribe from newsletter'; } if ($button === '') { $button = 'Unsubscribe'; } return '
' . '
' . htmlspecialchars($title, ENT_QUOTES, 'UTF-8') . '
' . '
' . '' . '' . '
' . '
'; }); return function (Router $router): void { $controller = new NewsletterController(); $router->post('/newsletter/subscribe', [$controller, 'subscribe']); $router->get('/newsletter/unsubscribe', [$controller, 'unsubscribeForm']); $router->post('/newsletter/unsubscribe', [$controller, 'unsubscribe']); $router->get('/admin/newsletter', [$controller, 'adminIndex']); $router->get('/admin/newsletter/campaigns/new', [$controller, 'adminEdit']); $router->get('/admin/newsletter/campaigns/edit', [$controller, 'adminEdit']); $router->post('/admin/newsletter/campaigns/save', [$controller, 'adminSave']); $router->post('/admin/newsletter/campaigns/send', [$controller, 'adminSend']); $router->post('/admin/newsletter/campaigns/test', [$controller, 'adminTestSend']); $router->post('/admin/newsletter/campaigns/process', [$controller, 'adminProcessQueue']); $router->get('/admin/newsletter/subscribers', [$controller, 'adminSubscribers']); $router->post('/admin/newsletter/subscribers/delete', [$controller, 'adminDeleteSubscriber']); };