From: Fabien Potencier Date: Sat, 18 Dec 2010 11:56:44 +0000 (+0100) Subject: changed default filter to use the empty test X-Git-Url: http://git.silmor.de/gitweb/?a=commitdiff_plain;h=583718ee1a0043f9c1514df1626bff71fff0c2d8;p=web%2Fkonrad%2Ftwig.git changed default filter to use the empty test --- diff --git a/CHANGELOG b/CHANGELOG index 5626a50..f00961f 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -6,6 +6,7 @@ Backward incompatibilities: Changes: + * the "default" filter now uses the "empty" test instead of just checking for null * added the "empty" test * 0.9.10 (2010-12-16) diff --git a/doc/templates.rst b/doc/templates.rst index c1ed8fb..30d6b24 100644 --- a/doc/templates.rst +++ b/doc/templates.rst @@ -1263,11 +1263,20 @@ The ``..`` operator (see above) is a syntactic sugar for the ``range`` filter ~~~~~~~~~~~ The ``default`` filter returns the passed default value if the value is -undefined, otherwise the value of the variable: +undefined or empty, otherwise the value of the variable: .. code-block:: jinja - {{ my_variable|default('my_variable is not defined') }} + {{ var|default('var is not defined') }} + + {{ var.foo|default('foo item on var is not defined') }} + + {{ ''|default('passed var is empty') }} + +.. note:: + + Read the documentation for the ``defined`` and ``empty`` tests below to + learn more about their semantics. ``keys`` ~~~~~~~~ diff --git a/lib/Twig/Extension/Core.php b/lib/Twig/Extension/Core.php index 77bef20..f647163 100644 --- a/lib/Twig/Extension/Core.php +++ b/lib/Twig/Extension/Core.php @@ -204,7 +204,7 @@ function twig_join_filter($value, $glue = '') function twig_default_filter($value, $default = '') { - return null === $value ? $default : $value; + return twig_test_empty($value) ? $default : $value; } function twig_get_array_keys_filter($array) diff --git a/lib/Twig/Node/Expression/Filter.php b/lib/Twig/Node/Expression/Filter.php index 3a29548..9cc00fc 100644 --- a/lib/Twig/Node/Expression/Filter.php +++ b/lib/Twig/Node/Expression/Filter.php @@ -25,8 +25,9 @@ class Twig_Node_Expression_Filter extends Twig_Node_Expression } $filter = $filterMap[$name]; - // foo|default('bar') or foo.bar|default('bar') - // compiled to {{ foo is defined ? foo|default('bar') : 'bar' }} + // The default filter is intercepted when the filtered value + // is a name (like obj) or an attribute (like obj.attr) + // In such a case, it's compiled to {{ obj is defined ? obj|default('bar') : 'bar' }} if ('default' === $name && ($this->getNode('node') instanceof Twig_Node_Expression_Name || $this->getNode('node') instanceof Twig_Node_Expression_GetAttr)) { if ($this->getNode('node') instanceof Twig_Node_Expression_Name) { $testMap = $compiler->getEnvironment()->getTests();