File: /home/xedaptot/be.naniguide.com/app/Library/MailListTemplateTagResolver.php
<?php
namespace App\Library;
use App\Library\Contracts\TagResolverInterface;
use App\Model\MailListTemplate;
use App\Model\Subscriber;
use Carbon\Carbon;
/**
* Resolves page-context tags for sign-up / profile-update / unsubscribe pages
* rendered from a {@see MailListTemplate}.
*
* Companion to existing TagResolverInterface implementations:
* - GeneralTagResolver — current_year / current_date / etc.
* - MailList — list.* (name, uid, from_email, from_name)
* - Subscriber — subscriber.<field>, email, name, first_name, ...
*
* This resolver supplies what only the page context can know:
* page_title, fields (rendered form), email_field, the four buttons,
* subscribe_url, current_date (customer-localized override),
* plus subscriber-flow URLs (subscribe_confirm_url, unsubscribe_url,
* update_profile_url, subscriber_summary). When no subscriber is bound
* the same keys render with preview placeholders.
*/
class MailListTemplateTagResolver implements TagResolverInterface
{
public function __construct(
private MailListTemplate $template,
private mixed $values = null,
private ?Subscriber $subscriber = null,
private ?string $messageId = null,
) {
}
public function getResolvedTags(): array
{
$list = $this->template->mailList;
$tags = [
'page_title' => trans('messages.' . $this->template->alias),
'fields' => view('pub.mail_lists._subscribe_form', [
'list' => $list,
'is_page' => true,
'col' => '12',
'values' => $this->values,
'email_readonly' => true,
])->render(),
'subscribe_button' => '<button class="btn btn-info bg-teal-800" type="submit">' . trans('messages.subscribe') . ' <span class="material-symbols-rounded">east</span></button>',
'email_field' => view('helpers.form_control', [
'type' => 'text',
'name' => 'EMAIL',
'label' => trans('messages.email_address'),
'value' => '',
'rules' => $list->getFieldRules(),
])->render(),
'unsubscribe_button' => '<button class="btn btn-info bg-teal-800" type="submit">' . trans('messages.unsubscribe') . ' <span class="material-symbols-rounded">east</span></button>',
'update_profile_button' => '<button class="btn btn-info bg-teal-800" type="submit">' . trans('messages.update_profile') . ' <span class="material-symbols-rounded">east</span></button>',
'subscribe_url' => action(
'Pub\MailListController@signUpForm',
['list_uid' => $list->uid, 'customer_uid' => $list->customer->uid],
true
),
// Override GeneralTagResolver's ISO current_date with the customer-localized format
'current_date' => $list->customer->formatDateTime(Carbon::now(), 'date_without_year'),
];
return array_merge(
$tags,
$this->subscriber ? $this->subscriberFlowTags() : $this->previewFlowTags()
);
}
private function subscriberFlowTags(): array
{
$list = $this->template->mailList;
$subscriberService = app(\App\Services\SubscriberService::class);
return [
'subscribe_confirm_url' => $subscriberService->generateSignedConfirmationUrl($this->subscriber),
'subscriber_summary' => view('subscribers._summary', [
'list' => $list,
'subscriber' => $this->subscriber,
])->render(),
'update_profile_url' => action(
'Pub\MailListController@profileUpdateForm',
['list_uid' => $list->uid, 'id' => $this->subscriber->id, 'customer_uid' => $list->customer->uid],
true
),
'unsubscribe_url' => $this->subscriber->generateUnsubscribeFormUrl($this->messageId),
];
}
private function previewFlowTags(): array
{
return [
'subscribe_confirm_url' => '<a href="http://domain.example/secure_token">http://domain.example/secure_token</a>',
'subscriber_summary' => '<p><strong>' . trans('messages.email') . ':</strong></p>'
. '<p><strong>' . trans('messages.first_name') . ':</strong></p>'
. '<p><strong>' . trans('messages.last_name') . ':</strong></p>',
'update_profile_url' => 'http://domain.example/secure_token',
'unsubscribe_url' => 'http://domain.example/secure_token',
];
}
}