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 @@ +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 @@ - * {% include 'header.html' %} - * Body - * {% include 'footer.html' %} - * - */ -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) { + $expr = $this->parser->getExpressionParser()->parseExpression(); + $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; - } - $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)); } } }