php मैं टवीग टेम्पलेट में लूप के लिए ब्रेक का उपयोग कैसे कर सकता हूं या जारी रख सकता हूं?




symfony for-loop (4)

मैं अपने असली कोड में एक साधारण पाश का उपयोग करने की कोशिश करता हूं, यह लूप अधिक जटिल है, और मुझे इस पुनरावृत्ति को break जरूरत है:

{% for post in posts %}
    {% if post.id == 10 %}
        {# break #}
    {% endif %}
    <h2>{{ post.heading }}</h2>
{% endfor %}

मैं break व्यवहार का उपयोग कैसे कर सकता हूं या continue में PHP नियंत्रण संरचनाओं को continue सकता हूं?


दस्तावेज़ों से TWIG docs :

PHP में विपरीत, लूप में तोड़ना या जारी रखना संभव नहीं है।

फिर भी:

हालांकि आप पुनरावृत्ति के दौरान अनुक्रम फ़िल्टर कर सकते हैं जो आपको वस्तुओं को छोड़ने की अनुमति देता है।

उदाहरण:

{% 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 %}

लेकिन इसमें कोई प्रदर्शन लाभ नहीं है, अंतर्निहित break लिए केवल समान व्यवहार है और फ्लैट PHP में बयान continue


मुझे जारी रखने के लिए एक अच्छा काम मिल गया है (उपरोक्त ब्रेक नमूना प्यार करें)। यहां मैं "एजेंसी" सूचीबद्ध नहीं करना चाहता हूं। PHP में मैं "जारी रखूंगा" लेकिन टहलने में, मैं वैकल्पिक के साथ आया था:

{% 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 %}

{% break %} या {% continue %} का उपयोग करने में सक्षम होने का एक तरीका उनके लिए TokenParser लिखना है।

मैंने इसे नीचे दिए गए कोड में {% break %} टोकन के लिए किया था। आप बिना किसी संशोधन के कर सकते हैं, {% continue %} लिए वही काम {% continue %}

  • ऐपबंडल \ Twig \ AppExtension.php :

    namespace AppBundle\Twig;
    
    class AppExtension extends \Twig_Extension
    {
        function getTokenParsers() {
            return array(
                new BreakToken(),
            );
        }
    
        public function getName()
        {
            return 'app_extension';
        }
    }
    
  • ऐपबंडल \ 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';
        }
    }
    
  • ऐपबंडल \ 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 %}

आगे जाने के लिए, आप PHP में कई लूप को बाहर / जारी रखने के लिए {% continue X %} और {% break X %} (जहां एक्स एक पूर्णांक> = 1) के लिए टोकन पार्सर्स लिख सकते हैं।







break