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)
~~~~~~~~~~~
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``
~~~~~~~~
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)
}
$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();