[ticket/13132] Twig: Add loops content to the root context

PHPBB3-13132
This commit is contained in:
Tristan Darricau 2014-10-07 20:51:08 +02:00 committed by Nicofuma
parent 70990bc86f
commit cf39cfc593
18 changed files with 335 additions and 3 deletions

View file

@ -352,6 +352,12 @@ class twig extends \phpbb\template\base
// cleanup // cleanup
unset($vars['loops']['.']); unset($vars['loops']['.']);
// Inject in the main context the value added by assign_block_vars() to be able to use directly the Twig loops.
foreach ($vars['loops'] as $key => &$value)
{
$vars[$key] = $value;
}
return $vars; return $vars;
} }

View file

@ -129,6 +129,34 @@ class phpbb_template_template_test extends phpbb_template_template_test_case
array(), array(),
"loop\nloop\nloop\nloop\nloop#0-block#0\nloop#0-block#1\nloop#1-block#0\nloop#1-block#1", "loop\nloop\nloop\nloop\nloop#0-block#0\nloop#0-block#1\nloop#1-block#0\nloop#1-block#1",
), ),
array(
'loop_twig.html',
array(),
array(),
array(),
"noloop\nnoloop",
),
array(
'loop_twig.html',
array(),
array('test_loop' => array(array())),
array(),
"loop\nloop",
),
array(
'loop_twig.html',
array(),
array('test_loop' => array(array(), array()), 'test_loop.block' => array(array())),
array(),
"loop\nloop\nloop\nloop",
),
array(
'loop_twig.html',
array(),
array('test_loop' => array(array(), array()), 'test_loop.block' => array(array()), 'block' => array(array(), array())),
array(),
"loop\nloop\nloop\nloop\nloop#0-block#0\nloop#0-block#1\nloop#1-block#0\nloop#1-block#1",
),
array( array(
'loop_vars.html', 'loop_vars.html',
array(), array(),
@ -150,6 +178,27 @@ class phpbb_template_template_test extends phpbb_template_template_test_case
array(), array(),
"first\n0 - a\nx - b\nset\n1 - a\ny - b\nset\nlast\n0 - c\n1 - c\nlast inner", "first\n0 - a\nx - b\nset\n1 - a\ny - b\nset\nlast\n0 - c\n1 - c\nlast inner",
), ),
array(
'loop_vars_twig.html',
array(),
array('test_loop' => array(array('VARIABLE' => 'x'))),
array(),
"first\n0 - a\nx - b\nset\nlast",
),
array(
'loop_vars_twig.html',
array(),
array('test_loop' => array(array('VARIABLE' => 'x'), array('VARIABLE' => 'y'))),
array(),
"first\n0 - a\nx - b\nset\n1 - a\ny - b\nset\nlast",
),
array(
'loop_vars_twig.html',
array(),
array('test_loop' => array(array('VARIABLE' => 'x'), array('VARIABLE' => 'y')), 'test_loop.inner' => array(array(), array())),
array(),
"first\n0 - a\nx - b\nset\n1 - a\ny - b\nset\nlast\n0 - c\n1 - c\nlast inner",
),
array( array(
'loop_advanced.html', 'loop_advanced.html',
array(), array(),
@ -157,6 +206,13 @@ class phpbb_template_template_test extends phpbb_template_template_test_case
array(), array(),
"101234561\nx\n101234561\nx\n101234561\nx\n1234561\nx\n1\nx\n101\nx\n234\nx\n10\nx\n561\nx\n561", "101234561\nx\n101234561\nx\n101234561\nx\n1234561\nx\n1\nx\n101\nx\n234\nx\n10\nx\n561\nx\n561",
), ),
array(
'loop_advanced_twig.html',
array(),
array('test_loop' => array(array(), array(), array(), array(), array(), array(), array())),
array(),
"101234561\nx\n101234561\nx\n101234561\nx\n1234561\nx\n1\nx\n101\nx\n234\nx\n10\nx\n561\nx\n561",
),
array( array(
'loop_nested2.html', 'loop_nested2.html',
array(), array(),
@ -164,6 +220,13 @@ class phpbb_template_template_test extends phpbb_template_template_test_case
array(), array(),
"o0o1m01m11", "o0o1m01m11",
), ),
array(
'loop_nested2_twig.html',
array(),
array('outer' => array(array(), array()), 'outer.middle' => array(array(), array())),
array(),
"o0o1m01m11",
),
array( array(
'define.html', 'define.html',
array(), array(),
@ -243,6 +306,13 @@ class phpbb_template_template_test extends phpbb_template_template_test_case
array('test_loop'), array('test_loop'),
'', '',
), ),
array(
'loop_vars_twig.html',
array(),
array('test_loop' => array(array('VARIABLE' => 'x'), array('VARIABLE' => 'y')), 'test_loop.inner' => array(array(), array())),
array('test_loop'),
'',
),
array( array(
'include_define_variable.html', 'include_define_variable.html',
array('VARIABLE' => 'variable.html'), array('VARIABLE' => 'variable.html'),
@ -274,6 +344,15 @@ class phpbb_template_template_test extends phpbb_template_template_test_case
array(), array(),
"noloop\nnoloop", "noloop\nnoloop",
), ),
array(
// Just like a regular loop but the name begins
// with an underscore
'loop_underscore_twig.html',
array(),
array(),
array(),
"noloop\nnoloop",
),
array( array(
'lang.html', 'lang.html',
array(), array(),
@ -296,6 +375,13 @@ class phpbb_template_template_test extends phpbb_template_template_test_case
array(), array(),
"top-level content", "top-level content",
), ),
array(
'loop_nested_multilevel_ref_twig.html',
array(),
array(),
array(),
"top-level content",
),
array( array(
'loop_nested_multilevel_ref.html', 'loop_nested_multilevel_ref.html',
array(), array(),
@ -303,6 +389,13 @@ class phpbb_template_template_test extends phpbb_template_template_test_case
array(), array(),
"top-level content\nouter x\nouter y\ninner z\nfirst row\n\ninner zz", "top-level content\nouter x\nouter y\ninner z\nfirst row\n\ninner zz",
), ),
array(
'loop_nested_multilevel_ref_twig.html',
array(),
array('outer' => array(array('VARIABLE' => 'x'), array('VARIABLE' => 'y')), 'outer.inner' => array(array('VARIABLE' => 'z'), array('VARIABLE' => 'zz'))),
array(),
"top-level content\nouter x\nouter y\ninner z\nfirst row\n\ninner zz",
),
array( array(
'loop_nested_deep_multilevel_ref.html', 'loop_nested_deep_multilevel_ref.html',
array(), array(),
@ -310,6 +403,13 @@ class phpbb_template_template_test extends phpbb_template_template_test_case
array(), array(),
"top-level content\nouter\nmiddle\ninner z\nfirst row of 2 in inner\n\ninner zz", "top-level content\nouter\nmiddle\ninner z\nfirst row of 2 in inner\n\ninner zz",
), ),
array(
'loop_nested_deep_multilevel_ref_twig.html',
array(),
array('outer' => array(array()), 'outer.middle' => array(array()), 'outer.middle.inner' => array(array('VARIABLE' => 'z'), array('VARIABLE' => 'zz'))),
array(),
"top-level content\nouter\nmiddle\ninner z\nfirst row of 2 in inner\n\ninner zz",
),
array( array(
'loop_size.html', 'loop_size.html',
array(), array(),
@ -317,6 +417,13 @@ class phpbb_template_template_test extends phpbb_template_template_test_case
array(), array(),
"nonexistent = 0\n! nonexistent\n\nempty = 0\n! empty\nloop\n\nin loop", "nonexistent = 0\n! nonexistent\n\nempty = 0\n! empty\nloop\n\nin loop",
), ),
array(
'loop_size_twig.html',
array(),
array('test_loop' => array(array()), 'empty_loop' => array()),
array(),
"nonexistent = 0\n! nonexistent\n\nempty = 0\n! empty\nloop\n\nin loop",
),
array( array(
'loop_include.html', 'loop_include.html',
array(), array(),
@ -324,6 +431,13 @@ class phpbb_template_template_test extends phpbb_template_template_test_case
array(), array(),
"barbarbar1bar1", "barbarbar1bar1",
), ),
array(
'loop_include_twig.html',
array(),
array('test_loop' => array(array('foo' => 'bar'), array('foo' => 'bar1'))),
array(),
"barbarbar1bar1",
),
array( array(
'loop_nested_include.html', 'loop_nested_include.html',
array(), array(),
@ -335,6 +449,17 @@ class phpbb_template_template_test extends phpbb_template_template_test_case
"[bar|[bar|]][bar1|[bar1|[bar1|works]]]", "[bar|[bar|]][bar1|[bar1|[bar1|works]]]",
array(), array(),
), ),
array(
'loop_nested_include_twig.html',
array(),
array(
'test_loop' => array(array('foo' => 'bar'), array('foo' => 'bar1')),
'test_loop.inner' => array(array('myinner' => 'works')),
),
array(),
"[bar|[bar|]][bar1|[bar1|[bar1|works]]]",
array(),
),
/* Does not pass with the current implementation. /* Does not pass with the current implementation.
array( array(
'loop_reuse.html', 'loop_reuse.html',
@ -343,8 +468,15 @@ class phpbb_template_template_test extends phpbb_template_template_test_case
array(), array(),
// Not entirely sure what should be outputted but the current output of "a" is most certainly wrong // Not entirely sure what should be outputted but the current output of "a" is most certainly wrong
"a\nb\nc\nd", "a\nb\nc\nd",
),*/
array(
'loop_reuse_twig.html',
array(),
array('one' => array(array('VAR' => 'a'), array('VAR' => 'b')), 'one.one' => array(array('VAR' => 'c'), array('VAR' => 'd'))),
array(),
// Not entirely sure what should be outputted but the current output of "a" is most certainly wrong
"a\nb\nc\nd",
), ),
*/
array( array(
'twig.html', 'twig.html',
array('VARIABLE' => 'FOObar',), array('VARIABLE' => 'FOObar',),
@ -359,6 +491,21 @@ class phpbb_template_template_test extends phpbb_template_template_test_case
array(), array(),
'inner_value', 'inner_value',
), ),
// Disable: needs Twig 1.14.2
/*array(
'loop_expressions.html',
array('loop' => array(array(),array(),array(),array(),array(),array()),),
array(),
array(),
'yesnonoyesnonoyesnoyesnonoyes',
),
array(
'loop_expressions_twig.html',
array('loop' => array(array(),array(),array(),array(),array(),array()),),
array(),
array(),
'yesnonoyesnonoyesnoyesnonoyes',
),*/
); );
} }

View file

@ -0,0 +1,19 @@
{% for test_loop_inner in test_loop %}{{ test_loop_inner.S_FIRST_ROW }}{{ test_loop_inner.S_ROW_COUNT }}{{ test_loop_inner.S_LAST_ROW }}{% endfor %}
x
{% for test_loop_inner in test_loop|subset(0) %}{{ test_loop_inner.S_FIRST_ROW }}{{ test_loop_inner.S_ROW_COUNT }}{{ test_loop_inner.S_LAST_ROW }}{% endfor %}
x
{% for test_loop_inner in test_loop|subset(0,-1) %}{{ test_loop_inner.S_FIRST_ROW }}{{ test_loop_inner.S_ROW_COUNT }}{{ test_loop_inner.S_LAST_ROW }}{% endfor %}
x
{% for test_loop_inner in test_loop|subset(1) %}{{ test_loop_inner.S_FIRST_ROW }}{{ test_loop_inner.S_ROW_COUNT }}{{ test_loop_inner.S_LAST_ROW }}{% endfor %}
x
{% for test_loop_inner in test_loop|subset(1,1) %}{{ test_loop_inner.S_FIRST_ROW }}{{ test_loop_inner.S_ROW_COUNT }}{{ test_loop_inner.S_LAST_ROW }}{% endfor %}
x
{% for test_loop_inner in test_loop|subset(0,1) %}{{ test_loop_inner.S_FIRST_ROW }}{{ test_loop_inner.S_ROW_COUNT }}{{ test_loop_inner.S_LAST_ROW }}{% endfor %}
x
{% for test_loop_inner in test_loop|subset(2,4) %}{{ test_loop_inner.S_FIRST_ROW }}{{ test_loop_inner.S_ROW_COUNT }}{{ test_loop_inner.S_LAST_ROW }}{% endfor %}
x
{% for test_loop_inner in test_loop|subset(0,-7) %}{{ test_loop_inner.S_FIRST_ROW }}{{ test_loop_inner.S_ROW_COUNT }}{{ test_loop_inner.S_LAST_ROW }}{% endfor %}
x
{% for test_loop_inner in test_loop|subset(-2,6) %}{{ test_loop_inner.S_FIRST_ROW }}{{ test_loop_inner.S_ROW_COUNT }}{{ test_loop_inner.S_LAST_ROW }}{% endfor %}
x
{% for test_loop_inner in test_loop|subset(-2,-1) %}{{ test_loop_inner.S_FIRST_ROW }}{{ test_loop_inner.S_ROW_COUNT }}{{ test_loop_inner.S_LAST_ROW }}{% endfor %}

View file

@ -1,11 +1,11 @@
<!-- BEGIN loop --> <!-- BEGIN loop -->
<!-- IF loop.S_ROW_NUM is even by 4 -->on<!-- ELSE -->off<!-- ENDIF --> <!-- IF loop.S_ROW_NUM is divisible by 4 -->on<!-- ELSE -->off<!-- ENDIF -->
<!-- END loop --> <!-- END loop -->
<!-- BEGIN loop --> <!-- BEGIN loop -->
<!-- IF loop.S_ROW_NUM is odd by 3 -->on<!-- ELSE -->off<!-- ENDIF --> <!-- IF loop.S_ROW_NUM is divisible by 3 -->on<!-- ELSE -->off<!-- ENDIF -->
<!-- END loop --> <!-- END loop -->

View file

@ -0,0 +1,11 @@
{% for loop_inner in loop %}
{% if loop_inner.S_ROW_NUM is divisible by 4 %}on{% else %}off{% endif %}
{% endfor %}
{% for loop_inner in loop %}
{% if loop_inner.S_ROW_NUM is divisible by 3 %}on{% else %}off{% endif %}
{% endfor %}

View file

@ -0,0 +1 @@
{{ test_loop_inner.foo }}

View file

@ -0,0 +1,4 @@
{% for test_loop_inner in test_loop %}
{{ test_loop_inner.foo }}
{% INCLUDE 'loop_include1_twig.html' %}
{% endfor %}

View file

@ -0,0 +1,6 @@
{% for outer_inner in outer %}
o{{ outer_inner.S_ROW_COUNT }}
{% for middle in outer_inner.middle %}
m{{ middle.S_ROW_COUNT }}{{ outer_inner.S_ROW_COUNT }}
{% endfor %}
{% endfor %}

View file

@ -0,0 +1,13 @@
top-level content
{% for outer_inner in outer %}
outer
{% for middle in outer_inner.middle %}
{{ middle.S_BLOCK_NAME }}
{% for inner in middle.inner %}
inner {{ inner.VARIABLE }}
{% if inner.S_FIRST_ROW %}
first row of {{ inner.S_NUM_ROWS }} in {{ inner.S_BLOCK_NAME }}
{% endif %}
{% endfor %}
{% endfor %}
{% endfor %}

View file

@ -0,0 +1,5 @@
[{{ test_loop_inner.foo }}|
{% for inner in test_loop_inner.inner %}
[{{ test_loop_inner.foo }}|
{{ inner.myinner }}]
{% endfor %}]

View file

@ -0,0 +1,4 @@
{% for test_loop_inner in test_loop %}
[{{ test_loop_inner.foo }}
|{% INCLUDE 'loop_nested_include1_twig.html' %}]
{% endfor %}

View file

@ -0,0 +1,10 @@
top-level content
{% for outer_inner in outer %}
outer {{ outer_inner.VARIABLE }}
{% for inner in outer_inner.inner %}
inner {{ inner.VARIABLE }}
{% if inner.S_FIRST_ROW %}
first row
{% endif %}
{% endfor %}
{% endfor %}

View file

@ -0,0 +1,6 @@
{% for outer_inner in outer %}
outer - {{ outer_inner.S_ROW_COUNT }}{% if outer_inner.VARIABLE %} - {{ outer_inner.VARIABLE }}{% endif %}{% if TEST_MORE %}[{{ outer_inner.S_BLOCK_NAME }}|{{ outer_inner.S_NUM_ROWS }}]{% endif %}
{% for middle in outer_inner.middle %}
middle - {{ middle.S_ROW_COUNT }}{% if middle.VARIABLE %} - {{ middle.VARIABLE }}{% endif %}{% if TEST_MORE %}[{{ middle.S_BLOCK_NAME }}|{{ middle.S_NUM_ROWS }}]{% endif %}
{% endfor %}
{% endfor %}

View file

@ -0,0 +1,6 @@
{% for one_inner in one %}
{{ one_inner.VAR }}
{% for one_one_inner in one_inner.one %}
{{ one_one_inner.VAR }}
{% endfor %}
{% endfor %}

View file

@ -0,0 +1,39 @@
{% if nonexistent_loop|length %}
nonexistent
{% endif %}
{% if nonexistent_loop|length == 0 %}
nonexistent = 0
{% endif %}
{% if ! nonexistent_loop|length %}
! nonexistent
{% endif %}
{% if empty_loop|length %}
empty
{% endif %}
{% if empty_loop|length == 0 %}
empty = 0
{% endif %}
{% if ! empty_loop|length %}
! empty
{% endif %}
{% if test_loop|length %}
loop
{% endif %}
{% if test_loop|length == 0 %}
loop = 0
{% endif %}
{% if ! test_loop|length %}
! loop
{% endif %}
{% for test_loop_inner in test_loop %}
in loop
{% endfor %}

View file

@ -0,0 +1,21 @@
{% for test_loop_inner in test_loop %}
loop
{% else %}
noloop
{% endfor %}
{% if test_loop|length %}
loop
{% else %}
noloop
{% endif %}
{% if test_loop|length == 2 %}
loop
{% endif %}
{% for test_loop_inner in test_loop %}
{% for block_inner in block %}
loop#{{ test_loop_inner.S_ROW_COUNT }}-block#{{ block_inner.S_ROW_COUNT }}
{% endfor %}
{% endfor %}

View file

@ -0,0 +1,21 @@
{% for _underscore_loop_inner in _underscore_loop %}
loop
{% else %}
noloop
{% endfor %}
{% if _underscore_loop|length %}
loop
{% else %}
noloop
{% endif %}
{% if _underscore_loop|length == 2 %}
loop
{% endif %}
{% for _underscore_loop_inner in _underscore_loop %}
{% for block_inner in block %}
loop#{{ loop.S_ROW_COUNT }}-block#{{ block_inner.S_ROW_COUNT }}
{% endfor %}
{% endfor %}

View file

@ -0,0 +1,13 @@
{% for test_loop_inner in test_loop %}
{% if test_loop_inner.S_FIRST_ROW %}first{% endif %}
{{ test_loop_inner.S_ROW_NUM }} - a
{{ test_loop_inner.VARIABLE }} - b
{% if test_loop_inner.VARIABLE %}set{% endif %}
{% if test_loop_inner.S_LAST_ROW %}
last
{% endif %}
{% for inner_inner in test_loop_inner.inner %}
{{ inner_inner.S_ROW_NUM }} - c
{% if inner_inner.S_LAST_ROW and inner_inner.S_ROW_COUNT and inner_inner.S_NUM_ROWS %}last inner{% endif %}
{% endfor %}
{% endfor %}