টুইগ টেমপ্লেটে লুপের জন্য আমি কীভাবে বিরতি ব্যবহার করতে বা চালিয়ে যেতে পারি?


98

আমি একটি সাধারণ লুপ ব্যবহার করার চেষ্টা করি, আমার বাস্তব কোডটিতে এই লুপটি আরও জটিল এবং আমার breakএই পুনরাবৃত্তির মতো প্রয়োজন:

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

আমি আচরণকে কীভাবে ব্যবহার করতে পারেন breakবা continueপল্লব মধ্যে পিএইচপি নিয়ন্ত্রণ স্ট্রাকচার?

উত্তর:


130

এটি পুনরুক্তিতে একটি পতাকা হিসাবে একটি নতুন ভেরিয়েবল সেট করে প্রায় সম্পন্ন করা যেতে পারে 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বিবৃতিগুলির মতো ফ্ল্যাট পিএইচপি।


4
এটা কার্যকরী. আমার ক্ষেত্রে আমার প্রথম ফলাফলটি দেখানো / নেওয়া দরকার। টুইগের কেবল প্রথম মানটি পাওয়ার কোনও উপায় আছে? এটি কেবলমাত্র ভাল পারফরম্যান্সের উদ্দেশ্যে।
পাঠ্রোস

4
@ পাথ্রস প্রথম মান পেতে, firstটুইগ ফিল্টারটি ব্যবহার করুন : twig.sensiolabs.org/doc/filters/first.html
ভিক্টর বোচারস্কি

4
নোটটি ভালোবাসি। আমার শেষ 10 মিনিট এমন চেষ্টা করার চেষ্টা করছিল যা সত্যিই সহায়ক নয়: ডি
ট্রি এনগুইন

4
এটি লক্ষণীয় যে এটি কোড প্রয়োগকে ভঙ্গ করবে না , নীচে কিছু set break = trueকার্যকর করা হবে যদি না আপনি এটি elseবিবৃতিতে না রাখেন । Twigfiddle.com/euio5w
গাস

4
@ গুস ইয়েপ, এই কারণেই যদি আমি এই বিবৃতিটি set break = trueএকেবারে শেষের সাথে রেখেছিলাম তবে আমি তার অর্থ দিচ্ছিলাম । তবে হ্যাঁ, এটি আপনার কোডের উপর নির্ভর করে, সুতরাং এটি স্পষ্ট করে উল্লেখ করার জন্য ধন্যবাদ
ভিক্টর বোচারস্কি

123

TWIG ডক্স থেকে ডক্স :

পিএইচপি এর বিপরীতে, লুপে ভাঙ্গা বা চালিয়ে যাওয়া সম্ভব নয়।

কিন্তু এখনো:

তবে আপনি পুনরাবৃত্তির সময় ক্রমটি ফিল্টার করতে পারেন যা আপনাকে আইটেমগুলি এড়িয়ে যেতে দেয়।

উদাহরণ 1 (বিশাল তালিকার জন্য আপনি ব্যবহার পোস্ট ফিল্টার করতে পারেন ফালি , 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 %}

28
এছাড়াও যদি আপনি 10 টি পুনরাবৃত্তির পরেও ব্রেক ব্রেকটি পেতে চান তবে আপনি এই জাতীয় ব্যবহার করতে পারেন:{% for post in posts|slice(0,10) %}
এনএইচজি

5
ঠিক আছে, ধন্যবাদ, Unlike in PHP, it's not possible to break or continue in a loop.ডক্সগুলি পড়ার সময় আমি সম্ভবত মিস করেছি । তবে আমি মনে করি breakএবং continueএটি একটি ভাল বৈশিষ্ট্য, যা যুক্ত করা দরকার
ভিক্টর বোচারস্কি

আপনি লুপ বিবৃতিতে লুপ ভেরিয়েবল অ্যাক্সেস করতে পারবেন না!
ম্যাক্সিমাস

কাজ করে না দীর্ঘ তালিকা, forপ্রথম হিট পরে ব্রেক করা উচিত। @ ভিক্টর বোচারস্কির উত্তরটি সঠিক
ভ্যাসিলি সুরিকভ

@ ভ্যাসিলিসুরিকভ আপনি {% for post in posts|slice(0,10) %}বিশাল তালিকাতে ব্যবহার করতে পারেন । আমার প্রথম মন্তব্য দেখুন। আমি আমার উত্তর আপডেট করেছি।
এনএইচজি

12

একটি উপায় ব্যবহার করতে পাবে {% break %}বা {% continue %}লিখতে হয় TokenParserতাদের জন্য সে।

আমি {% break %}নীচের কোডটিতে টোকেনের জন্য এটি করেছি । আপনি, খুব বেশি পরিবর্তন ছাড়াই, একই জিনিসটি করতে পারেন {% continue %}

  • অ্যাপবান্ডেল \ টুইগ \ অ্যাপেক্সটেনশন.এফপি :

    namespace AppBundle\Twig;
    
    class AppExtension extends \Twig_Extension
    {
        function getTokenParsers() {
            return array(
                new BreakToken(),
            );
        }
    
        public function getName()
        {
            return 'app_extension';
        }
    }
    
  • অ্যাপবান্ডেল \ টুইগ \ ব্রেকটোকেন.এফপি :

    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';
        }
    }
    
  • অ্যাপবান্ডেল \ টুইগ \ ব্রেকনোড.এফপি :

    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 %}(যেখানে এক্স একটি পূর্ণসংখ্যক = = 1) এর জন্য টোকেন পার্সার লিখতে পারেন


10
এটা ঠিক ওভারকিল। টুইগ লুপগুলি বিরতি সমর্থন করে এবং দেশীয়ভাবে চালিয়ে যাওয়া উচিত।
ক্রাফার

আপনি যদি ফিল্টার ব্যবহার করতে / না করতে চান তবে এটি দুর্দান্ত।
ড্যানিয়েল ডিহার্স্ট

squirrelphp/twig-php-syntaxগ্রন্থাগার প্রদান করে {% break %}, {% break n %}এবং {% continue %}টোকেন।
এমটিস

@ এমটিএসএনএন এবং লেখকরা এই উত্তরটির জন্য যে কোডটি লিখেছিলেন তা ব্যবহার ও উন্নত করেছে!
জুলুস লামুর

@ জুলেস লামুর, আপনি "@ এমটিএসএনএন এবং লেখক" বলেছেন, কিন্তু আমি সেই লাইব্রেরির সাথে জড়িত নই।
এমটিস

9

@ এনএইচজি মন্তব্য থেকে - নিখুঁতভাবে কাজ করে

{% for post in posts|slice(0,10) %}

@ বাসিট যদি পোস্টগুলি তারিখ অনুসারে অর্ডার করা হয়?
ভাসিলি সুরিকভ

6

অবিরত করার জন্য আমি একটি ভাল কাজ খুঁজে পেয়েছি (উপরের ব্রেকের নমুনা পছন্দ করুন)। এখানে আমি "সংস্থা" তালিকাবদ্ধ করতে চাই না। পিএইচপি-তে আমি "চালিয়ে যাব" তবে দ্বিগুণ, আমি বিকল্প নিয়ে এসেছি:

{% 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 %}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.