Commit b053fa82 by dev-meghraj

add old yii-ext twig renderer's function into this. and as per yii2's view…

add old yii-ext twig renderer's function into this. and as per yii2's view system changed so for now add simple directory of file based file loader for twig
parent dc720d9b
No related merge requests found
<?php
namespace yii\twig;
/**
* Twig view file loader class
*
* @author dev-mraj <dev.meghraj@gmail.com>
* @version 1.0.0
*/
class TwigSimpleFileLoader implements \Twig_LoaderInterface {
/**
* Path to directory where all file exists
* @param $view string
*/
private $dir;
public function __construct($dir){
$this->dir=$dir;
}
public function isFresh($name, $time){
return filemtime($this->getFilePath($name))<=$time;
}
public function getSource($name){
return file_get_contents($this->getFilePath($name));
}
public function getCacheKey($name){
return $this->getFilePath($name);
}
protected function getFilePath($name){
return $this->dir.'/'.$name;
}
}
\ No newline at end of file
......@@ -28,34 +28,99 @@ class ViewRenderer extends BaseViewRenderer
public $cachePath = '@runtime/Twig/cache';
/**
* @var array extentions list.
*/
public $extensions = [];
/**
* @var array Twig options
* @see http://twig.sensiolabs.org/doc/api.html#environment-options
*/
public $options = [];
/**
/**
* @var array Objects or static classes
* Keys of array are names to call in template, values - objects or names of static class as string
* Example: array('html'=>'\yii\helpers\Html')
* Than in template: {{ html.link('Login', 'site/login') }}
*/
public $globals = array();
/**
* @var array Custom functions
* Keys of array are names to call in template, values - names of functions or static methods of some class
* Example: array('rot13'=>'str_rot13', 'link'=>'\yii\helpers\Html::link')
* Than in template: {{ rot13('test') }} or {{ link('Login', 'site/login') }}
*/
public $functions = array();
/**
* @var array Custom filters
* Keys of array are names to call in template, values - names of functions or static methods of some class
* Example: array('rot13'=>'str_rot13', 'jsonEncode'=>'\yii\helpers\Json::encode')
* Then in template: {{ 'test'|rot13 }} or {{ model|jsonEncode }}
*/
public $filters = array();
/**
* @var array Custom extensions
* Example: array('Twig_Extension_Sandbox', 'Twig_Extension_Text')
*/
public $extensions = array();
/**
* @var array Twig lexer options
* @see http://twig.sensiolabs.org/doc/recipes.html#customizing-the-syntax
* Example: Smarty-like syntax
* array(
* 'tag_comment' => array('{*', '*}'),
* 'tag_block' => array('{', '}'),
* 'tag_variable' => array('{$', '}')
* )
*/
public $lexerOptions = array();
/**
* @var \Twig_Environment
*/
public $twig;
public function init()
{
$loader = new \Twig_Loader_String();
$this->twig = new \Twig_Environment($loader, array_merge([
$this->twig = new \Twig_Environment(null, array_merge([
'cache' => Yii::getAlias($this->cachePath),
'auto_reload' => true,
'charset' => Yii::$app->charset,
], $this->options));
// Adding custom extensions
if (!empty($this->extensions)) {
foreach ($this->extensions as $extension) {
$this->twig->addExtension(new $extension());
}
}
// Adding custom globals (objects or static classes)
if (!empty($this->globals)) {
$this->addGlobals($this->globals);
}
// Adding custom functions
if (!empty($this->functions)) {
$this->addFunctions($this->functions);
}
// Adding custom filters
if (!empty($this->filters)) {
$this->addFilters($this->filters);
}
// Adding custom extensions
if (!empty($this->extensions)) {
$this->addExtensions($this->extensions);
}
// Change lexer syntax
if (!empty($this->lexerOptions)) {
$this->setLexerOptions($this->lexerOptions);
}
// Adding global 'void' function (usage: {{void(App.clientScript.registerScriptFile(...))}})
$this->twig->addFunction('void', new \Twig_Function_Function(function($argument){
}));
$this->twig->addFunction('path', new \Twig_Function_Function(function ($path, $args = []) {
return Html::url(array_merge([$path], $args));
......@@ -64,6 +129,7 @@ class ViewRenderer extends BaseViewRenderer
$this->twig->addGlobal('app', \Yii::$app);
}
/**
* Renders a view file.
*
......@@ -79,6 +145,95 @@ class ViewRenderer extends BaseViewRenderer
public function render($view, $file, $params)
{
$this->twig->addGlobal('this', $view);
return $this->twig->render(file_get_contents($file), $params);
$this->twig->setLoader(new TwigSimpleFileLoader(dirname($file)));
return $this->twig->render(pathinfo($file,PATHINFO_BASENAME), $params);
}
/**
* Adds global objects or static classes
* @param array $globals @see self::$globals
*/
public function addGlobals($globals)
{
foreach ($globals as $name => $value) {
if (!is_object($value)) {
$value = new ViewRendererStaticClassProxy($value);
}
$this->twig->addGlobal($name, $value);
}
}
/**
* Adds custom functions
* @param array $functions @see self::$functions
*/
public function addFunctions($functions)
{
$this->_addCustom('Function', $functions);
}
/**
* Adds custom filters
* @param array $filters @see self::$filters
*/
public function addFilters($filters)
{
$this->_addCustom('Filter', $filters);
}
/**
* Adds custom extensions
* @param array $extensions @see self::$extensions
*/
public function addExtensions($extensions)
{
foreach ($extensions as $extName) {
$this->twig->addExtension(new $extName());
}
}
/**
* Sets Twig lexer options to change templates syntax
* @param array $options @see self::$lexerOptions
*/
public function setLexerOptions($options)
{
$lexer = new \Twig_Lexer($this->twig, $options);
$this->twig->setLexer($lexer);
}
/**
* Adds custom function or filter
* @param string $classType 'Function' or 'Filter'
* @param array $elements Parameters of elements to add
* @throws \Exception
*/
private function _addCustom($classType, $elements)
{
$classFunction = 'Twig_'.$classType.'_Function';
foreach ($elements as $name => $func) {
$twigElement = null;
switch ($func) {
// Just a name of function
case is_string($func):
$twigElement = new $classFunction($func);
break;
// Name of function + options array
case is_array($func) && is_string($func[0]) && isset($func[1]) && is_array($func[1]):
$twigElement = new $classFunction($func[0], $func[1]);
break;
}
if ($twigElement !== null) {
$this->twig->{'add'.$classType}($name, $twigElement);
} else {
throw new \Exception(Yii::t('yiiext',
'Incorrect options for "{classType}" [{name}]',
array('{classType}'=>$classType, '{name}'=>$name)));
}
}
}
}
<?php
namespace yii\twig;
/**
* Class-proxy for static classes
* Needed because you can't pass static class to Twig other way
*
* @author Leonid Svyatov <leonid@svyatov.ru>
* @version 1.0.0
*/
class ViewRendererStaticClassProxy
{
private $_staticClassName;
public function __construct($staticClassName) {
$this->_staticClassName = $staticClassName;
}
public function __get($property)
{
$class = new \ReflectionClass($this->_staticClassName);
return $class->getStaticPropertyValue($property);
}
public function __set($property, $value)
{
$class = new \ReflectionClass($this->_staticClassName);
$class->setStaticPropertyValue($property, $value);
return $value;
}
public function __call($method, $arguments)
{
return call_user_func_array(array($this->_staticClassName, $method), $arguments);
}
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment