From 1028899fa3713d20b5997ae9a7d106582c211cbf Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Mon, 30 Dec 2013 00:45:24 +0100 Subject: [PATCH] Fixes #1609: Adjusted code style, added some docs --- docs/guide/template.md | 38 ++++++++ extensions/yii/twig/CHANGELOG.md | 3 +- extensions/yii/twig/README.md | 1 + extensions/yii/twig/TwigSimpleFileLoader.php | 28 +++--- extensions/yii/twig/ViewRenderer.php | 107 ++++++++++----------- .../yii/twig/ViewRendererStaticClassProxy.php | 3 +- 6 files changed, 106 insertions(+), 74 deletions(-) diff --git a/docs/guide/template.md b/docs/guide/template.md index b4afd33..e46beb3 100644 --- a/docs/guide/template.md +++ b/docs/guide/template.md @@ -21,6 +21,9 @@ component's behavior: 'class' => 'yii\twig\ViewRenderer', //'cachePath' => '@runtime/Twig/cache', //'options' => [], /* Array of twig options */ + 'globals' => ['html' => '\yii\helpers\Html'], + * Example: + * Than in template: {{ html.link('Login', 'site/login') }} ], // ... ], @@ -67,6 +70,41 @@ Within Twig templates, you can also make use of these variables: - `app`, which equates to `\Yii::$app` - `this`, which equates to the current `View` object +### Globals + +You can add global helpers or values via config's `globals`. It allows both using Yii helpers and setting your own +values: + +```php +'globals' => [ + 'html' => '\yii\helpers\Html', + 'name' => 'Carsten', +], +``` + +Then in your template you can use it the following way: + +``` +Hello, {{name}}! {{ html.link('Please login', 'site/login') }}. +``` + +### Additional filters + +Additional filters may be added via config's `filters` option: + +```php +'filters' => [ + 'jsonEncode' => '\yii\helpers\Json::encode', +], +``` + +Then in the template you can use + +``` +{{ model|jsonEncode }} +``` + + Smarty ------ diff --git a/extensions/yii/twig/CHANGELOG.md b/extensions/yii/twig/CHANGELOG.md index 85ea863..7c9a377 100644 --- a/extensions/yii/twig/CHANGELOG.md +++ b/extensions/yii/twig/CHANGELOG.md @@ -4,8 +4,7 @@ Yii Framework 2 twig extension Change Log 2.0.0 beta under development ---------------------------- -- no changes in this release. -- Add File based Twig loader for better caching and usability of twig's file based function +- Add File based Twig loader for better caching and usability of twig's file based function (dev-mraj, samdark) 2.0.0 alpha, December 1, 2013 ----------------------------- diff --git a/extensions/yii/twig/README.md b/extensions/yii/twig/README.md index 8099e1c..bc04d92 100644 --- a/extensions/yii/twig/README.md +++ b/extensions/yii/twig/README.md @@ -15,6 +15,7 @@ return [ 'class' => 'yii\twig\ViewRenderer', //'cachePath' => '@runtime/Twig/cache', //'options' => [], /* Array of twig options */ + // ... see ViewRenderer for more options ], ], ], diff --git a/extensions/yii/twig/TwigSimpleFileLoader.php b/extensions/yii/twig/TwigSimpleFileLoader.php index 2ffaddd..281d465 100644 --- a/extensions/yii/twig/TwigSimpleFileLoader.php +++ b/extensions/yii/twig/TwigSimpleFileLoader.php @@ -14,21 +14,20 @@ namespace yii\twig; * Twig view file loader class. * * @author dev-mraj - * @version 1.0.0 */ -class TwigSimpleFileLoader implements \Twig_LoaderInterface { - +class TwigSimpleFileLoader implements \Twig_LoaderInterface +{ /** * @var string Path to directory */ private $_dir; - /* - * @param @dir string path to directory + /** + * @param string $dir path to directory */ public function __construct($dir) { - $this->_dir=$dir; + $this->_dir = $dir; } /** @@ -36,17 +35,17 @@ class TwigSimpleFileLoader implements \Twig_LoaderInterface { * * @param $name string file name to check * @param $time int timestamp to compare with - * @return bool true if file is still fresh and not changes, false otherwise + * @return boolean true if file is still fresh and not changes, false otherwise */ public function isFresh($name, $time) { - return filemtime($this->getFilePath($name))<=$time; + return filemtime($this->getFilePath($name)) <= $time; } /** - * get the source of given file name + * Get the source of given file name * - * @param $name string file name + * @param string $name file name * @return string contents of given file name */ public function getSource($name) @@ -55,8 +54,8 @@ class TwigSimpleFileLoader implements \Twig_LoaderInterface { } /** - * get a unique key that can represent this file uniquely among other files. - * @param $name + * Get unique key that can represent this file uniquely among other files. + * @param string $name * @return string */ public function getCacheKey($name) @@ -66,11 +65,10 @@ class TwigSimpleFileLoader implements \Twig_LoaderInterface { /** * internally used to get absolute path of given file name - * @param $name string file name + * @param string $name file name * @return string absolute path of file */ protected function getFilePath($name){ - return $this->_dir.'/'.$name; + return $this->_dir . '/' . $name; } - } \ No newline at end of file diff --git a/extensions/yii/twig/ViewRenderer.php b/extensions/yii/twig/ViewRenderer.php index 05f66d7..9348c30 100644 --- a/extensions/yii/twig/ViewRenderer.php +++ b/extensions/yii/twig/ViewRenderer.php @@ -13,7 +13,6 @@ use Yii; use yii\base\View; use yii\base\ViewRenderer as BaseViewRenderer; use yii\helpers\Html; -use yii\twig\TwigSimpleFileLoader; /** * TwigViewRenderer allows you to use Twig templates in views. @@ -37,7 +36,7 @@ class ViewRenderer extends BaseViewRenderer /** * @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') + * Example: ['html' => '\yii\helpers\Html'] * Than in template: {{ html.link('Login', 'site/login') }} */ public $globals = []; @@ -45,7 +44,7 @@ class ViewRenderer extends BaseViewRenderer /** * @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') + * Example: ['rot13' => 'str_rot13', 'link' => '\yii\helpers\Html::link'] * Than in template: {{ rot13('test') }} or {{ link('Login', 'site/login') }} */ public $functions = []; @@ -53,14 +52,14 @@ class ViewRenderer extends BaseViewRenderer /** * @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') + * Example: ['rot13' => 'str_rot13', 'jsonEncode' => '\yii\helpers\Json::encode'] * Then in template: {{ 'test'|rot13 }} or {{ model|jsonEncode }} */ public $filters = []; /** * @var array Custom extensions - * Example: array('Twig_Extension_Sandbox', 'Twig_Extension_Text') + * Example: ['Twig_Extension_Sandbox', 'Twig_Extension_Text'] */ public $extensions = []; @@ -69,9 +68,9 @@ class ViewRenderer extends BaseViewRenderer * @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('{$', '}') + * 'tag_comment' => ['{*', '*}'], + * 'tag_block' => ['{', '}'], + * 'tag_variable' => ['{$', '}'] * ) */ public $lexerOptions = []; @@ -100,28 +99,30 @@ class ViewRenderer extends BaseViewRenderer 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)); @@ -130,7 +131,6 @@ class ViewRenderer extends BaseViewRenderer $this->twig->addGlobal('app', \Yii::$app); } - /** * Renders a view file. * @@ -147,71 +147,71 @@ class ViewRenderer extends BaseViewRenderer { $this->twig->addGlobal('this', $view); $this->twig->setLoader(new TwigSimpleFileLoader(dirname($file))); - return $this->twig->render(pathinfo($file,PATHINFO_BASENAME), $params); + return $this->twig->render(pathinfo($file, PATHINFO_BASENAME), $params); } /** - * Adds global objects or static classes - * @param array $globals @see self::$globals + * Adds global objects or static classes + * @param array $globals @see self::$globals */ - public function addGlobals($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) - { + public function addFunctions($functions) + { $this->_addCustom('Function', $functions); - } + } - /** - * Adds custom filters - * @param array $filters @see self::$filters - */ - public function addFilters($filters) - { + /** + * 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) - { + /** + * 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) - { + /** + * 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'; + /** + * 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; @@ -230,11 +230,8 @@ class ViewRenderer extends BaseViewRenderer 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))); + throw new \Exception("Incorrect options for \"$classType\" $name."); } } } } - diff --git a/extensions/yii/twig/ViewRendererStaticClassProxy.php b/extensions/yii/twig/ViewRendererStaticClassProxy.php index 0a4a598..3823ce0 100644 --- a/extensions/yii/twig/ViewRendererStaticClassProxy.php +++ b/extensions/yii/twig/ViewRendererStaticClassProxy.php @@ -1,6 +1,6 @@ - * @version 1.0.0 */ class ViewRendererStaticClassProxy {