Twig 템플릿에서 for 루프 내에서 중단 또는 계속을 사용하려면 어떻게해야합니까?
저는 간단한 루프를 사용하려고합니다. 실제 코드에서이 루프는 더 복잡하며 다음과 break
같은 반복이 필요합니다 .
{% for post in posts %}
{% if post.id == 10 %}
{# break #}
{% endif %}
<h2>{{ post.heading }}</h2>
{% endfor %}
Twig에서 PHP 제어 구조의 동작 break
또는 동작을 어떻게 사용할 수 continue
있습니까?
문서 TWIG 문서에서 :
PHP와 달리 루프에서 중단하거나 계속할 수 없습니다.
하지만 여전히 :
그러나 반복 중에 시퀀스를 필터링하여 항목을 건너 뛸 수 있습니다.
예제 1 (대용량 목록의 경우 slice ,를 사용하여 게시물을 필터링 할 수 있음 slice(start, length)
) :
{% for post in posts|slice(0,10) %}
<h2>{{ post.heading }}</h2>
{% endfor %}
예 2 :
{% for post in posts if post.id < 10 %}
<h2>{{ post.heading }}</h2>
{% endfor %}
다음 과 같이 더 복잡한 조건에 대해 자체 TWIG 필터 를 사용할 수도 있습니다 .
{% for post in posts|onlySuperPosts %}
<h2>{{ post.heading }}</h2>
{% endfor %}
이것은 반복에 대한 플래그로 새 변수를 설정하여 거의 수행 할 수 있습니다 break
.
{% set break = false %}
{% for post in posts if not break %}
<h2>{{ post.heading }}</h2>
{% if post.id == 10 %}
{% set break = true %}
{% endif %}
{% endfor %}
더 못 생겼지 만 작업 예 continue
:
{% set continue = false %}
{% for post in posts %}
{% if post.id == 10 %}
{% set continue = true %}
{% endif %}
{% if not continue %}
<h2>{{ post.heading }}</h2>
{% endif %}
{% if continue %}
{% set continue = false %}
{% endif %}
{% endfor %}
그러나 성능 이익 은 없으며 플랫 PHP와 같은 내장
break
및continue
명령문과 유사한 동작 만 있습니다.
@NHG 주석에서 — 완벽하게 작동합니다.
{% for post in posts|slice(0,10) %}
를 사용 {% break %}
하거나 {% continue %}
쓸 수있는 방법 은 TokenParser
s 를 쓰는 것입니다.
{% break %}
아래 코드 에서 토큰에 대해 수행했습니다 . 많은 수정없이 {% continue %}
.
AppBundle \ Twig \ AppExtension.php :
namespace AppBundle\Twig; class AppExtension extends \Twig_Extension { function getTokenParsers() { return array( new BreakToken(), ); } public function getName() { return 'app_extension'; } }
AppBundle \ Twig \ BreakToken.php :
namespace AppBundle\Twig; class BreakToken extends \Twig_TokenParser { public function parse(\Twig_Token $token) { $stream = $this->parser->getStream(); $stream->expect(\Twig_Token::BLOCK_END_TYPE); // Trick to check if we are currently in a loop. $currentForLoop = 0; for ($i = 1; true; $i++) { try { // if we look before the beginning of the stream // the stream will throw a \Twig_Error_Syntax $token = $stream->look(-$i); } catch (\Twig_Error_Syntax $e) { break; } if ($token->test(\Twig_Token::NAME_TYPE, 'for')) { $currentForLoop++; } else if ($token->test(\Twig_Token::NAME_TYPE, 'endfor')) { $currentForLoop--; } } if ($currentForLoop < 1) { throw new \Twig_Error_Syntax( 'Break tag is only allowed in \'for\' loops.', $stream->getCurrent()->getLine(), $stream->getSourceContext()->getName() ); } return new BreakNode(); } public function getTag() { return 'break'; } }
AppBundle \ Twig \ BreakNode.php :
namespace AppBundle\Twig; class BreakNode extends \Twig_Node { public function compile(\Twig_Compiler $compiler) { $compiler ->write("break;\n") ; } }
그런 다음 간단히 다음 {% break %}
과 같이 루프를 벗어나는 데 사용할 수 있습니다 .
{% for post in posts %}
{% if post.id == 10 %}
{% break %}
{% endif %}
<h2>{{ post.heading }}</h2>
{% endfor %}
To go even further, you may write token parsers for {% continue X %}
and {% break X %}
(where X is an integer >= 1) to get out/continue multiple loops like in PHP.
I have found a good work-around for continue (love the break sample above). Here I do not want to list "agency". In PHP I'd "continue" but in twig, I came up with alternative:
{% for basename, perms in permsByBasenames %}
{% if basename == 'agency' %}
{# do nothing #}
{% else %}
<a class="scrollLink" onclick='scrollToSpot("#{{ basename }}")'>{{ basename }}</a>
{% endif %}
{% endfor %}
OR I simply skip it if it doesn't meet my criteria:
{% for tr in time_reports %}
{% if not tr.isApproved %}
.....
{% endif %}
{% endfor %}
just try like this
{% for tr in time_reports %} {% if conditions %} ..... {% endif %} {% endfor %}
'programing' 카테고리의 다른 글
동일한 크기의 두 배열에서 Ruby 해시를 만드는 방법은 무엇입니까? (0) | 2020.09.20 |
---|---|
linq to SQL을 사용하여 한 번에 여러 행을 업데이트하는 방법은 무엇입니까? (0) | 2020.09.20 |
UITableView를 그룹화 스타일로 설정하는 방법 (0) | 2020.09.20 |
JDBC에서 DATETIME 값 0000-00-00 00:00:00 처리 (0) | 2020.09.20 |
HttpServletRequest에서 POST 요청 본문 가져 오기 (0) | 2020.09.20 |