aboutsummaryrefslogtreecommitdiffstats
path: root/phpBB/phpbb/template/twig/environment.php
diff options
context:
space:
mode:
Diffstat (limited to 'phpBB/phpbb/template/twig/environment.php')
-rw-r--r--phpBB/phpbb/template/twig/environment.php138
1 files changed, 132 insertions, 6 deletions
diff --git a/phpBB/phpbb/template/twig/environment.php b/phpBB/phpbb/template/twig/environment.php
index 476ffd935e..ac4b16e457 100644
--- a/phpBB/phpbb/template/twig/environment.php
+++ b/phpBB/phpbb/template/twig/environment.php
@@ -13,17 +13,28 @@
namespace phpbb\template\twig;
+use phpbb\template\assets_bag;
+
class environment extends \Twig_Environment
{
/** @var \phpbb\config\config */
protected $phpbb_config;
+ /** @var \phpbb\filesystem\filesystem */
+ protected $filesystem;
+
/** @var \phpbb\path_helper */
protected $phpbb_path_helper;
+ /** @var \Symfony\Component\DependencyInjection\ContainerInterface */
+ protected $container;
+
/** @var \phpbb\extension\manager */
protected $extension_manager;
+ /** @var \phpbb\event\dispatcher_interface */
+ protected $phpbb_dispatcher;
+
/** @var string */
protected $phpbb_root_path;
@@ -33,26 +44,43 @@ class environment extends \Twig_Environment
/** @var array **/
protected $namespace_look_up_order = array('__main__');
+ /** @var assets_bag */
+ protected $assets_bag;
+
/**
* Constructor
*
* @param \phpbb\config\config $phpbb_config The phpBB configuration
+ * @param \phpbb\filesystem\filesystem $filesystem
* @param \phpbb\path_helper $path_helper phpBB path helper
+ * @param string $cache_path The path to the cache directory
* @param \phpbb\extension\manager $extension_manager phpBB extension manager
* @param \Twig_LoaderInterface $loader Twig loader interface
+ * @param \phpbb\event\dispatcher_interface $phpbb_dispatcher Event dispatcher object
* @param array $options Array of options to pass to Twig
*/
- public function __construct($phpbb_config, \phpbb\path_helper $path_helper, \phpbb\extension\manager $extension_manager = null, \Twig_LoaderInterface $loader = null, $options = array())
+ public function __construct(\phpbb\config\config $phpbb_config, \phpbb\filesystem\filesystem $filesystem, \phpbb\path_helper $path_helper, $cache_path, \phpbb\extension\manager $extension_manager = null, \Twig_LoaderInterface $loader = null, \phpbb\event\dispatcher_interface $phpbb_dispatcher = null, $options = array())
{
$this->phpbb_config = $phpbb_config;
+ $this->filesystem = $filesystem;
$this->phpbb_path_helper = $path_helper;
$this->extension_manager = $extension_manager;
+ $this->phpbb_dispatcher = $phpbb_dispatcher;
$this->phpbb_root_path = $this->phpbb_path_helper->get_phpbb_root_path();
$this->web_root_path = $this->phpbb_path_helper->get_web_root_path();
- return parent::__construct($loader, $options);
+ $this->assets_bag = new assets_bag();
+
+ $options = array_merge(array(
+ 'cache' => (defined('IN_INSTALL')) ? false : $cache_path,
+ 'debug' => false,
+ 'auto_reload' => (bool) $this->phpbb_config['load_tplcompile'],
+ 'autoescape' => false,
+ ), $options);
+
+ parent::__construct($loader, $options);
}
/**
@@ -78,16 +106,26 @@ class environment extends \Twig_Environment
}
/**
- * Get the phpBB root path
- *
- * @return string
- */
+ * Get the phpBB root path
+ *
+ * @return string
+ */
public function get_phpbb_root_path()
{
return $this->phpbb_root_path;
}
/**
+ * Get the filesystem object
+ *
+ * @return \phpbb\filesystem\filesystem
+ */
+ public function get_filesystem()
+ {
+ return $this->filesystem;
+ }
+
+ /**
* Get the web root path
*
* @return string
@@ -108,6 +146,16 @@ class environment extends \Twig_Environment
}
/**
+ * Gets the assets bag
+ *
+ * @return assets_bag
+ */
+ public function get_assets_bag()
+ {
+ return $this->assets_bag;
+ }
+
+ /**
* Get the namespace look up order
*
* @return array
@@ -131,6 +179,84 @@ class environment extends \Twig_Environment
}
/**
+ * {@inheritdoc}
+ */
+ public function render($name, array $context = [])
+ {
+ return $this->display_with_assets($name, $context);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function display($name, array $context = [])
+ {
+ echo $this->display_with_assets($name, $context);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ private function display_with_assets($name, array $context = [])
+ {
+ $placeholder_salt = unique_id();
+
+ if (array_key_exists('definition', $context))
+ {
+ $context['definition']->set('SCRIPTS', '__SCRIPTS_' . $placeholder_salt . '__');
+ $context['definition']->set('STYLESHEETS', '__STYLESHEETS_' . $placeholder_salt . '__');
+ }
+
+ /**
+ * Allow changing the template output stream before rendering
+ *
+ * @event core.twig_environment_render_template_before
+ * @var array context Array with template variables
+ * @var string name The template name
+ * @since 3.2.1-RC1
+ */
+ if ($this->phpbb_dispatcher)
+ {
+ $vars = array('context', 'name');
+ extract($this->phpbb_dispatcher->trigger_event('core.twig_environment_render_template_before', compact($vars)));
+ }
+
+ $output = parent::render($name, $context);
+
+ /**
+ * Allow changing the template output stream after rendering
+ *
+ * @event core.twig_environment_render_template_after
+ * @var array context Array with template variables
+ * @var string name The template name
+ * @var string output Rendered template output stream
+ * @since 3.2.1-RC1
+ */
+ if ($this->phpbb_dispatcher)
+ {
+ $vars = array('context', 'name', 'output');
+ extract($this->phpbb_dispatcher->trigger_event('core.twig_environment_render_template_after', compact($vars)));
+ }
+
+ return $this->inject_assets($output, $placeholder_salt);
+ }
+
+ /**
+ * Injects the assets (from INCLUDECSS/JS) in the output.
+ *
+ * @param string $output
+ *
+ * @return string
+ */
+ private function inject_assets($output, $placeholder_salt)
+ {
+ $output = str_replace('__STYLESHEETS_' . $placeholder_salt . '__', $this->assets_bag->get_stylesheets_content(), $output);
+ $output = str_replace('__SCRIPTS_' . $placeholder_salt . '__', $this->assets_bag->get_scripts_content(), $output);
+
+ return $output;
+ }
+
+ /**
* Loads a template by name.
*
* @param string $name The template name