From a35cf5a8304095e5970d0b69ec9fcc2b19493901 Mon Sep 17 00:00:00 2001 From: Andy Miller Date: Tue, 24 Sep 2019 18:10:02 -0600 Subject: [PATCH] Added a new `{% cache %}` tag eliminating need for `twigcache` extension --- CHANGELOG.md | 2 + .../Grav/Common/Twig/Node/TwigNodeCache.php | 61 +++++++++++++++++++ .../Twig/TokenParser/TwigTokenParserCache.php | 61 +++++++++++++++++++ system/src/Grav/Common/Twig/TwigExtension.php | 2 + 4 files changed, 126 insertions(+) create mode 100644 system/src/Grav/Common/Twig/Node/TwigNodeCache.php create mode 100644 system/src/Grav/Common/Twig/TokenParser/TwigTokenParserCache.php diff --git a/CHANGELOG.md b/CHANGELOG.md index 6159fd543..c0ad55103 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ # v1.7.0-beta.9 ## mm/dd/2019 +1. [](#new) + * Added a new `{% cache %}` tag eliminating need for `twigcache` extension. 1. [](#improved) * Improved blueprint initialization in Flex Objects (fixes content aware fields) * Improved Flex FolderStorage class to better hide storage specific logic diff --git a/system/src/Grav/Common/Twig/Node/TwigNodeCache.php b/system/src/Grav/Common/Twig/Node/TwigNodeCache.php new file mode 100644 index 000000000..56bd9ccf9 --- /dev/null +++ b/system/src/Grav/Common/Twig/Node/TwigNodeCache.php @@ -0,0 +1,61 @@ + $key, 'body' => $body, 'lifetime' => $lifetime), array(), $lineno, $tag); + } + + /** + * {@inheritDoc} + */ + public function compile(Compiler $compiler) + { + + $compiler + ->addDebugInfo($this) + ->write("\$cache = \\Grav\\Common\\Grav::instance()['cache'];\n") + ->write("\$key = \"twigcache-\" . ") + ->subcompile($this->getNode('key')) + ->write(";\n") + ->write("\$lifetime = ") + ->subcompile($this->getNode('lifetime')) + ->write(";\n") + ->write("\$cache_body = \$cache->fetch(\$key);\n") + ->write("if (\$cache_body === false) {\n") + ->indent() + ->write("ob_start();\n") + ->indent() + ->subcompile($this->getNode('body')) + ->outdent() + ->write("\n") + ->write("\$cache_body = ob_get_clean();\n") + ->write("\$cache->save(\$key, \$cache_body, \$lifetime);\n") + ->outdent() + ->write("}\n") + ->write("echo \$cache_body;\n") + ; + } +} diff --git a/system/src/Grav/Common/Twig/TokenParser/TwigTokenParserCache.php b/system/src/Grav/Common/Twig/TokenParser/TwigTokenParserCache.php new file mode 100644 index 000000000..ae331712c --- /dev/null +++ b/system/src/Grav/Common/Twig/TokenParser/TwigTokenParserCache.php @@ -0,0 +1,61 @@ +getLine(); + $stream = $this->parser->getStream(); + $key = $this->parser->getExpressionParser()->parseExpression(); + $lifetime =$this->parser->getExpressionParser()->parseExpression(); + + $stream->expect(Token::BLOCK_END_TYPE); + $body = $this->parser->subparse(array($this, 'decideCacheEnd'), true); + $stream->expect(Token::BLOCK_END_TYPE); + + return new TwigNodeCache($key, $lifetime, $body, $lineno, $this->getTag()); + } + + /** + * Decide if current token marks end of cache block. + * + * @param Token $token + * @return bool + */ + public function decideCacheEnd(Token $token) + { + return $token->test('endcache'); + } + /** + * {@inheritDoc} + */ + public function getTag() + { + return 'cache'; + } + + +} diff --git a/system/src/Grav/Common/Twig/TwigExtension.php b/system/src/Grav/Common/Twig/TwigExtension.php index 4456c2c56..dae938db9 100644 --- a/system/src/Grav/Common/Twig/TwigExtension.php +++ b/system/src/Grav/Common/Twig/TwigExtension.php @@ -18,6 +18,7 @@ use Grav\Common\Page\Collection; use Grav\Common\Page\Media; use Grav\Common\Scheduler\Cron; use Grav\Common\Security; +use Grav\Common\Twig\TokenParser\TwigTokenParserCache; use Grav\Common\Twig\TokenParser\TwigTokenParserRender; use Grav\Common\Twig\TokenParser\TwigTokenParserScript; use Grav\Common\Twig\TokenParser\TwigTokenParserStyle; @@ -208,6 +209,7 @@ class TwigExtension extends AbstractExtension implements GlobalsInterface new TwigTokenParserStyle(), new TwigTokenParserMarkdown(), new TwigTokenParserSwitch(), + new TwigTokenParserCache(), ]; }