আমি একটি নির্ধারিত গভীরতা (শিশুদের বাচ্চাদের সন্তান ইত্যাদি) সহ একটি গাছ রেন্ডার করতে চাই। আমি পুনরাবৃত্তভাবে অ্যারে মাধ্যমে লুপ করা প্রয়োজন; আমি এটি ট্যুইগ এ কিভাবে করতে পারি?
উত্তর:
আমি 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>
{{_self.menu_links}}
করা একটি খারাপ অভ্যাস ! এখানে একটি নোট পড়ুন: ম্যাক্রো যখন আপনি যে টেম্পলেটটি ব্যবহার করতে যাচ্ছেন সেখানে কোনও ম্যাক্রো সংজ্ঞায়িত করেন, আপনি ম্যাক্রোটিকে আমদানির পরিবর্তে সরাসরি _self.input () এর মাধ্যমে কল করতে প্ররোচিত হতে পারেন; এমনকি যদি মনে হয় এটি কাজ করে তবে এটি বর্তমান প্রয়োগের কেবলমাত্র একটি পার্শ্ব-প্রতিক্রিয়া এবং এটি টুইগ ২.x-এ আর কাজ করবে না। আপনার স্থানীয়ভাবে ম্যাক্রোসগুলি আবার আমদানি করা উচিতmenu_links
আপনি যদি একই টেমপ্লেটে ম্যাক্রো ব্যবহার করতে চান তবে আপনার টুইগ ২.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
তবে স্থানীয়ভাবে আমদানি করে।
ট্যুইগ ২.১১ হিসাবে , আপনি {% 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>
আপনি যদি পিএইচপি 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 %}
subtree
। আমার ক্ষেত্রে, কোডটি আরও শিশু থাকবে কিনা তা জানতে হবে এবং এটি ম্যাক্রোতে স্তরের সংখ্যাটি পাস করে যাতে এটি একটি করতে পারে <div class="{{ classes[current_level].wrapper }} {% if levels > current_level %}accordion-wrapper{% endif %}">
। এটিকে গণনা করার জন্য কোনও বাচ্চা আছে কিনা তা ক্যাপচারের জন্য বর্তমান স্তরের দ্বিতীয়বার পুনরাবৃত্তি প্রয়োজন।
প্রথমে আমি ভেবেছিলাম এটি সোজা উপায়ে সমাধান করা যেতে পারে তবে এটি এত সহজ নয়।
আপনার কোনও যুক্তি তৈরি করতে হবে, সম্ভবত কোনও পিএইচপি ক্লাস পদ্ধতিতে, কখন একটি ট্যুইগ সাবটেম্পলেট অন্তর্ভুক্ত করা উচিত এবং কখন নয়।
<!-- 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>
সুতরাং আপনি বিশেষ টুইগ লুপ ভেরিয়েবলটি ব্যবহার করতে পারেন , যা লুপের জন্য একটি টুইগের অভ্যন্তরে উপলব্ধ । তবে আমি এই লুপ ভেরিয়েবলের সুযোগ সম্পর্কে নিশ্চিত নই ।
"ডকু" এর জন্য এটি এবং অন্যান্য তথ্য টুইগস-এ উপলব্ধ !
টুক ফ্লু এর উত্তর এবং এটি একটি সামান্য সংশোধিত:
{# Macro #}
{% macro tree(items) %}
{% import _self as m %}
{% if items %}
<ul>
{% for i in items %}
<li>
<a href="{{ i.url }}">{{ i.title }}</a>
{{ m.tree(i.items) }}
</li>
{% endfor %}
</ul>
{% endif %}
{% endmacro %}
{# Usage #}
{% import 'macros.twig' as m %}
{{ m.tree(items) }}
উত্তরগুলি এখানে আমার সমাধানের দিকে নিয়ে যায়।
আমার একটি স্ব-রেফারেন্সিং বহু-থেকে-এক সমিতি (শিশুদের কাছে পিতামাতার) সহ একটি বিভাগের সত্তা রয়েছে।
/**
* @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>
{{ _self.menu_links(links) }}
।