changed default filter to use the empty test
authorFabien Potencier <fabien.potencier@gmail.com>
Sat, 18 Dec 2010 11:56:44 +0000 (12:56 +0100)
committerFabien Potencier <fabien.potencier@gmail.com>
Sat, 18 Dec 2010 11:56:44 +0000 (12:56 +0100)
CHANGELOG
doc/templates.rst
lib/Twig/Extension/Core.php
lib/Twig/Node/Expression/Filter.php

index 5626a50..f00961f 100644 (file)
--- 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)
index c1ed8fb..30d6b24 100644 (file)
@@ -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``
 ~~~~~~~~
index 77bef20..f647163 100644 (file)
@@ -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)
index 3a29548..9cc00fc 100644 (file)
@@ -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();