From 799488a14a16fa1ec22909dec28503a09eeeda55 Mon Sep 17 00:00:00 2001 From: ADmad Date: Thu, 2 Apr 2020 19:03:03 +0530 Subject: [PATCH] Use Twig function to call CakePHP helpers. This avoids having to preload helpers as with current usage and also avoids having to add |raw at the end of calls to prevent escaping. --- src/Twig/Extension/ViewExtension.php | 57 +++++++++++++++++++ src/View/TwigView.php | 1 + tests/TestCase/View/TwigViewTest.php | 13 +++++ .../src/View/Helper/TestSecondHelper.php | 5 ++ .../templates/element/element_with_var.twig | 1 + tests/test_app/templates/helper_test.twig | 2 + 6 files changed, 79 insertions(+) create mode 100644 src/Twig/Extension/ViewExtension.php create mode 100644 tests/test_app/templates/element/element_with_var.twig create mode 100644 tests/test_app/templates/helper_test.twig diff --git a/src/Twig/Extension/ViewExtension.php b/src/Twig/Extension/ViewExtension.php new file mode 100644 index 0000000..1021811 --- /dev/null +++ b/src/Twig/Extension/ViewExtension.php @@ -0,0 +1,57 @@ +{$helper}->{$method}(...$args); + }, + ['needs_context' => true, 'is_variadic' => true, 'is_safe' => ['all']] + ), + ]; + } + + /** + * Get extension name. + * + * @return string + */ + public function getName(): string + { + return 'twigview-view'; + } +} diff --git a/src/View/TwigView.php b/src/View/TwigView.php index d8db38f..6ac4688 100644 --- a/src/View/TwigView.php +++ b/src/View/TwigView.php @@ -198,6 +198,7 @@ protected function initializeExtensions(): void $this->twig->addExtension(new Extension\StringsExtension()); $this->twig->addExtension(new Extension\TimeExtension()); $this->twig->addExtension(new Extension\UtilsExtension()); + $this->twig->addExtension(new Extension\ViewExtension()); // Markdown extension $markdownEngine = $this->getConfig('markdown.engine'); diff --git a/tests/TestCase/View/TwigViewTest.php b/tests/TestCase/View/TwigViewTest.php index 6dcfdf4..afc29ef 100644 --- a/tests/TestCase/View/TwigViewTest.php +++ b/tests/TestCase/View/TwigViewTest.php @@ -122,4 +122,17 @@ public function testThrowSyntaxError() $this->view->render('syntaxerror', false); } + + public function testHelperCall() + { + $view = new AppView(null, null, null, [ + 'viewVars' => ['elementVar' => 'var echoed inside element'], + ]); + $view->loadHelper('Text'); + + $output = $view->render('helper_test', false); + + $expected = "var echoed inside element\n

I love CakePHP

\n"; + $this->assertSame($expected, $output); + } } diff --git a/tests/test_app/src/View/Helper/TestSecondHelper.php b/tests/test_app/src/View/Helper/TestSecondHelper.php index 20bdb0e..de7c851 100644 --- a/tests/test_app/src/View/Helper/TestSecondHelper.php +++ b/tests/test_app/src/View/Helper/TestSecondHelper.php @@ -27,4 +27,9 @@ public function bogus() { throw new MissingSomethingException('Something is missing'); } + + public function useElement() + { + return $this->_View->element('element_with_var'); + } } diff --git a/tests/test_app/templates/element/element_with_var.twig b/tests/test_app/templates/element/element_with_var.twig new file mode 100644 index 0000000..a52eda4 --- /dev/null +++ b/tests/test_app/templates/element/element_with_var.twig @@ -0,0 +1 @@ +{{ elementVar }} \ No newline at end of file diff --git a/tests/test_app/templates/helper_test.twig b/tests/test_app/templates/helper_test.twig new file mode 100644 index 0000000..41eda79 --- /dev/null +++ b/tests/test_app/templates/helper_test.twig @@ -0,0 +1,2 @@ +{{ helper_TestSecond_useElement() }} +{{ helper_Text_autoParagraph('I love CakePHP') }} \ No newline at end of file