الفرق بين المراجعتين لصفحة: «Twig/embed»
أسامه-دمراني (نقاش | مساهمات) طلا ملخص تعديل |
جميل-بيلوني (نقاش | مساهمات) طلا ملخص تعديل |
||
(1 مراجعات متوسطة بواسطة نفس المستخدم غير معروضة) | |||
سطر 1: | سطر 1: | ||
<noinclude>{{DISPLAYTITLE:الوسم embed في Twig}}</noinclude> | <noinclude>{{DISPLAYTITLE:الوسم embed في Twig}}</noinclude> | ||
يجمع وسم embed سلوك كل من الوسمين [[Twig/include|<code>include</code>]] و <code>[[Twig/extends|extends]]</code>، إذ يسمح لك بإدراج محتويات قالب آخر كما يفعل | يجمع وسم <code>embed</code> سلوك كل من الوسمين [[Twig/include|<code>include</code>]] و <code>[[Twig/extends|extends]]</code>، إذ يسمح لك بإدراج محتويات قالب آخر كما يفعل <code>[[Twig/include|include]]</code>، كذلك يسمح لك بتخطي أي كتلة معرفة داخل القالب المدرَج كما يحدث عند توسيع قالب ما، ويمكن النظر إلى القالب المضمَّن على أنه هيكل واجهة مصغر (micro layout skeleton). | ||
<syntaxhighlight lang="twig"> | <syntaxhighlight lang="twig"> | ||
{% embed "teasers_skeleton.twig" %} | {% embed "teasers_skeleton.twig" %} | ||
سطر 16: | سطر 16: | ||
انظر المثال المبسط التالي الذي يوضح حالة استخدام لوسم <code>embed</code>، والذي يُشارَك فيه قالب أساسي بواسطة عدة صفحات HTML، ويعرّف كتلة وحيدة اسمها "content":<syntaxhighlight lang="twig"> | انظر المثال المبسط التالي الذي يوضح حالة استخدام لوسم <code>embed</code>، والذي يُشارَك فيه قالب أساسي بواسطة عدة صفحات HTML، ويعرّف كتلة وحيدة اسمها "content":<syntaxhighlight lang="twig"> | ||
┌─── تخطيط الصفحة | ┌─── تخطيط الصفحة ───────────────────────┐ | ||
│ │ | │ │ | ||
│ ┌── "content" كتلة | │ ┌── "content" كتلة ────┐ │ | ||
│ │ │ │ | │ │ │ │ | ||
│ │ │ │ | │ │ │ │ | ||
│ │ (ضع قالبًا فرعيًا هنا)│ │ | │ │ (ضع قالبًا فرعيًا هنا) │ │ | ||
│ │ │ │ | │ │ │ │ | ||
│ │ │ │ | │ │ │ │ | ||
سطر 29: | سطر 29: | ||
</syntaxhighlight>تتشارك بعض الصفحات -لتكن "foo" و "bar"- نفس بنية المحتوى، وهي صندوقين رأسيين فوق بعضهما:<syntaxhighlight lang="twig"> | </syntaxhighlight>تتشارك بعض الصفحات -لتكن "foo" و "bar"- نفس بنية المحتوى، وهي صندوقين رأسيين فوق بعضهما:<syntaxhighlight lang="twig"> | ||
┌─── تخطيط الصفحة | ┌─── تخطيط الصفحة ───────────────────────┐ | ||
│ │ | │ │ | ||
│ ┌── "content" الكتلة | │ ┌── "content" الكتلة ────┐ │ | ||
│ │ ┌─ "top" الكتلة | │ │ ┌─ "top" الكتلة ─────┐ │ │ | ||
│ │ │ │ │ │ | │ │ │ │ │ │ | ||
│ │ └─────────────────┘ │ │ | │ │ └─────────────────┘ │ │ | ||
│ │ ┌ "bottom" الكتلة | │ │ ┌ "bottom" الكتلة ───┐ │ │ | ||
│ │ │ │ │ │ | │ │ │ │ │ │ | ||
│ │ └─────────────────┘ │ │ | │ │ └─────────────────┘ │ │ | ||
سطر 42: | سطر 42: | ||
└─────────────────────────────────────┘ | └─────────────────────────────────────┘ | ||
</syntaxhighlight>وتتشارك صفحات أخرى -مثل "boom" و "baz"- بنية مختلفة للمحتوى، على هيئة صندوقين متجاورين:<syntaxhighlight lang="twig"> | </syntaxhighlight>وتتشارك صفحات أخرى -مثل "boom" و "baz"- بنية مختلفة للمحتوى، على هيئة صندوقين متجاورين:<syntaxhighlight lang="twig"> | ||
┌─── تخطيط الصفحة | ┌─── تخطيط الصفحة ───────────────────────┐ | ||
│ │ | │ │ | ||
│ ┌── "content" الكتلة | │ ┌── "content" الكتلة ────┐ │ | ||
│ │ │ │ | │ │ │ │ | ||
│ │ ┌─ كتلة ┌ | │ │ ┌─ كتلة ┌ ┐── كتلة ───┐ │ │ | ||
│ │ │"left" │ │"right"│ │ │ | │ │ │"left" │ │"right"│ │ │ | ||
│ │ │ │ │ │ │ │ | │ │ │ │ │ │ │ │ | ||
سطر 62: | سطر 62: | ||
غير أن هاتين الطريقتين فيهما أوجه قصور كبيرة: | غير أن هاتين الطريقتين فيهما أوجه قصور كبيرة: | ||
فالطريقة الأولى وإن كانت ستنجح في هذا المثال البسيط، إلا أننا لو أضفنا شريطًا جانبيًا سيحتوي على هياكل أخرى مختلفة ومتكررة للمحتوى، فسنحتاج إلى إنشاء قوالب أساسية وسيطة لكل تجميعات هياكل المحتوى تلك، ولهيكل الشريط الجانبي، وهكذا. أما الطريقة الثانية فيدخل فيها تكرار لشيفرة مشتركة، وعيب ذلك أن أي تغيير سيعني إيجاد جميع نسخ الهيكل الذي تم عليه التغيير وتعديلها جميعًا، ويجب أن يحقَّق التصحيح في كل نسخة، وربما تخرج النسخ عن المزامنة بسبب تعديلات غير منضبطة، وهكذا. | * فالطريقة الأولى وإن كانت ستنجح في هذا المثال البسيط، إلا أننا لو أضفنا شريطًا جانبيًا سيحتوي على هياكل أخرى مختلفة ومتكررة للمحتوى، فسنحتاج إلى إنشاء قوالب أساسية وسيطة لكل تجميعات هياكل المحتوى تلك، ولهيكل الشريط الجانبي، وهكذا. | ||
* أما الطريقة الثانية فيدخل فيها تكرار لشيفرة مشتركة، وعيب ذلك أن أي تغيير سيعني إيجاد جميع نسخ الهيكل الذي تم عليه التغيير وتعديلها جميعًا، ويجب أن يحقَّق التصحيح في كل نسخة، وربما تخرج النسخ عن المزامنة بسبب تعديلات غير منضبطة، وهكذا. | |||
وهنا في مثل تلك الحالة تبرز أهمية وسم <code>embed</code>، إذ يمكن أن تظل شيفرة التخطيط المشتركة في قالب أساسي واحد، ثم تذهب هياكل المحتوى المختلفة التي يمكن أن نسميها هنا "تخطيطات مصغرة" إلى قوالب منفصلة تضمَّن عند الحاجة: | وهنا في مثل تلك الحالة تبرز أهمية وسم <code>embed</code>، إذ يمكن أن تظل شيفرة التخطيط المشتركة في قالب أساسي واحد، ثم تذهب هياكل المحتوى المختلفة التي يمكن أن نسميها هنا "تخطيطات مصغرة" إلى قوالب منفصلة تضمَّن عند الحاجة: | ||
سطر 106: | سطر 107: | ||
... | ... | ||
{% endembed %} | {% endembed %} | ||
</syntaxhighlight>انتبه إلى أن خطط التهريب التلقائي التي تبنى على أسماء القوالب لن تعمل كما تتوقع لها إذا غيرت السياق، بأن تضمِّن قالب CSS أو جافاسكربت مثلًا في قالب | </syntaxhighlight>انتبه إلى أن خطط التهريب التلقائي التي تبنى على أسماء القوالب لن تعمل كما تتوقع لها إذا غيرت السياق، بأن تضمِّن قالب [[CSS]] أو [[JavaScript|جافاسكربت]] مثلًا في قالب [[HTML]]، وذلك لأن القوالب المضمنة ليس لها أسماء. وفي مثل تلك الحالة، اضبط الخطة الافتراضية للتهريب التلقائي باستخدام وسم <code>[[Twig/autoescape|autoescape]]</code>. | ||
== انظر أيضًا == | == انظر أيضًا == | ||
* [[Twig/intro|مقدمة عن محرك القوالب Twig | * [[Twig/intro|مقدمة عن محرك القوالب Twig]] | ||
* [[Twig/include|الوسم include في Twig | * [[Twig/include|الوسم include في Twig]] | ||
== المصادر == | == المصادر == | ||
* [https://twig.symfony.com/doc/3.x/tags/embed.html صفحة الوسم embed في توثيق Twig الرسمي | * [https://twig.symfony.com/doc/3.x/tags/embed.html صفحة الوسم embed في توثيق Twig الرسمي] | ||
[[تصنيف:Twig]] | [[تصنيف:Twig]] | ||
[[تصنيف:Twig Tags]] | [[تصنيف:Twig Tags]] |
المراجعة الحالية بتاريخ 18:32، 5 مايو 2021
يجمع وسم embed
سلوك كل من الوسمين include
و extends
، إذ يسمح لك بإدراج محتويات قالب آخر كما يفعل include
، كذلك يسمح لك بتخطي أي كتلة معرفة داخل القالب المدرَج كما يحدث عند توسيع قالب ما، ويمكن النظر إلى القالب المضمَّن على أنه هيكل واجهة مصغر (micro layout skeleton).
{% embed "teasers_skeleton.twig" %}
{# "teasers_skeleton.twig" هذه الكتل معرفة في #}
{# ونحن نتخطاها من هنا: #}
{% block left_teaser %}
بعض المحتوى للصندوق الأيسر
{% endblock %}
{% block right_teaser %}
بعض المحتوى للصندوق الأيسر
{% endblock %}
{% endembed %}
ينقل الوسم embed
مبدأ وراثة القالب ليجعله على مستوى أجزاء المحتوى، فإن كانت وراثة القالب تسمح لك بإنشاء ما يشبه هياكل المستندات التي تُملأ بقوالب فرعية، فإن وسم embed
يسمح لك بإنشاء هياكل لوحدات صغيرة من المحتوى، وتعيد استخدامها في أي مكان تريد.
انظر المثال المبسط التالي الذي يوضح حالة استخدام لوسم embed
، والذي يُشارَك فيه قالب أساسي بواسطة عدة صفحات HTML، ويعرّف كتلة وحيدة اسمها "content":
┌─── تخطيط الصفحة ───────────────────────┐
│ │
│ ┌── "content" كتلة ────┐ │
│ │ │ │
│ │ │ │
│ │ (ضع قالبًا فرعيًا هنا) │ │
│ │ │ │
│ │ │ │
│ └─────────────────────┘ │
│ │
└─────────────────────────────────────┘
تتشارك بعض الصفحات -لتكن "foo" و "bar"- نفس بنية المحتوى، وهي صندوقين رأسيين فوق بعضهما:
┌─── تخطيط الصفحة ───────────────────────┐
│ │
│ ┌── "content" الكتلة ────┐ │
│ │ ┌─ "top" الكتلة ─────┐ │ │
│ │ │ │ │ │
│ │ └─────────────────┘ │ │
│ │ ┌ "bottom" الكتلة ───┐ │ │
│ │ │ │ │ │
│ │ └─────────────────┘ │ │
│ └─────────────────────┘ │
│ │
└─────────────────────────────────────┘
وتتشارك صفحات أخرى -مثل "boom" و "baz"- بنية مختلفة للمحتوى، على هيئة صندوقين متجاورين:
┌─── تخطيط الصفحة ───────────────────────┐
│ │
│ ┌── "content" الكتلة ────┐ │
│ │ │ │
│ │ ┌─ كتلة ┌ ┐── كتلة ───┐ │ │
│ │ │"left" │ │"right"│ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ └───────┘ └───────┘ │ │
│ └─────────────────────┘ │
│ │
└─────────────────────────────────────┘
سيكون لديك طريقتان تصمم بهما قوالبك من غير استخدام وسم embed
:
- إنشاء قالبين أساسيين وسيطين (intermediate) يوسعان تخطيط القالب الأصلي، واحد بصناديق رأسية لتستخدمه صفحتي
foo
وbar
، والآخر بصناديق جنبًا إلى جنب لتستخدمه صفحتيboom
وbaz
.
- تضمين ترميز الصناديق في قالب كل صفحة مباشرة.
غير أن هاتين الطريقتين فيهما أوجه قصور كبيرة:
- فالطريقة الأولى وإن كانت ستنجح في هذا المثال البسيط، إلا أننا لو أضفنا شريطًا جانبيًا سيحتوي على هياكل أخرى مختلفة ومتكررة للمحتوى، فسنحتاج إلى إنشاء قوالب أساسية وسيطة لكل تجميعات هياكل المحتوى تلك، ولهيكل الشريط الجانبي، وهكذا.
- أما الطريقة الثانية فيدخل فيها تكرار لشيفرة مشتركة، وعيب ذلك أن أي تغيير سيعني إيجاد جميع نسخ الهيكل الذي تم عليه التغيير وتعديلها جميعًا، ويجب أن يحقَّق التصحيح في كل نسخة، وربما تخرج النسخ عن المزامنة بسبب تعديلات غير منضبطة، وهكذا.
وهنا في مثل تلك الحالة تبرز أهمية وسم embed
، إذ يمكن أن تظل شيفرة التخطيط المشتركة في قالب أساسي واحد، ثم تذهب هياكل المحتوى المختلفة التي يمكن أن نسميها هنا "تخطيطات مصغرة" إلى قوالب منفصلة تضمَّن عند الحاجة:
قالب الصفحة foo.twig
:
{% extends "layout_skeleton.twig" %}
{% block content %}
{% embed "vertical_boxes_skeleton.twig" %}
{% block top %}
بعض المحتوى للصندوق العلوي
{% endblock %}
{% block bottom %}
بعض المحتوى للصندوق السفلي
{% endblock %}
{% endembed %}
{% endblock %}
وفيما يلي شيفرة vertical_boxes_skeleton.twig
:
<div class="top_box">
{% block top %}
المحتوى الافتراضي للصندوق العلوي
{% endblock %}
</div>
<div class="bottom_box">
{% block bottom %}
المحتوى الافتراضي للصندوق السفلي
{% endblock %}
</div>
والهدف من قالب vertical_boxes_skeleton.twig
هو استبعاد ترميز HTML من الصناديق.
يأخذ الوسم embed
نفس الوسائط التي يأخذها الوسم include
:
{% embed "base" with {'foo': 'bar'} %}
...
{% endembed %}
{% embed "base" with {'foo': 'bar'} only %}
...
{% endembed %}
{% embed "base" ignore missing %}
...
{% endembed %}
انتبه إلى أن خطط التهريب التلقائي التي تبنى على أسماء القوالب لن تعمل كما تتوقع لها إذا غيرت السياق، بأن تضمِّن قالب CSS أو جافاسكربت مثلًا في قالب HTML، وذلك لأن القوالب المضمنة ليس لها أسماء. وفي مثل تلك الحالة، اضبط الخطة الافتراضية للتهريب التلقائي باستخدام وسم autoescape
.