Files
website/website/app/Models/EmailTemplate.php
Claude Dev 40c1ecc6fe Remove old Vuexy wrapper components (AppTextField, AppSelect, AppTextarea, FlashMessages, NotificationBell)
All pages now use native Vuetify components directly. Flash messages are handled
by the ToastStack component via Pinia store. Notifications use NotificationPanel.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 17:10:23 -04:00

68 lines
1.5 KiB
PHP

<?php
declare(strict_types=1);
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class EmailTemplate extends Model
{
use HasFactory;
protected $fillable = [
'slug',
'name',
'subject',
'body',
'available_variables',
'is_active',
];
protected function casts(): array
{
return [
'available_variables' => 'array',
'is_active' => 'boolean',
];
}
public static function getTemplate(string $slug): ?self
{
return static::query()
->where('slug', $slug)
->where('is_active', true)
->first();
}
/**
* Render a template by replacing {{variable_name}} placeholders with actual values.
*
* @param array<string, string> $variables
* @return array{subject: string, body: string}|null
*/
public static function render(string $slug, array $variables): ?array
{
$template = static::getTemplate($slug);
if (! $template) {
return null;
}
$subject = $template->subject;
$body = $template->body;
foreach ($variables as $key => $value) {
$placeholder = '{{'.$key.'}}';
$subject = str_replace($placeholder, (string) $value, $subject);
$body = str_replace($placeholder, (string) $value, $body);
}
return [
'subject' => $subject,
'body' => $body,
];
}
}