aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNathan Guse <nathaniel.guse@gmail.com>2013-06-24 11:18:29 -0500
committerNathan Guse <nathaniel.guse@gmail.com>2013-06-24 11:18:29 -0500
commit3bd281fa2784048e29c6004b90bcd203733e4e32 (patch)
treef3a66a3de8d2f1eb69da16f3e968e7f87d1673e1
parent62fda07dd4f0ded73d16e9164b377c5e90fd4fd0 (diff)
downloadforums-3bd281fa2784048e29c6004b90bcd203733e4e32.tar
forums-3bd281fa2784048e29c6004b90bcd203733e4e32.tar.gz
forums-3bd281fa2784048e29c6004b90bcd203733e4e32.tar.bz2
forums-3bd281fa2784048e29c6004b90bcd203733e4e32.tar.xz
forums-3bd281fa2784048e29c6004b90bcd203733e4e32.zip
[feature/twig] Event template tag
PHPBB3-11598
-rw-r--r--phpBB/includes/template/twig/environment.php29
-rw-r--r--phpBB/includes/template/twig/node/event.php44
-rw-r--r--phpBB/includes/template/twig/tokenparser/event.php58
-rw-r--r--phpBB/includes/template/twig/twig.php6
4 files changed, 97 insertions, 40 deletions
diff --git a/phpBB/includes/template/twig/environment.php b/phpBB/includes/template/twig/environment.php
index 1494b3ab28..b3e1ed9295 100644
--- a/phpBB/includes/template/twig/environment.php
+++ b/phpBB/includes/template/twig/environment.php
@@ -17,6 +17,35 @@ if (!defined('IN_PHPBB'))
class phpbb_template_twig_environment extends Twig_Environment
{
+ /** @var array */
+ protected $phpbbExtensions;
+
+ /**
+ * Gets the cache filename for a given template.
+ *
+ * @param string $name The template name
+ *
+ * @return string The cache file name
+ */
+ public function getCacheFilename($name)
+ {
+ if (false === $this->cache) {
+ return false;
+ }
+
+ return $this->getCache() . '/' . preg_replace('#[^a-zA-Z0-9_/]#', '_', $name) . '.php';
+ }
+
+ public function set_phpbb_extensions($extensions)
+ {
+ $this->phpbbExtensions = $extensions;
+ }
+
+ public function get_phpbb_extensions()
+ {
+ return $this->phpbbExtensions;
+ }
+
/**
* recursive helper to set variables into $context so that Twig can properly fetch them for display
*
diff --git a/phpBB/includes/template/twig/node/event.php b/phpBB/includes/template/twig/node/event.php
new file mode 100644
index 0000000000..c76c727ba5
--- /dev/null
+++ b/phpBB/includes/template/twig/node/event.php
@@ -0,0 +1,44 @@
+<?php
+/**
+*
+* @package phpBB3
+* @copyright (c) 2013 phpBB Group
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+*
+*/
+
+class phpbb_template_twig_node_event extends Twig_Node
+{
+ protected $environment;
+
+ public function __construct(Twig_Node_Expression $expr, phpbb_template_twig_environment $environment, $lineno, $tag = null)
+ {
+ $this->environment = $environment;
+
+ parent::__construct(array('expr' => $expr), array(), $lineno, $tag);
+ }
+
+ /**
+ * Compiles the node to PHP.
+ *
+ * @param Twig_Compiler A Twig_Compiler instance
+ */
+ public function compile(Twig_Compiler $compiler)
+ {
+ $compiler->addDebugInfo($this);
+
+ $compiler->indent();
+
+ $location = $this->getNode('expr')->getAttribute('name');
+
+ foreach ($this->environment->get_phpbb_extensions() as $ext_namespace => $ext_path)
+ {
+ $ext_namespace = str_replace('/', '_', $ext_namespace);
+
+ if ($this->environment->getLoader()->exists('@' . $ext_namespace . '/' . $location . '.html'))
+ {
+ $compiler->write("\$this->env->loadTemplate('@" . $ext_namespace . "/" . $location . ".html')->display(\$context);\n");
+ }
+ }
+ }
+}
diff --git a/phpBB/includes/template/twig/tokenparser/event.php b/phpBB/includes/template/twig/tokenparser/event.php
index 27a8350af1..03810454ed 100644
--- a/phpBB/includes/template/twig/tokenparser/event.php
+++ b/phpBB/includes/template/twig/tokenparser/event.php
@@ -1,49 +1,29 @@
<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- * (c) 2009 Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
/**
- * Includes a template.
- *
- * <pre>
- * {% include 'header.html' %}
- * Body
- * {% include 'footer.html' %}
- * </pre>
- */
-class phpbb_template_twig_tokenparser_event extends Twig_TokenParser_Include
+*
+* @package phpBB3
+* @copyright (c) 2013 phpBB Group
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+*
+*/
+
+class phpbb_template_twig_tokenparser_event extends Twig_TokenParser
{
- protected function parseArguments()
+ /**
+ * Parses a token and returns a node.
+ *
+ * @param Twig_Token $token A Twig_Token instance
+ *
+ * @return Twig_NodeInterface A Twig_NodeInterface instance
+ */
+ public function parse(Twig_Token $token)
{
- $stream = $this->parser->getStream();
-
- $ignoreMissing = true;
-
- $variables = null;
- if ($stream->test(Twig_Token::NAME_TYPE, 'with')) {
- $stream->next();
-
- $variables = $this->parser->getExpressionParser()->parseExpression();
- }
-
- $only = false;
- if ($stream->test(Twig_Token::NAME_TYPE, 'only')) {
- $stream->next();
-
- $only = true;
- }
+ $expr = $this->parser->getExpressionParser()->parseExpression();
+ $stream = $this->parser->getStream();
$stream->expect(Twig_Token::BLOCK_END_TYPE);
- return array($variables, $only, $ignoreMissing);
+ return new phpbb_template_twig_node_event($expr, $this->parser->getEnvironment(), $token->getLine(), $this->getTag());
}
/**
diff --git a/phpBB/includes/template/twig/twig.php b/phpBB/includes/template/twig/twig.php
index 358467d50d..d0b8d2eda1 100644
--- a/phpBB/includes/template/twig/twig.php
+++ b/phpBB/includes/template/twig/twig.php
@@ -125,6 +125,9 @@ class phpbb_template_twig implements phpbb_template
'autoescape' => false,
));
+ // Set enabled phpbb extensions
+ $this->twig->set_phpbb_extensions($this->extension_manager->all_enabled());
+
// Clear previous cache files (while WIP)
// @todo remove
if (is_dir($this->cachepath))
@@ -182,7 +185,8 @@ class phpbb_template_twig implements phpbb_template
{
if (is_dir($ext_path . 'styles/' . $style_name))
{
- $this->twig->getLoader()->addPath($ext_path . 'styles/' . $style_name, $ext_namespace);
+ // namespaces cannot contain /
+ $this->twig->getLoader()->addPath($ext_path . 'styles/' . $style_name . '/template', str_replace('/', '_', $ext_namespace));
}
}
}