mirror of
https://github.com/phpbb/phpbb.git
synced 2025-06-28 06:08:52 +00:00
[ticket/10665] INCLUDEJS template tag
Implementing INLCUDEJS template tag in style classes PHPBB3-10665
This commit is contained in:
parent
2509853ca5
commit
a7d0ef90ea
3 changed files with 109 additions and 5 deletions
|
@ -288,7 +288,7 @@ class phpbb_style_template
|
||||||
return new phpbb_style_template_renderer_include($output_file, $this);
|
return new phpbb_style_template_renderer_include($output_file, $this);
|
||||||
}
|
}
|
||||||
|
|
||||||
$compile = new phpbb_style_template_compile($this->config['tpl_allow_php']);
|
$compile = new phpbb_style_template_compile($this->config['tpl_allow_php'], $this->locator, $this->phpbb_root_path);
|
||||||
|
|
||||||
if ($compile->compile_file_to_file($source_file, $output_file) !== false)
|
if ($compile->compile_file_to_file($source_file, $output_file) !== false)
|
||||||
{
|
{
|
||||||
|
@ -492,4 +492,23 @@ class phpbb_style_template
|
||||||
// use resource locator to find files
|
// use resource locator to find files
|
||||||
return $this->locator->get_first_file_location($templates, $return_default, $return_full_path);
|
return $this->locator->get_first_file_location($templates, $return_default, $return_full_path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Include JS file
|
||||||
|
*
|
||||||
|
* @param string $file file name
|
||||||
|
* @param bool $locate True if file needs to be located
|
||||||
|
*/
|
||||||
|
function _js_include($file, $locate = false)
|
||||||
|
{
|
||||||
|
// Locate file
|
||||||
|
if ($locate)
|
||||||
|
{
|
||||||
|
$file = $this->locator->get_first_file_location(array($file), true, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add HTML code
|
||||||
|
$code = '<script src="' . htmlspecialchars($file) . '"></script>';
|
||||||
|
$this->context->append_var('SCRIPTS', $code);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,6 +25,13 @@ stream_filter_register('phpbb_template', 'phpbb_style_template_filter');
|
||||||
*/
|
*/
|
||||||
class phpbb_style_template_compile
|
class phpbb_style_template_compile
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* Array of parameters to forward to template filter
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
private $filter_params;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Whether <!-- PHP --> tags are allowed
|
* Whether <!-- PHP --> tags are allowed
|
||||||
*
|
*
|
||||||
|
@ -32,14 +39,31 @@ class phpbb_style_template_compile
|
||||||
*/
|
*/
|
||||||
private $allow_php;
|
private $allow_php;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Style resource locator
|
||||||
|
*
|
||||||
|
* @var phpbb_style_resource_locator
|
||||||
|
*/
|
||||||
|
private $locator;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string phpBB root path
|
||||||
|
*/
|
||||||
|
private $phpbb_root_path;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor.
|
* Constructor.
|
||||||
*
|
*
|
||||||
* @param bool @allow_php Whether PHP code will be allowed in templates (inline PHP code, PHP tag and INCLUDEPHP tag)
|
* @param bool @allow_php Whether PHP code will be allowed in templates (inline PHP code, PHP tag and INCLUDEPHP tag)
|
||||||
|
* @param phpbb_style_resource_locator $locator Resource locator
|
||||||
|
* @param string $phpbb_root_path Path to phpBB root directory
|
||||||
*/
|
*/
|
||||||
public function __construct($allow_php)
|
public function __construct($allow_php, $locator, $phpbb_root_path)
|
||||||
{
|
{
|
||||||
|
$this->filter_params = array();
|
||||||
$this->allow_php = $allow_php;
|
$this->allow_php = $allow_php;
|
||||||
|
$this->locator = $locator;
|
||||||
|
$this->phpbb_root_path = $phpbb_root_path;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -116,7 +140,11 @@ class phpbb_style_template_compile
|
||||||
*/
|
*/
|
||||||
private function compile_stream_to_stream($source_stream, $dest_stream)
|
private function compile_stream_to_stream($source_stream, $dest_stream)
|
||||||
{
|
{
|
||||||
stream_filter_append($source_stream, 'phpbb_template', null, array('allow_php' => $this->allow_php));
|
$params = $this->filter_params;
|
||||||
|
$params['allow_php'] = $this->allow_php;
|
||||||
|
$params['locator'] = $this->locator;
|
||||||
|
$params['phpbb_root_path'] = $this->phpbb_root_path;
|
||||||
|
stream_filter_append($source_stream, 'phpbb_template', null, $params);
|
||||||
stream_copy_to_stream($source_stream, $dest_stream);
|
stream_copy_to_stream($source_stream, $dest_stream);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -75,6 +75,18 @@ class phpbb_style_template_filter extends php_user_filter
|
||||||
*/
|
*/
|
||||||
private $allow_php;
|
private $allow_php;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Resource locator.
|
||||||
|
*
|
||||||
|
* @var phpbb_template_locator
|
||||||
|
*/
|
||||||
|
private $locator;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string phpBB root path
|
||||||
|
*/
|
||||||
|
private $phpbb_root_path;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Stream filter
|
* Stream filter
|
||||||
*
|
*
|
||||||
|
@ -126,14 +138,16 @@ class phpbb_style_template_filter extends php_user_filter
|
||||||
/**
|
/**
|
||||||
* Initializer, called on creation.
|
* Initializer, called on creation.
|
||||||
*
|
*
|
||||||
* Get the allow_php option from params, which is passed
|
* Get the allow_php option, root directory and locator from params,
|
||||||
* to stream_filter_append.
|
* which are passed to stream_filter_append.
|
||||||
*/
|
*/
|
||||||
public function onCreate()
|
public function onCreate()
|
||||||
{
|
{
|
||||||
$this->chunk = '';
|
$this->chunk = '';
|
||||||
$this->in_php = false;
|
$this->in_php = false;
|
||||||
$this->allow_php = $this->params['allow_php'];
|
$this->allow_php = $this->params['allow_php'];
|
||||||
|
$this->locator = $this->params['locator'];
|
||||||
|
$this->phpbb_root_path = $this->params['phpbb_root_path'];
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -281,6 +295,10 @@ class phpbb_style_template_filter extends php_user_filter
|
||||||
return ($this->allow_php) ? '<?php ' . $this->compile_tag_include_php($matches[2]) . ' ?>' : '';
|
return ($this->allow_php) ? '<?php ' . $this->compile_tag_include_php($matches[2]) . ' ?>' : '';
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'INCLUDEJS':
|
||||||
|
return '<?php ' . $this->compile_tag_include_js($matches[2]) . ' ?>';
|
||||||
|
break;
|
||||||
|
|
||||||
case 'PHP':
|
case 'PHP':
|
||||||
if ($this->allow_php)
|
if ($this->allow_php)
|
||||||
{
|
{
|
||||||
|
@ -856,6 +874,45 @@ class phpbb_style_template_filter extends php_user_filter
|
||||||
return $tokens;
|
return $tokens;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compile INCLUDEJS tag
|
||||||
|
*
|
||||||
|
* @param string $tag_args Expression given with INCLUDEJS in source template
|
||||||
|
* @return string compiled template code
|
||||||
|
*/
|
||||||
|
private function compile_tag_include_js($tag_args)
|
||||||
|
{
|
||||||
|
// Process dynamic includes
|
||||||
|
if ($tag_args[0] == '{')
|
||||||
|
{
|
||||||
|
$var = $this->get_varref($tag_args, $is_expr);
|
||||||
|
if (!$is_expr)
|
||||||
|
{
|
||||||
|
return " \$_template->_js_include($var, true);";
|
||||||
|
}
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Locate file
|
||||||
|
$filename = $this->locator->get_first_file_location(array($tag_args), false, true);
|
||||||
|
|
||||||
|
if ($filename === false)
|
||||||
|
{
|
||||||
|
// File does not exist, find it during run time
|
||||||
|
return ' $_template->_js_include(\'' . addslashes($tag_args) . '\', true); ';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (substr($filename, 0, strlen($this->phpbb_root_path)) != $this->phpbb_root_path)
|
||||||
|
{
|
||||||
|
// Absolute path, include as is
|
||||||
|
return ' $_template->_js_include(\'' . addslashes($filename) . '\', false); ';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Relative path, remove root path from it
|
||||||
|
$filename = substr($filename, strlen($this->phpbb_root_path));
|
||||||
|
return ' global $phpbb_root_path; $_template->_js_include($phpbb_root_path . \'' . addslashes($filename) . '\', false); ';
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generates a reference to the given variable inside the given (possibly nested)
|
* Generates a reference to the given variable inside the given (possibly nested)
|
||||||
* block namespace. This is a string of the form:
|
* block namespace. This is a string of the form:
|
||||||
|
|
Loading…
Add table
Reference in a new issue