টাগিতে একটি গাছ কীভাবে রেন্ডার করা যায়


90

আমি একটি নির্ধারিত গভীরতা (শিশুদের বাচ্চাদের সন্তান ইত্যাদি) সহ একটি গাছ রেন্ডার করতে চাই। আমি পুনরাবৃত্তভাবে অ্যারে মাধ্যমে লুপ করা প্রয়োজন; আমি এটি ট্যুইগ এ কিভাবে করতে পারি?

উত্তর:


117

আমি domi27 এর ধারণাটি নিয়ে প্রায় খেলেছি এবং এটি নিয়ে এসেছি। আমি আমার গাছ হিসাবে একটি নেস্টেড অ্যারে তৈরি করেছি, ['লিঙ্ক'] ['সাবলিঙ্কস]] নাল বা একইরকম আরও একটি অ্যারে।

টেম্পলেট

এর সাথে পুনরাবৃত্তি করতে সাব-টেম্পলেট ফাইল:

<!--includes/menu-links.html-->
{% for link in links %}
    <li>
        <a href="{{ link.href }}">{{ link.name }}</a>
        {% if link.sublinks %}
            <ul>
                {% include "includes/menu-links.html" with {'links': link.sublinks} %}
            </ul>
        {% endif %}
    </li>
{% endfor %}

তারপরে মূল টেমপ্লেটে, এটিকে (সেখানে 'স্টাফ সহ ধরণের' রিডানড্যান্ট) বলুন:

<ul class="main-menu">
    {% include "includes/menu-links.html" with {'links':links} only %}
</ul>

ম্যাক্রোস

অনুরূপ প্রভাব ম্যাক্রোগুলির সাহায্যে অর্জন করা যেতে পারে:

<!--macros/menu-macros.html-->
{% macro menu_links(links) %}
    {% for link in links %}
        <li>
            <a href="{{ link.href }}">{{ link.name }}</a>
            {% if link.sublinks %}
                <ul>
                    {{ _self.menu_links(link.sublinks) }}
                </ul>
            {% endif %}
        </li>
    {% endfor %}
{% endmacro %}

মূল টেমপ্লেটে, এটি করুন:

{% import "macros/menu-macros.html" as macros %}
<ul class="main-menu">
    {{ macros.menu_links(links) }}
</ul>

9
খুব ভালো ধন্যবাদ তোমাকে! আপনি যদি একই টেমপ্লেটে ম্যাক্রো ব্যবহার করতে চান তবে আপনি ব্যবহার করতে পারেন {{ _self.menu_links(links) }}
ফ্লু

আপনাকে ধন্যবাদ, এই চিন্তা আমার মস্তিস্ককে আঘাত করেছে কিন্তু আপনার উত্তরটি সঠিকভাবে বোঝায়।
azzy81

আমার প্রকল্পের সাথে মন্তব্য সহ আমার একটি সমস্যা ছিল। সাব কমেন্টস (সাবলিঙ্কগুলি) প্রধান সংগ্রহের (লিঙ্কগুলি) অন্তর্ভুক্ত ছিল। সুতরাং অন্তর্ভুক্ত করার আগে আমাকে মন্তব্যটির 'প্যারেন্ট' প্রবেশ করেছে কিনা তা পরীক্ষা করে দেখতে হয়েছিল।
জেভেগেনি স্মিরনভ

4
ব্যবহার {{_self.menu_links}}করা একটি খারাপ অভ্যাস ! এখানে একটি নোট পড়ুন: ম্যাক্রো যখন আপনি যে টেম্পলেটটি ব্যবহার করতে যাচ্ছেন সেখানে কোনও ম্যাক্রো সংজ্ঞায়িত করেন, আপনি ম্যাক্রোটিকে আমদানির পরিবর্তে সরাসরি _self.input () এর মাধ্যমে কল করতে প্ররোচিত হতে পারেন; এমনকি যদি মনে হয় এটি কাজ করে তবে এটি বর্তমান প্রয়োগের কেবলমাত্র একটি পার্শ্ব-প্রতিক্রিয়া এবং এটি টুইগ ২.x-এ আর কাজ করবে না। আপনার স্থানীয়ভাবে ম্যাক্রোসগুলি আবার আমদানি করা উচিতmenu_links
dr.scre

37

টুইগ 2.0 - 2.11

আপনি যদি একই টেমপ্লেটে ম্যাক্রো ব্যবহার করতে চান তবে আপনার টুইগ ২.x এর সাথে সামঞ্জস্য রাখতে এমন কিছু ব্যবহার করা উচিত :

{% macro menu_links(links) %}
    {% import _self as macros %}
    {% for link in links %}
        <li>
            <a href="{{ link.href }}">{{ link.name }}</a>
            {% if link.sublinks %}
                <ul>
                    {{ macros.menu_links(link.sublinks) }}
                </ul>
            {% endif %}
        </li>
    {% endfor %}
{% endmacro %}

{% import _self as macros %}

<ul class="main-menu">
    {{ macros.menu_links(links) }}
</ul>

এটির random-coderউত্তর প্রসারিত করে এবং ম্যাক্রোগুলি সম্পর্কে এখন টগিগ ডকুমেন্টেশনেরdr.scre ইঙ্গিত অন্তর্ভুক্ত করে_self তবে স্থানীয়ভাবে আমদানি করে।

টুইগ> = 2.11

ট্যুইগ ২.১১ হিসাবে , আপনি {% import _self as macros %}নামটি বাদ দিতে পারেন যেহেতু ইনলাইনড ম্যাক্রোগুলি স্বয়ংক্রিয়ভাবে _selfনেমস্পেসের অধীনে আমদানি করা হয় ( টুইগের ঘোষণা দেখুন: স্বয়ংক্রিয় ম্যাক্রো আমদানি ):

{# {% import _self as macros %} - Can be removed #}

<ul class="main-menu">
    {{ _self.menu_links(links) }} {# Use _self for inlined macros #}
</ul>

2

আপনি যদি পিএইচপি 5.4 বা ততোধিক চলমান হন, তবে আলাইন টাইম্বলো দ্বারা এই সমস্যার একটি দুর্দান্ত নতুন সমাধান রয়েছে (মে ২০১ of হিসাবে): https://github.com/ninsuo/jordan-tree

এটি একটি "ট্রি" ট্যাগ যা এই সঠিক উদ্দেশ্যে কাজ করে। মার্কআপ এর মতো দেখতে পাবেন:

{% tree link in links %}
    {% if treeloop.first %}<ul>{% endif %}

    <li>
        <a href="{{ link.href }}">{{ link.name }}</a>
        {% subtree link.sublinks %}
    </li>

    {% if treeloop.last %}</ul>{% endif %}
{% endtree %}

4
আপনি অতিরিক্ত ভেরিয়েবল এতে পাস করতে পারবেন না subtree। আমার ক্ষেত্রে, কোডটি আরও শিশু থাকবে কিনা তা জানতে হবে এবং এটি ম্যাক্রোতে স্তরের সংখ্যাটি পাস করে যাতে এটি একটি করতে পারে <div class="{{ classes[current_level].wrapper }} {% if levels > current_level %}accordion-wrapper{% endif %}">। এটিকে গণনা করার জন্য কোনও বাচ্চা আছে কিনা তা ক্যাপচারের জন্য বর্তমান স্তরের দ্বিতীয়বার পুনরাবৃত্তি প্রয়োজন।
chx

1

প্রথমে আমি ভেবেছিলাম এটি সোজা উপায়ে সমাধান করা যেতে পারে তবে এটি এত সহজ নয়।

আপনার কোনও যুক্তি তৈরি করতে হবে, সম্ভবত কোনও পিএইচপি ক্লাস পদ্ধতিতে, কখন একটি ট্যুইগ সাবটেম্পলেট অন্তর্ভুক্ত করা উচিত এবং কখন নয়।

<!-- tpl.html.twig -->
<ul>
    {% for key, item in menu %}
        {# Pseudo Twig code #}
        {% if item|hassubitem %}
            {% include "subitem.html.tpl" %}
        {% else %}
            <li>{{ item }}</li>
        {% endif %}
    {% endfor %}
</ul>

সুতরাং আপনি বিশেষ টুইগ লুপ ভেরিয়েবলটি ব্যবহার করতে পারেন , যা লুপের জন্য একটি টুইগের অভ্যন্তরে উপলব্ধ । তবে আমি এই লুপ ভেরিয়েবলের সুযোগ সম্পর্কে নিশ্চিত নই ।

"ডকু" এর জন্য এটি এবং অন্যান্য তথ্য টুইগস-এ উপলব্ধ !



-1

উত্তরগুলি এখানে আমার সমাধানের দিকে নিয়ে যায়।

আমার একটি স্ব-রেফারেন্সিং বহু-থেকে-এক সমিতি (শিশুদের কাছে পিতামাতার) সহ একটি বিভাগের সত্তা রয়েছে।

/**
 * @ORM\ManyToOne(targetEntity="Category", inversedBy="children")
 */
private $parent;

/**
 * @ORM\OneToMany(targetEntity="Category", mappedBy="parent")
 */
private $children;

আমার টুইগ টেমপ্লেটে আমি গাছের ভিউটিকে এভাবে উপস্থাপন করছি:

<ul>
{% for category in categories %}
    {% if category.parent == null %}
        <li>
            <a href="{{ category.id }}">{{ category.name }}</a>
            {% if category.children|length > 0 %}
            <ul>
            {% for category in category.children %}
                <li>
                    <a href="{{ category.id }}">{{ category.name }}</a>
                </li>
            {% endfor %}
            </ul>
            {% endif %}
        </li>
    {% endif %}
{% endfor %}
</ul>

আপনার যদি বিভাগের স্তরক্রমের একাধিক স্তর থাকে?
২:15
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.