[feature/twig] Event template tag

PHPBB3-11598
This commit is contained in:
Nathan Guse 2013-06-24 11:18:29 -05:00
parent 62fda07dd4
commit 3bd281fa27
4 changed files with 97 additions and 40 deletions

View file

@ -17,6 +17,35 @@ if (!defined('IN_PHPBB'))
class phpbb_template_twig_environment extends Twig_Environment 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 * recursive helper to set variables into $context so that Twig can properly fetch them for display
* *

View file

@ -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");
}
}
}
}

View file

@ -1,49 +1,29 @@
<?php <?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> * @package phpBB3
* {% include 'header.html' %} * @copyright (c) 2013 phpBB Group
* Body * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
* {% include 'footer.html' %} *
* </pre>
*/ */
class phpbb_template_twig_tokenparser_event extends Twig_TokenParser_Include
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(); $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); $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());
} }
/** /**

View file

@ -125,6 +125,9 @@ class phpbb_template_twig implements phpbb_template
'autoescape' => false, 'autoescape' => false,
)); ));
// Set enabled phpbb extensions
$this->twig->set_phpbb_extensions($this->extension_manager->all_enabled());
// Clear previous cache files (while WIP) // Clear previous cache files (while WIP)
// @todo remove // @todo remove
if (is_dir($this->cachepath)) if (is_dir($this->cachepath))
@ -182,7 +185,8 @@ class phpbb_template_twig implements phpbb_template
{ {
if (is_dir($ext_path . 'styles/' . $style_name)) 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));
} }
} }
} }