1
0
mirror of https://github.com/phpbb/phpbb.git synced 2025-05-26 01:04:10 +02:00

[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
{
/** @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
*

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
/*
* 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)
{
$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());
}
/**

View File

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