Twig 템플릿에서 break 또는 continue in for loop을 사용하려면 어떻게 해야 하나요?
간단한 루프를 사용하려고 합니다.실제 코드에서는 이 루프가 더 복잡하기 때문에break
다음과 같은 반복:
{% for post in posts %}
{% if post.id == 10 %}
{# break #}
{% endif %}
<h2>{{ post.heading }}</h2>
{% endfor %}
의 동작을 사용하려면 어떻게 해야 합니까?break
또는continue
PHP 제어 구조를 Twig에 포함합니까?
이것은 새로운 변수를 플래그로 설정하여 거의 실행할 수 있습니다.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 %}
그러나 성능 이익은 없고 기본 제공과 유사한 동작만 있습니다.
break
그리고.continue
plat PHP와 같은 문장이 있습니다.
docs TWIG 2.x docs:
PHP와 달리 루프를 중단하거나 계속할 수 없습니다.
하지만 여전히:
그러나 반복 중에 순서를 필터링하여 항목을 건너뛸 수 있습니다.
예 1(대규모 리스트의 경우 슬라이스를 사용하여 투고를 필터링할 수 있습니다.slice(start, length)
):
{% for post in posts|slice(0,10) %}
<h2>{{ post.heading }}</h2>
{% endfor %}
예 2는 TWIG 3.0도 동작합니다.
{% 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 %}
또는{% continue %}
쓰는 것이다TokenParser
그들을 위한 것입니다.
내가 한 건{% break %}
토큰을 아래 코드에 입력해 주세요.많은 수정 없이 동일한 작업을 수행할 수 있습니다.{% continue %}
.
AppBundle\트위그\앱내선번호php:
namespace AppBundle\Twig; class AppExtension extends \Twig_Extension { function getTokenParsers() { return array( new BreakToken(), ); } public function getName() { return 'app_extension'; } }
AppBundle\트위그\브레이크Token.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 %}
더 나아가 토큰 파서를 작성할 수 있습니다.{% continue X %}
그리고.{% break X %}
(여기서 X는 정수 > = 1) PHP에서처럼 여러 루프를 출력/출력합니다.
@NHG 코멘트로부터 - 완벽하게 동작합니다.
{% for post in posts|slice(0,10) %}
계속하기 위한 좋은 해결 방법을 찾았습니다(위의 브레이크 샘플이 마음에 듭니다).여기서 나는 "대리점"을 나열하고 싶지 않다.PHP에서는 "계속"하고 싶지만, twig에서는 대안을 생각해냈습니다.
{% for basename, perms in permsByBasenames %}
{% if basename == 'agency' %}
{# do nothing #}
{% else %}
<a class="scrollLink" onclick='scrollToSpot("#{{ basename }}")'>{{ basename }}</a>
{% endif %}
{% endfor %}
또는 기준에 맞지 않으면 건너뜁니다.
{% for tr in time_reports %}
{% if not tr.isApproved %}
.....
{% endif %}
{% endfor %}
언급URL : https://stackoverflow.com/questions/21672796/how-can-i-use-break-or-continue-within-for-loop-in-twig-template
'programing' 카테고리의 다른 글
테이블의 일부 특정 항목에서 다른 테이블의 열 값을 사용하여 열을 업데이트합니다. (0) | 2023.01.03 |
---|---|
프로그래밍 방식으로 리소스 디렉터리 경로를 가져오는 방법 (0) | 2023.01.03 |
내장 MariaDB C/C++ API (0) | 2023.01.03 |
MariaDB 쿼리 열을 JSON으로 변환 (0) | 2023.01.03 |
장인 마이그레이션 오류 "Class 'Doctrine\"DBAL\\드라이버\\PDOMySql\\Driver를 찾을 수 없습니다.", (0) | 2023.01.03 |