From d2fa64b48928fdb051e956f3ec4dbf772691d708 Mon Sep 17 00:00:00 2001 From: Nik Date: Wed, 3 Mar 2021 23:18:46 +0100 Subject: [PATCH] BUG Allow Email to re-render when data changes (#9876) * Fix: Allow Email to re-render when data changes * Add invalidateBody function * Make the linter happy --- src/Control/Email/Email.php | 15 ++++++++++++ tests/php/Control/Email/EmailTest.php | 33 +++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/src/Control/Email/Email.php b/src/Control/Email/Email.php index 6bf4074d8..b3756f739 100644 --- a/src/Control/Email/Email.php +++ b/src/Control/Email/Email.php @@ -570,6 +570,7 @@ class Email extends ViewableData public function setData($data) { $this->data = $data; + $this->invalidateBody(); return $this; } @@ -589,6 +590,8 @@ class Email extends ViewableData $this->data->$name = $value; } + $this->invalidateBody(); + return $this; } @@ -606,6 +609,8 @@ class Email extends ViewableData $this->data->$name = null; } + $this->invalidateBody(); + return $this; } @@ -635,6 +640,16 @@ class Email extends ViewableData return $this; } + /** + * @return $this + */ + public function invalidateBody() + { + $this->setBody(null); + + return $this; + } + /** * @return string The base URL for the email */ diff --git a/tests/php/Control/Email/EmailTest.php b/tests/php/Control/Email/EmailTest.php index 24230320e..c8b654256 100644 --- a/tests/php/Control/Email/EmailTest.php +++ b/tests/php/Control/Email/EmailTest.php @@ -559,6 +559,39 @@ class EmailTest extends SapphireTest $this->assertCount(1, $email->getSwiftMessage()->getChildren()); } + public function testRerender() + { + $email = new Email(); + $email->setData([ + 'EmailContent' => 'my content', + ]); + $email->render(); + $this->assertContains('my content', $email->getBody()); + $children = $email->getSwiftMessage()->getChildren(); + $this->assertCount(1, $children); + $plainPart = reset($children); + $this->assertEquals('my content', $plainPart->getBody()); + + // Ensure setting data causes a rerender + $email->setData([ + 'EmailContent' => 'your content' + ]); + $email->render(); + $this->assertContains('your content', $email->getBody()); + + // Ensure removing data causes a rerender + $email->removeData('EmailContent'); + $email->render(); + $this->assertNotContains('your content', $email->getBody()); + + // Ensure adding data causes a rerender + $email->addData([ + 'EmailContent' => 'their content' + ]); + $email->render(); + $this->assertContains('their content', $email->getBody()); + } + public function testRenderPlainOnly() { $email = new Email();