diff --git a/mailpoet/lib/Config/Renderer.php b/mailpoet/lib/Config/Renderer.php index 4055b85c4a..132f79c306 100644 --- a/mailpoet/lib/Config/Renderer.php +++ b/mailpoet/lib/Config/Renderer.php @@ -100,7 +100,18 @@ class Renderer { public function render($template, $context = []) { try { - return $this->renderer->render($template, $context); + $loaded = $this->renderer->load($template); + + // schedule "after_javascript" block to be printed only after other scripts + if ($loaded->hasBlock('after_javascript')) { + $afterJs = $loaded->renderBlock('after_javascript', $context); + WPFunctions::get()->addAction('admin_print_footer_scripts', function () use ($afterJs): void { + // This is content is generated by Twig. + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped, WordPressDotOrg.sniffs.OutputEscaping.UnescapedOutputParameter + echo $afterJs; + }); + } + return $loaded->render($context); } catch (\RuntimeException $e) { throw new \Exception(sprintf( // translators: %1$s is the name of the render, %2$s the folder path, %3$s the error message. diff --git a/mailpoet/tests/integration/Config/RendererTest.php b/mailpoet/tests/integration/Config/RendererTest.php index 5b60d47c46..7953bb1d81 100644 --- a/mailpoet/tests/integration/Config/RendererTest.php +++ b/mailpoet/tests/integration/Config/RendererTest.php @@ -9,6 +9,9 @@ use MailPoet\Config\Renderer; use MailPoet\Config\RendererFactory; use MailPoetVendor\Twig\Environment as TwigEnvironment; use MailPoetVendor\Twig\Loader\FilesystemLoader as TwigFileSystem; +use MailPoetVendor\Twig\Source; +use MailPoetVendor\Twig\Template as TwigTemplate; +use MailPoetVendor\Twig\TemplateWrapper; class RendererTest extends \MailPoetTest { /** @var Renderer */ @@ -81,6 +84,31 @@ class RendererTest extends \MailPoetTest { } public function testItDelegatesRenderingToTwig() { + $env = Stub::makeEmpty(TwigEnvironment::class); + $template = new class($env) extends TwigTemplate { + public function getTemplateName() { + return 'non-existing-template.html'; + } + + public function render(array $context) { + return 'test render'; + } + + public function getDebugInfo() { + // must be implemented (abstract in parent) + return []; + } + + public function getSourceContext() { + // must be implemented (abstract in parent) + return new Source('', ''); + } + + protected function doDisplay(array $context, array $blocks = []) { + // must be implemented (abstract in parent) + } + }; + $renderer = Stub::construct( $this->renderer, [ @@ -91,16 +119,16 @@ class RendererTest extends \MailPoetTest { [ 'renderer' => Stub::makeEmpty(TwigEnvironment::class, [ - 'render' => Expected::atLeastOnce(function() { - return 'test render'; - }), + 'load' => Expected::atLeastOnce( + new TemplateWrapper($env, $template) + ), ], $this ), ] ); - expect($renderer->render('non-existing-template.html', ['somekey' => 'someval']))->equals('test render'); + expect($renderer->render(['somekey' => 'someval']))->equals('test render'); } public function _after() { diff --git a/mailpoet/views/layout.html b/mailpoet/views/layout.html index 2fe1ec1a38..2ff8cee905 100644 --- a/mailpoet/views/layout.html +++ b/mailpoet/views/layout.html @@ -236,5 +236,4 @@ Parsley.setLocale('mailpoet'); -<% block after_javascript %><% endblock %>