. * * Thông tin công ty hardcode ở footer vì EmailTemplateRenderer chỉ thay placeholder dạng * {{key}} đã khai báo trong metadata.variables — mọi scenario đều phải khai lại nếu muốn * footer động, không đáng. */ class EmailTemplateShell { /** Bọc phần nội dung vào khung chuẩn. */ public static function wrap(string $bodyHtml): string { return self::header() . $bodyHtml . self::footer(); } /** * Mở khối NoiDungKM với style chữ chuẩn, để scenario chỉ viết nội dung bên trong. */ public static function body(string $innerHtml): string { return '' . $innerHtml . ''; } /** Khối "Lưu ý: email tự động" dùng ở cuối hầu hết scenario. */ public static function autoNotice(): string { return <<<'HTML'
Lưu ý: Đây là email được gửi tự động. Vui lòng không trả lời email này.
HTML; } public static function header(): string { return <<<'HTML'
HTML; } public static function footer(): string { return <<<'HTML'
Thư gửi từ CÔNG TY CỔ PHẦN GIẢI PHÁP CÔNG NGHỆ THẾ GIỚI SỐ
HTML; } /** * Bọc một đoạn HTML thành email hoàn chỉnh (doctype + head). Thay cho blade * emails.customer.template-envelope — để không còn mail nào đi qua Blade. */ public static function document(?string $title, string $bodyHtml): string { $safeTitle = htmlspecialchars((string) $title, ENT_QUOTES, 'UTF-8'); return << {$safeTitle} {$bodyHtml} HTML; } }