Display personalization tags properly in listings

[MAILPOET-6385]
This commit is contained in:
Pavel Dohnal
2024-12-18 11:25:22 +01:00
committed by Aschepikov
parent 5fb8247163
commit 1161fcef20
2 changed files with 41 additions and 1 deletions

View File

@ -113,6 +113,28 @@ class NewslettersResponseBuilder {
return $data;
}
private function processPersonalizationTags(string $content): string {
if (strpos($content, '<!--') === false) {
// we don't need to parse anything if there are no personalization tags
return $content;
}
if (!class_exists('\MailPoet\EmailEditor\Engine\PersonalizationTags\HTML_Tag_Processor')) {
// editor is not active, we cannot process personalization tags
return $content;
}
$content_processor = new \MailPoet\EmailEditor\Engine\PersonalizationTags\HTML_Tag_Processor($content);
while ($content_processor->next_token()) {
$type = $content_processor->get_token_type();
if ($type === '#comment') {
$token = $content_processor->get_modifiable_text();
$content_processor->replace_token($token);
}
}
$content_processor->flush_updates();
return $content_processor->get_updated_html();
}
/**
* @param NewsletterEntity[] $newsletters
* @return mixed[]
@ -138,7 +160,7 @@ class NewslettersResponseBuilder {
$data = [
'id' => (string)$newsletter->getId(), // (string) for BC
'hash' => $newsletter->getHash(),
'subject' => $newsletter->getSubject(),
'subject' => $this->processPersonalizationTags($newsletter->getSubject()),
'type' => $newsletter->getType(),
'status' => $newsletter->getStatus(),
'sent_at' => ($sentAt = $newsletter->getSentAt()) ? $sentAt->format(self::DATE_FORMAT) : null,

View File

@ -57,4 +57,22 @@ class NewslettersResponseBuilderTest extends \MailPoetTest {
$em->remove($newsletter);
$em->flush();
}
public function testItReplacesPersonalizationTags() {
$em = $this->diContainer->get(EntityManager::class);
$responseBuilder = $this->diContainer->get(NewslettersResponseBuilder::class);
$em->persist($newsletter = new NewsletterEntity);
$newsletter->setType(NewsletterEntity::TYPE_STANDARD);
$newsletter->setStatus(NewsletterEntity::STATUS_SENT);
$newsletter->setSubject('Subject');
$em->flush();
$newsletter->setSubject('Subject');
$response = $responseBuilder->buildForListing([$newsletter]);
verify($response[0]['subject'])->equals('Subject');
$newsletter->setSubject('Hello <!--[mailpoet/subscriber-firstname default="subscriber"]-->!');
$response = $responseBuilder->buildForListing([$newsletter]);
verify($response[0]['subject'])->equals('Hello [mailpoet/subscriber-firstname default="subscriber"]!');
}
}