This reverts commit 03926034c4, reversing
changes made to 730aa25bed.
Conflicts:
CHANGELOG
doc/tags/macro.rst
doc/templates.rst
lib/Twig/ExpressionParser.php
Commits
-------
7b154d6 Switched a tab to four spaces
29d3cb2 Added testcase for #3954fc7a8d Merge remote-tracking branch 'upstream/master'
c890cf2 Fixed existing tests
9822ac4 Changed Module.php to pass existing tests
fab8c72 fixed issue #395
Discussion
----------
Fix for issue #395
Fix for #395
I hope you can use it.
---------------------------------------------------------------------------
by fabpot at 2011/07/25 00:07:50 -0700
Can you add some unit tests?
---------------------------------------------------------------------------
by netzhuffle at 2011/07/25 13:57:55 -0700
Here you are.
Traits are "special" templates that define blocks that you can "include" in
other templates.
Let's take an example:
{# 'foo' template defines the 'foo' block #}
{% block 'foo' %}
FOO
{% endblock %}
{# 'main' template defines the 'bar' block and include the 'foo' block from the 'foo' template #}
{% extends 'base' %}
{% use 'foo' %}
{% block 'bar' %}
BAR
{% endblock %}
In the previous example, the 'main' template use the 'foo' one. It means that
the 'foo' block defined in the 'foo' template is available as if it were
defined in the 'main' template.
You can use as many 'use' statements as you want in a template:
{% extends 'base' %}
{% use 'foo' %}
{% use 'bar' %}
{% use 'foobar' %}
If two templates define the same block, the latest one wins. The template can
also overrides any block.
The 'use' tag also supports "dynamic" names:
{% set foo = 'foo' %}
{% use foo %}
The 'use' tag only imports a template if it does not extend another template,
if it does not define macros, and if the body is empty. But it can 'use' other
templates:
{# 'foo' template #}
{% block 'foo' %}
FOO
{% endblock %}
{# 'bar' template #}
{% use 'foo' %}
{% block 'bar' %}
BAR
{% endblock %}
{# 'main' template #}
{% extends 'base' %}
{% use 'bar' %}
In this example, the 'main' template has access to both 'foo' and 'bar'.
Traits are mainly useful when you consider blocks as reusable "functions";
like we do in Symfony2 forms or if you use Twig for code generation.
Before:
Nodes were accessed via node properties ($node->body)
Attributes were accessed via node array access ($node['name'])
After:
Nodes are accessed via getNode(), setNode(), ... ($node->getNode('body'))
Attributes are accessed via getAttribute(), setAttribute(), ... ($node->getAttribute('name'))
The change was necessary because of side-effects. This is one more time the
demonstration that being explicit is always better than magic ;)