From b053fa82811549dd44ec78c8e2278dc5c322f666 Mon Sep 17 00:00:00 2001 From: dev-meghraj Date: Tue, 24 Dec 2013 02:16:47 +0530 Subject: [PATCH 01/11] 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 --- extensions/yii/twig/TwigSimpleFileLoader.php | 36 +++++ extensions/yii/twig/ViewRenderer.php | 175 +++++++++++++++++++-- .../yii/twig/ViewRendererStaticClassProxy.php | 37 +++++ 3 files changed, 238 insertions(+), 10 deletions(-) create mode 100644 extensions/yii/twig/TwigSimpleFileLoader.php create mode 100644 extensions/yii/twig/ViewRendererStaticClassProxy.php diff --git a/extensions/yii/twig/TwigSimpleFileLoader.php b/extensions/yii/twig/TwigSimpleFileLoader.php new file mode 100644 index 0000000..af7115b --- /dev/null +++ b/extensions/yii/twig/TwigSimpleFileLoader.php @@ -0,0 +1,36 @@ + + * @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 diff --git a/extensions/yii/twig/ViewRenderer.php b/extensions/yii/twig/ViewRenderer.php index 7483f04..09367ce 100644 --- a/extensions/yii/twig/ViewRenderer.php +++ b/extensions/yii/twig/ViewRenderer.php @@ -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))); + } + } + } } + diff --git a/extensions/yii/twig/ViewRendererStaticClassProxy.php b/extensions/yii/twig/ViewRendererStaticClassProxy.php new file mode 100644 index 0000000..993d8a9 --- /dev/null +++ b/extensions/yii/twig/ViewRendererStaticClassProxy.php @@ -0,0 +1,37 @@ + + * @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 From 9ea15107f468231c925c213e1c52e6f13803deb8 Mon Sep 17 00:00:00 2001 From: dev-meghraj Date: Tue, 24 Dec 2013 02:27:02 +0530 Subject: [PATCH 02/11] 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 --- extensions/yii/twig/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/extensions/yii/twig/CHANGELOG.md b/extensions/yii/twig/CHANGELOG.md index 85b09d5..f13ea3f 100644 --- a/extensions/yii/twig/CHANGELOG.md +++ b/extensions/yii/twig/CHANGELOG.md @@ -10,3 +10,4 @@ Yii Framework 2 twig extension Change Log ----------------------------- - Initial release. +- Add more features like in old and file based loader for twig files From eabcf1c7de8ab48f4606bf165dadc0d4d435e7a0 Mon Sep 17 00:00:00 2001 From: dev-meghraj Date: Tue, 24 Dec 2013 02:44:32 +0530 Subject: [PATCH 03/11] minor typos --- extensions/yii/twig/TwigSimpleFileLoader.php | 2 +- extensions/yii/twig/ViewRenderer.php | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/extensions/yii/twig/TwigSimpleFileLoader.php b/extensions/yii/twig/TwigSimpleFileLoader.php index af7115b..b5002dd 100644 --- a/extensions/yii/twig/TwigSimpleFileLoader.php +++ b/extensions/yii/twig/TwigSimpleFileLoader.php @@ -12,7 +12,7 @@ class TwigSimpleFileLoader implements \Twig_LoaderInterface { /** * Path to directory where all file exists - * @param $view string + * @var string */ private $dir; diff --git a/extensions/yii/twig/ViewRenderer.php b/extensions/yii/twig/ViewRenderer.php index 09367ce..e63a858 100644 --- a/extensions/yii/twig/ViewRenderer.php +++ b/extensions/yii/twig/ViewRenderer.php @@ -39,7 +39,7 @@ class ViewRenderer extends BaseViewRenderer * Example: array('html'=>'\yii\helpers\Html') * Than in template: {{ html.link('Login', 'site/login') }} */ - public $globals = array(); + public $globals = []; /** * @var array Custom functions @@ -47,7 +47,7 @@ class ViewRenderer extends BaseViewRenderer * Example: array('rot13'=>'str_rot13', 'link'=>'\yii\helpers\Html::link') * Than in template: {{ rot13('test') }} or {{ link('Login', 'site/login') }} */ - public $functions = array(); + public $functions = []; /** * @var array Custom filters @@ -55,13 +55,13 @@ class ViewRenderer extends BaseViewRenderer * Example: array('rot13'=>'str_rot13', 'jsonEncode'=>'\yii\helpers\Json::encode') * Then in template: {{ 'test'|rot13 }} or {{ model|jsonEncode }} */ - public $filters = array(); + public $filters = []; /** * @var array Custom extensions * Example: array('Twig_Extension_Sandbox', 'Twig_Extension_Text') */ - public $extensions = array(); + public $extensions = []; /** * @var array Twig lexer options @@ -73,7 +73,7 @@ class ViewRenderer extends BaseViewRenderer * 'tag_variable' => array('{$', '}') * ) */ - public $lexerOptions = array(); + public $lexerOptions = []; /** * @var \Twig_Environment From b1a1458d704d1936744a210f020fdcce90ea4725 Mon Sep 17 00:00:00 2001 From: dev-meghraj Date: Thu, 26 Dec 2013 21:47:37 +0530 Subject: [PATCH 04/11] fixes code style. --- extensions/yii/twig/CHANGELOG.md | 2 +- extensions/yii/twig/TwigSimpleFileLoader.php | 88 ++++++++---- extensions/yii/twig/ViewRenderer.php | 151 +++++++++++---------- .../yii/twig/ViewRendererStaticClassProxy.php | 43 +++--- 4 files changed, 166 insertions(+), 118 deletions(-) diff --git a/extensions/yii/twig/CHANGELOG.md b/extensions/yii/twig/CHANGELOG.md index f13ea3f..85ea863 100644 --- a/extensions/yii/twig/CHANGELOG.md +++ b/extensions/yii/twig/CHANGELOG.md @@ -5,9 +5,9 @@ Yii Framework 2 twig extension Change Log ---------------------------- - no changes in this release. +- Add File based Twig loader for better caching and usability of twig's file based function 2.0.0 alpha, December 1, 2013 ----------------------------- - Initial release. -- Add more features like in old and file based loader for twig files diff --git a/extensions/yii/twig/TwigSimpleFileLoader.php b/extensions/yii/twig/TwigSimpleFileLoader.php index b5002dd..2ffaddd 100644 --- a/extensions/yii/twig/TwigSimpleFileLoader.php +++ b/extensions/yii/twig/TwigSimpleFileLoader.php @@ -1,36 +1,76 @@ * @version 1.0.0 */ class TwigSimpleFileLoader implements \Twig_LoaderInterface { - /** - * Path to directory where all file exists - * @var 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; - } + /** + * @var string Path to directory + */ + private $_dir; + + /* + * @param @dir string path to directory + */ + public function __construct($dir) + { + $this->_dir=$dir; + } + + /** + * Compare a file's freshness with previously stored timestamp + * + * @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 + */ + public function isFresh($name, $time) + { + return filemtime($this->getFilePath($name))<=$time; + } + + /** + * get the source of given file name + * + * @param $name string file name + * @return string contents of given file name + */ + public function getSource($name) + { + return file_get_contents($this->getFilePath($name)); + } + + /** + * get a unique key that can represent this file uniquely among other files. + * @param $name + * @return string + */ + public function getCacheKey($name) + { + return $this->getFilePath($name); + } + + /** + * internally used to get absolute path of given file name + * @param $name string file name + * @return string absolute path of file + */ + protected function getFilePath($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 e63a858..05f66d7 100644 --- a/extensions/yii/twig/ViewRenderer.php +++ b/extensions/yii/twig/ViewRenderer.php @@ -13,6 +13,7 @@ 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. @@ -76,7 +77,7 @@ class ViewRenderer extends BaseViewRenderer public $lexerOptions = []; /** - * @var \Twig_Environment + * @var \Twig_Environment twig environment object that do all rendering twig templates */ public $twig; @@ -85,40 +86,40 @@ class ViewRenderer extends BaseViewRenderer $this->twig = new \Twig_Environment(null, array_merge([ 'cache' => Yii::getAlias($this->cachePath), - 'auto_reload' => true, - 'charset' => Yii::$app->charset, + 'charset' => Yii::$app->charset, ], $this->options)); - // Adding custom extensions + // 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){ + + // 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){ })); @@ -145,31 +146,31 @@ class ViewRenderer extends BaseViewRenderer public function render($view, $file, $params) { $this->twig->addGlobal('this', $view); - $this->twig->setLoader(new TwigSimpleFileLoader(dirname($file))); + $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 - */ + /** + * 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); - } + 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 - */ + /** + * Adds custom functions + * @param array $functions @see self::$functions + */ public function addFunctions($functions) { - $this->_addCustom('Function', $functions); + $this->_addCustom('Function', $functions); } /** @@ -178,7 +179,7 @@ class ViewRenderer extends BaseViewRenderer */ public function addFilters($filters) { - $this->_addCustom('Filter', $filters); + $this->_addCustom('Filter', $filters); } /** @@ -187,9 +188,9 @@ class ViewRenderer extends BaseViewRenderer */ public function addExtensions($extensions) { - foreach ($extensions as $extName) { - $this->twig->addExtension(new $extName()); - } + foreach ($extensions as $extName) { + $this->twig->addExtension(new $extName()); + } } /** @@ -198,8 +199,8 @@ class ViewRenderer extends BaseViewRenderer */ public function setLexerOptions($options) { - $lexer = new \Twig_Lexer($this->twig, $options); - $this->twig->setLexer($lexer); + $lexer = new \Twig_Lexer($this->twig, $options); + $this->twig->setLexer($lexer); } /** @@ -210,30 +211,30 @@ class ViewRenderer extends BaseViewRenderer */ 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))); - } - } - } + $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))); + } + } + } } diff --git a/extensions/yii/twig/ViewRendererStaticClassProxy.php b/extensions/yii/twig/ViewRendererStaticClassProxy.php index 993d8a9..0a4a598 100644 --- a/extensions/yii/twig/ViewRendererStaticClassProxy.php +++ b/extensions/yii/twig/ViewRendererStaticClassProxy.php @@ -1,4 +1,11 @@ _staticClassName = $staticClassName; - } + $this->_staticClassName = $staticClassName; + } - public function __get($property) - { - $class = new \ReflectionClass($this->_staticClassName); - return $class->getStaticPropertyValue($property); - } + 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 __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); - } + public function __call($method, $arguments) + { + return call_user_func_array(array($this->_staticClassName, $method), $arguments); + } } \ No newline at end of file From 515095bbf7fcac1aaa78ae230dd2192900125c44 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Sun, 29 Dec 2013 23:26:20 +0100 Subject: [PATCH 05/11] Fixes #1633: Advanced application template now works with MongoDB by default --- apps/advanced/common/models/User.php | 10 ++++++++-- framework/CHANGELOG.md | 1 + 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/apps/advanced/common/models/User.php b/apps/advanced/common/models/User.php index 17bd630..a6bd701 100644 --- a/apps/advanced/common/models/User.php +++ b/apps/advanced/common/models/User.php @@ -68,11 +68,11 @@ class User extends ActiveRecord implements IdentityInterface } /** - * @return int|string current user ID + * @return int|string|array current user ID */ public function getId() { - return $this->id; + return $this->getPrimaryKey(); } /** @@ -104,6 +104,12 @@ class User extends ActiveRecord implements IdentityInterface public function rules() { return [ + ['status', 'default', 'value' => self::STATUS_ACTIVE], + ['status', 'in', 'range' => [self::STATUS_ACTIVE, self::STATUS_DELETED]], + + ['role', 'default', 'value' => self::ROLE_USER], + ['role', 'in', 'range' => [self::ROLE_USER]], + ['username', 'filter', 'filter' => 'trim'], ['username', 'required'], ['username', 'string', 'min' => 2, 'max' => 255], diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 9126e71..287c5da 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -36,6 +36,7 @@ Yii Framework 2 Change Log - Enh #1581: Added `ActiveQuery::joinWith()` and `ActiveQuery::innerJoinWith()` to support joining with relations (qiangxue) - Enh #1601: Added support for tagName and encodeLabel parameters in ButtonDropdown (omnilight) - Enh #1611: Added `BaseActiveRecord::markAttributeDirty()` (qiangxue) +- Enh #1633: Advanced application template now works with MongoDB by default (samdark) - Enh #1634: Use masked CSRF tokens to prevent BREACH exploits (qiangxue) - Enh #1641: Added `BaseActiveRecord::updateAttributes()` (qiangxue) - Enh #1646: Added postgresql `QueryBuilder::checkIntegrity` and `QueryBuilder::resetSequence` (Ragazzo) From 7c70f5c356d40f67be883a5f216b69c898edf454 Mon Sep 17 00:00:00 2001 From: Mark Date: Mon, 30 Dec 2013 02:36:15 +0400 Subject: [PATCH 06/11] debug module log panel improved --- extensions/yii/debug/models/search/Base.php | 37 ++++++++ extensions/yii/debug/models/search/Debug.php | 29 +----- extensions/yii/debug/models/search/Log.php | 79 ++++++++++++++++ extensions/yii/debug/panels/LogPanel.php | 103 ++++++++------------- .../yii/debug/views/default/panels/log/detail.php | 73 +++++++++++++++ .../yii/debug/views/default/panels/log/summary.php | 28 ++++++ extensions/yii/debug/views/default/view.php | 2 +- 7 files changed, 259 insertions(+), 92 deletions(-) create mode 100644 extensions/yii/debug/models/search/Base.php create mode 100644 extensions/yii/debug/models/search/Log.php create mode 100644 extensions/yii/debug/views/default/panels/log/detail.php create mode 100644 extensions/yii/debug/views/default/panels/log/summary.php diff --git a/extensions/yii/debug/models/search/Base.php b/extensions/yii/debug/models/search/Base.php new file mode 100644 index 0000000..be9b852 --- /dev/null +++ b/extensions/yii/debug/models/search/Base.php @@ -0,0 +1,37 @@ +$attribute; + + if (mb_strpos($value, '>') !== false) { + + $value = intval(str_replace('>', '', $value)); + $filter->addMatch($attribute, new matches\Greater(['value' => $value])); + + } elseif (mb_strpos($value, '<') !== false) { + + $value = intval(str_replace('<', '', $value)); + $filter->addMatch($attribute, new matches\Lower(['value' => $value])); + + } else { + $filter->addMatch($attribute, new matches\Exact(['value' => $value, 'partial' => $partial])); + } + + } + +} diff --git a/extensions/yii/debug/models/search/Debug.php b/extensions/yii/debug/models/search/Debug.php index f89990f..51bd45f 100644 --- a/extensions/yii/debug/models/search/Debug.php +++ b/extensions/yii/debug/models/search/Debug.php @@ -2,15 +2,13 @@ namespace yii\debug\models\search; -use yii\base\Model; use yii\data\ArrayDataProvider; use yii\debug\components\search\Filter; -use yii\debug\components\search\matches; /** * Debug represents the model behind the search form about requests manifest data. */ -class Debug extends Model +class Debug extends Base { /** * @var string tag attribute input search value @@ -121,29 +119,4 @@ class Debug extends Model return in_array($code, $this->criticalCodes); } - /** - * @param Filter $filter - * @param string $attribute - * @param boolean $partial - */ - public function addCondition($filter, $attribute, $partial = false) - { - $value = $this->$attribute; - - if (mb_strpos($value, '>') !== false) { - - $value = intval(str_replace('>', '', $value)); - $filter->addMatch($attribute, new matches\Greater(['value' => $value])); - - } elseif (mb_strpos($value, '<') !== false) { - - $value = intval(str_replace('<', '', $value)); - $filter->addMatch($attribute, new matches\Lower(['value' => $value])); - - } else { - $filter->addMatch($attribute, new matches\Exact(['value' => $value, 'partial' => $partial])); - } - - } - } diff --git a/extensions/yii/debug/models/search/Log.php b/extensions/yii/debug/models/search/Log.php new file mode 100644 index 0000000..ab8c754 --- /dev/null +++ b/extensions/yii/debug/models/search/Log.php @@ -0,0 +1,79 @@ + 'Level', + 'category' => 'Category', + 'message' => 'Message', + ]; + } + + /** + * Returns data provider with filled models. Filter applied if needed. + * @param array $params + * @param array $models + * @return \yii\data\ArrayDataProvider + */ + public function search($params, $models) + { + $dataProvider = new ArrayDataProvider([ + 'allModels' => $models, + 'pagination' => [ + 'pageSize' => 10, + ], + 'sort' => [ + 'attributes' => ['time','level','category','message'], + ], + ]); + + if (!($this->load($params) && $this->validate())) { + return $dataProvider; + } + + $filter = new Filter(); + $this->addCondition($filter, 'level'); + $this->addCondition($filter, 'category', true); + $this->addCondition($filter, 'message', true); + $dataProvider->allModels = $filter->filter($models); + + return $dataProvider; + } + +} diff --git a/extensions/yii/debug/panels/LogPanel.php b/extensions/yii/debug/panels/LogPanel.php index ccf4402..e80f2d8 100644 --- a/extensions/yii/debug/panels/LogPanel.php +++ b/extensions/yii/debug/panels/LogPanel.php @@ -9,9 +9,8 @@ namespace yii\debug\panels; use Yii; use yii\debug\Panel; -use yii\helpers\Html; use yii\log\Logger; -use yii\log\Target; +use yii\debug\models\search\Log; /** * Debugger panel that collects and displays logs. @@ -21,6 +20,12 @@ use yii\log\Target; */ class LogPanel extends Panel { + + /** + * @var array log messages extracted to array as models, to use with data provider. + */ + private $_models ; + public function getName() { return 'Logs'; @@ -28,72 +33,19 @@ class LogPanel extends Panel public function getSummary() { - $output = ['' . count($this->data['messages']) . '']; - $title = 'Logged ' . count($this->data['messages']) . ' messages'; - $errorCount = count(Target::filterMessages($this->data['messages'], Logger::LEVEL_ERROR)); - if ($errorCount) { - $output[] = '' . $errorCount . ''; - $title .= ", $errorCount errors"; - } - $warningCount = count(Target::filterMessages($this->data['messages'], Logger::LEVEL_WARNING)); - if ($warningCount) { - $output[] = '' . $warningCount . ''; - $title .= ", $warningCount warnings"; - } - $log = implode(' ', $output); - $url = $this->getUrl(); - return << - Log $log - -EOD; + return Yii::$app->view->render('panels/log/summary',['data' => $this->data, 'panel' => $this]); } public function getDetail() { - $rows = []; - foreach ($this->data['messages'] as $log) { - list ($message, $level, $category, $time, $traces) = $log; - $time = date('H:i:s.', $time) . sprintf('%03d', (int)(($time - (int)$time) * 1000)); - $message = nl2br(Html::encode($message)); - if (!empty($traces)) { - $message .= Html::ul($traces, [ - 'class' => 'trace', - 'item' => function ($trace) { - return "
  • {$trace['file']}({$trace['line']})
  • "; - }, - ]); - } - if ($level == Logger::LEVEL_ERROR) { - $class = ' class="danger"'; - } elseif ($level == Logger::LEVEL_WARNING) { - $class = ' class="warning"'; - } elseif ($level == Logger::LEVEL_INFO) { - $class = ' class="success"'; - } else { - $class = ''; - } - $level = Logger::getLevelName($level); - $rows[] = "$time$level$category
    $message
    "; - } - $rows = implode("\n", $rows); - return <<Log Messages + $searchModel = new Log(); + $dataProvider = $searchModel->search($_GET, $this->getModels()); - - - - - - - - - - -$rows - -
    TimeLevelCategoryMessage
    -EOD; + return Yii::$app->view->render('panels/log/detail',[ + 'dataProvider' => $dataProvider, + 'panel' => $this, + 'searchModel' => $searchModel, + ]); } public function save() @@ -102,4 +54,29 @@ EOD; $messages = $target->filterMessages($target->messages, Logger::LEVEL_ERROR | Logger::LEVEL_INFO | Logger::LEVEL_WARNING | Logger::LEVEL_TRACE); return ['messages' => $messages]; } + + /** + * Returns array of models that represents logs of the current request. Can be used with data providers, + * like yii\data\ArrayDataProvider. + * @param boolean $refresh if needed to build models from log messages and refresh them. + * @return array models + */ + protected function getModels($refresh=false) + { + if ($this->_models === null || $refresh) { + $this->_models = []; + + foreach($this->data['messages'] as $message) { + $this->_models[] = [ + 'message' => $message[0], + 'level' => $message[1], + 'category' => $message[2], + 'time' => ($message[3] * 1000), #time in milliseconds + 'trace' => $message[4] + ]; + } + } + return $this->_models; + } + } diff --git a/extensions/yii/debug/views/default/panels/log/detail.php b/extensions/yii/debug/views/default/panels/log/detail.php new file mode 100644 index 0000000..10fb879 --- /dev/null +++ b/extensions/yii/debug/views/default/panels/log/detail.php @@ -0,0 +1,73 @@ + +

    Log Messages

    + $dataProvider, + 'id' => 'log-panel-detailed-grid', + 'filterModel' => $searchModel, + 'filterUrl' => $panel->getUrl(), + 'rowOptions' => function ($model, $key, $index, $grid){ + switch($model['level']) { + case Logger::LEVEL_ERROR : return ['class' => 'danger']; + case Logger::LEVEL_WARNING : return ['class' => 'warning']; + case Logger::LEVEL_INFO : return ['class' => 'success']; + default: return []; + } + }, + 'columns' => [ + ['class' => 'yii\grid\SerialColumn'], + [ + 'attribute' => 'time', + 'value' => function ($data) + { + $timeInSeconds = $data['time'] / 1000; + $millisecondsDiff = (int)(($timeInSeconds - (int)$timeInSeconds) * 1000); + return date('H:i:s.',$timeInSeconds) . sprintf('%03d',$millisecondsDiff); + }, + ], + [ + 'attribute' => 'level', + 'value' => function ($data) + { + return Logger::getLevelName($data['level']); + }, + 'filter' => [ + Logger::LEVEL_TRACE => ' Trace ', + Logger::LEVEL_PROFILE => ' Profile ', + Logger::LEVEL_INFO => ' Info ', + Logger::LEVEL_ERROR => ' Error ', + ], + ], + 'category', + [ + 'attribute' => 'message', + 'value' => function ($data) + { + $message = nl2br(Html::encode($data['message'])); + + if (!empty($data['trace'])) { + $message .= Html::ul($data['trace'], [ + 'class' => 'trace', + 'item' => function ($trace) + { + return "
  • {$trace['file']} ({$trace['line']})
  • "; + } + ]); + }; + + return $message; + }, + 'format' => 'html', + 'options' => [ + 'width' => '50%', + ], + ], + ], +]); +?> \ No newline at end of file diff --git a/extensions/yii/debug/views/default/panels/log/summary.php b/extensions/yii/debug/views/default/panels/log/summary.php new file mode 100644 index 0000000..f2fdbdc --- /dev/null +++ b/extensions/yii/debug/views/default/panels/log/summary.php @@ -0,0 +1,28 @@ + + +$errorCount"; + $title .= ", $errorCount errors"; +} + +if ($warningCount) { + $output[] = "$warningCount"; + $title .= ", $warningCount warnings"; +} +?> + + \ No newline at end of file diff --git a/extensions/yii/debug/views/default/view.php b/extensions/yii/debug/views/default/view.php index 846653c..77eaee4 100644 --- a/extensions/yii/debug/views/default/view.php +++ b/extensions/yii/debug/views/default/view.php @@ -18,7 +18,7 @@ $this->title = 'Yii Debugger';
    - Yii Debugger + 'Back to main debug page']);?>
    getSummary() ?> From f224902b63c73a301c934deeef27d8a02e4b08f5 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Sun, 29 Dec 2013 23:49:43 +0100 Subject: [PATCH 07/11] Fixes #1636: `yii\jui\SliderInput` wasn't properly initialized --- extensions/yii/jui/SliderInput.php | 7 ++++--- framework/CHANGELOG.md | 1 + 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/extensions/yii/jui/SliderInput.php b/extensions/yii/jui/SliderInput.php index 8a43eb1..20599cf 100644 --- a/extensions/yii/jui/SliderInput.php +++ b/extensions/yii/jui/SliderInput.php @@ -15,7 +15,7 @@ use yii\helpers\Html; * For example, * * ``` - * echo Slider::widget([ + * echo SliderInput::widget([ * 'model' => $model, * 'attribute' => 'amount', * 'clientOptions' => [ @@ -28,7 +28,7 @@ use yii\helpers\Html; * The following example will use the name property instead: * * ``` - * echo Slider::widget([ + * echo SliderInput::widget([ * 'name' => 'amount', * 'clientOptions' => [ * 'min' => 1, @@ -75,8 +75,10 @@ class SliderInput extends InputWidget if ($this->hasModel()) { echo Html::activeHiddenInput($this->model, $this->attribute, $this->options); + $this->clientOptions['value'] = $this->model{$this->attribute}; } else { echo Html::hiddenInput($this->name, $this->value, $this->options); + $this->clientOptions['value'] = $this->value; } if (!isset($this->clientEvents['slide'])) { @@ -86,6 +88,5 @@ class SliderInput extends InputWidget } $this->registerWidget('slider', SliderAsset::className(), $this->containerOptions['id']); - $this->getView()->registerJs('$("#' . $this->options['id'] . '").val($("#' . $this->id . '").slider("value"));'); } } diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 287c5da..ba8eab2 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -16,6 +16,7 @@ Yii Framework 2 Change Log - Bug #1591: StringValidator is accessing undefined property (qiangxue) - Bug #1597: Added `enableAutoLogin` to basic and advanced application templates so "remember me" now works properly (samdark) - Bug #1631: Charset is now explicitly set to UTF-8 when serving JSON (samdark) +- Bug #1636: `yii\jui\SliderInput` wasn't properly initialized (samdark) - Bug #1686: ActiveForm is creating duplicated messages in error summary (qiangxue) - Bug: Fixed `Call to a member function registerAssetFiles() on a non-object` in case of wrong `sourcePath` for an asset bundle (samdark) - Bug: Fixed incorrect event name for `yii\jui\Spinner` (samdark) From bfc2ed2aba8a32135edb7cd2319dafe1fb2c8ed7 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Sun, 29 Dec 2013 23:51:04 +0100 Subject: [PATCH 08/11] Fixed #1635 --- framework/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index ba8eab2..94e5bae 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -16,7 +16,7 @@ Yii Framework 2 Change Log - Bug #1591: StringValidator is accessing undefined property (qiangxue) - Bug #1597: Added `enableAutoLogin` to basic and advanced application templates so "remember me" now works properly (samdark) - Bug #1631: Charset is now explicitly set to UTF-8 when serving JSON (samdark) -- Bug #1636: `yii\jui\SliderInput` wasn't properly initialized (samdark) +- Bug #1635: `yii\jui\SliderInput` wasn't properly initialized (samdark) - Bug #1686: ActiveForm is creating duplicated messages in error summary (qiangxue) - Bug: Fixed `Call to a member function registerAssetFiles() on a non-object` in case of wrong `sourcePath` for an asset bundle (samdark) - Bug: Fixed incorrect event name for `yii\jui\Spinner` (samdark) From 1028899fa3713d20b5997ae9a7d106582c211cbf Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Mon, 30 Dec 2013 00:45:24 +0100 Subject: [PATCH 09/11] 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 { From a76275f891783804d1109fb2b73c49d04d61ac16 Mon Sep 17 00:00:00 2001 From: Luciano Baraglia Date: Sun, 29 Dec 2013 20:49:58 -0300 Subject: [PATCH 10/11] Typo in changelog --- framework/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 94e5bae..471fcda 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -43,7 +43,7 @@ Yii Framework 2 Change Log - Enh #1646: Added postgresql `QueryBuilder::checkIntegrity` and `QueryBuilder::resetSequence` (Ragazzo) - Enh #1645: Added `Connection::$pdoClass` property (Ragazzo) - Enh #1681: Added support for automatically adjusting the "for" attribute of label generated by `ActiveField::label()` (qiangxue) -- Enh: Added `favicon.ico` and `robots.txt` to defauly application templates (samdark) +- Enh: Added `favicon.ico` and `robots.txt` to default application templates (samdark) - Enh: Added `Widget::autoIdPrefix` to support prefixing automatically generated widget IDs (qiangxue) - Enh: Support for file aliases in console command 'message' (omnilight) - Enh: Sort and Pagination can now create absolute URLs (cebe) From f19cf8ee855eee0be4995b5775f36106c3f03427 Mon Sep 17 00:00:00 2001 From: Luciano Baraglia Date: Sun, 29 Dec 2013 21:00:26 -0300 Subject: [PATCH 11/11] Updated GII changelog --- extensions/yii/gii/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/extensions/yii/gii/CHANGELOG.md b/extensions/yii/gii/CHANGELOG.md index baa33d0..0174387 100644 --- a/extensions/yii/gii/CHANGELOG.md +++ b/extensions/yii/gii/CHANGELOG.md @@ -5,6 +5,7 @@ Yii Framework 2 gii extension Change Log ---------------------------- - Bug #1405: fixed disambiguation of relation names generated by gii (qiangxue) +- Enh #1624: generate rules for unique indexes (lucianobaraglia) 2.0.0 alpha, December 1, 2013 -----------------------------