الفرق بين المراجعتين لصفحة: «Twig/default»
أسامه-دمراني (نقاش | مساهمات) 1.0: إضافة عنوان الصفحة. |
أسامه-دمراني (نقاش | مساهمات) مسودة أولية للاختبار. |
||
سطر 1: | سطر 1: | ||
<noinclude>{{DISPLAYTITLE: الفلتر default في Twig}}</noinclude> | <noinclude>{{DISPLAYTITLE: الفلتر default في Twig}}</noinclude> | ||
يع{{DISPLAYTITLE: الفلتر default في Twig}}يد المرشح default القيمة الافتراضية الممررة إليه إذا كانت غير معرفة أو فارغة، وإلا فإنه يعيد قيمة المتغير:<syntaxhighlight lang="twig"> | |||
{{ var|default('var is not defined') }} | |||
{{ var.foo|default('foo item on var is not defined') }} | |||
{{ var['foo']|default('foo item on var is not defined') }} | |||
{{ ''|default('passed var is empty') }} | |||
</syntaxhighlight>إذا استُخدم default على تعبير يستخدم المتغيرات في بعض استدعاءات التوابع فتأكد أن تستخدمه في كل حالة يكون المتغير فيها غير معرف:<syntaxhighlight lang="twig"> | |||
{{ var.method(foo|default('foo'))|default('foo') }} | |||
</syntaxhighlight>قد يطلِق استخدام المرشح <code>default</code> على قيمة بوليانية سلوكًا غير متوقع، وذلك لأن <code>false</code> تعامَل كقيمة فارغة، وعندئذ استخدم <code>??</code>:<syntaxhighlight lang="twig"> | |||
{% set foo = false %} | |||
{{ foo|default(true) }} {# true #} | |||
{{ foo ?? true }} {# false #} | |||
</syntaxhighlight> | |||
== الوسائط == | |||
default: القيمة الافتراضية | |||
---- | |||
<nowiki><noinclude>{{DISPLAYTITLE: المرشح escape في Twig}}</nowiki><nowiki></noinclude></nowiki> | |||
يهرِّب المرشح escape سلسلة نصية باستخدام خطط تعتمد على السياق، وهي تستخدم خطة تهريب HTML افتراضيًا:<syntaxhighlight lang="twig"> | |||
<p> | |||
{{ user.username|escape }} | |||
</p> | |||
</syntaxhighlight>يعرَّف المرشح باسم بديل هو <code>e</code> من أجل التيسير وتوفير الوقت:<syntaxhighlight lang="twig"> | |||
<p> | |||
{{ user.username|e }} | |||
</p> | |||
</syntaxhighlight>يمكن استخدام المرشح escape في سياقات أخرى كذلك غير HTML مستفيدين من وسيط اختياري يعرّف خطة التهريب التي يجب استخدامها:<syntaxhighlight lang="twig"> | |||
{{ user.username|e }} | |||
{# يكافئ #} | |||
{{ user.username|e('html') }} | |||
</syntaxhighlight>انظر كيف يمكن تهريب المتغيرات المدرَجة في شيفرة جافاسكربت:<syntaxhighlight lang="twig"> | |||
{{ user.username|escape('js') }} | |||
{{ user.username|e('js') }} | |||
</syntaxhighlight>يدعم المرشح escape خطط التهريب التالية لمستندات HTML: | |||
* <code>html</code>: يهرب سلسلة نصية لسياق '''متن HTML.''' | |||
* <code>js</code>: تهرب سلسلة نصية لسياق '''جافاسكربت'''. | |||
* <code>css</code>: تهرب سلسلة نصية لسياق CSS. يمكن تطبيق تهريب css على أي سلسلة نصية تُدخل في CSS، وتهرِّب كل شيء عدا الأحرف والأرقام. | |||
* <code>url</code>: تهرب سلسلة نصية لمحدد الموارد الموحد (URI)، ولا يُدخل إلا مكونٌ فرعي. | |||
* <code>html_attr</code>: تهرب سلسلة نصية لسياق '''سمة HTML.''' | |||
لاحظ أن التهريب السياقي في مستندات HTML يصعب تنفيذه، ويتوقف اختيار خطة التهريب المناسبة على عوامل كثيرة، فانظر توثيقًا مثل [https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.md the OWASP prevention cheat sheet] لتعلم المزيد عن الأمر.<blockquote>لاحظ أن المرشح escape يستخدم دالة [https://secure.php.net/htmlspecialchars htmlspecialchars] الخاصة بلغة PHP من أجل خطة تهريب HTML. </blockquote>انتبه عند استخدام التهريب التلقائي إذ أن Twig يحاول ألا يهرب متغيرًا تهريبًا مضاعفًا (double-escape) إذا كانت خطة التهريب التلقائية هي نفسها التي يستخدمها مرشح escape، لكن ذلك لا يعمل عند استخدام متغير ما كخطة تهريب:<syntaxhighlight lang="twig"> | |||
{% set strategy = 'html' %} | |||
{% autoescape 'html' %} | |||
{{ var|escape('html') }} {# لن يهرَّب تهريبًا مضاعفًا #} | |||
{{ var|escape(strategy) }} {# سيهرَّب تهريبًا مضاعفًا #} | |||
{% endautoescape %} | |||
</syntaxhighlight>التهريب التلقائي يجب أن يعطَّل عند استخدام متغير كخطة تهريب:<syntaxhighlight lang="twig"> | |||
{% set strategy = 'html' %} | |||
{% autoescape 'html' %} | |||
{{ var|escape(strategy)|raw }} {# won't be double-escaped #} | |||
{% endautoescape %} | |||
</syntaxhighlight> | |||
== المهرِّبات الخاصة == | |||
تستطيع تعريف مهربات خاصة باستدعاء التابع <code>setEscaper()</code> على نسخة توسيع المهرب، ويجب أن يكون أول وسيط هو اسم المهرب ليستَخدم في استدعاء escape، والثاني يجب أن يكون نوع بيانات PHP قابل للاستدعاء "callable":<syntaxhighlight lang="twig"> | |||
$twig = new \Twig\Environment($loader); | |||
$twig->getExtension(\Twig\Extension\EscaperExtension::class)->setEscaper('csv', 'csv_escaper'); | |||
</syntaxhighlight>عند استدعاء Twig لنوع البيانات callable فإن الأخير يستلم نسخة من بيئة Twig والسلسلة النصية التي يجب تهريبها، ومجموعة محارف (charset).<blockquote>لاحظ أن المهربات لا يمكن تخطيها لأنها تُعد التطبيق الأخير، وكذا من أجل تحسين الأداء.</blockquote> | |||
== الوسائط == | |||
<code>strategy</code>: خطة التهريب. | |||
<code>charset</code>: مجموعة محارف السلسلة النصية. | |||
--- | |||
<nowiki><noinclude>{{DISPLAYTITLE: المرشح filter في Twig}}</nowiki><nowiki></noinclude></nowiki> | |||
المرشح <code>filter</code> يرشح العناصر من تسلسل أو ربط (mapping) باستخدام دالة سهمية تستقبل القيمة من ذلك التسلسل أو الربط:<syntaxhighlight lang="twig"> | |||
{% set sizes = [34, 36, 38, 40, 42] %} | |||
{{ sizes|filter(v => v > 38)|join(', ') }} | |||
{# output 40, 42 #} | |||
</syntaxhighlight>وهو يسمح -مع الوسم <code>for</code>- بترشيح العناصر التي يراد التكرار عليها:<syntaxhighlight lang="twig"> | |||
{% for v in sizes|filter(v => v > 38) -%} | |||
{{ v }} | |||
{% endfor %} | |||
{# output 40 42 #} | |||
</syntaxhighlight>كما يعمل مع الربط أيضًا:<syntaxhighlight lang="twig"> | |||
{% set sizes = { | |||
xs: 34, | |||
s: 36, | |||
m: 38, | |||
l: 40, | |||
xl: 42, | |||
} %} | |||
{% for k, v in sizes|filter(v => v > 38) -%} | |||
{{ k }} = {{ v }} | |||
{% endfor %} | |||
{# output l = 40 xl = 42 #} | |||
</syntaxhighlight>تستقبل الدالة السهمية المفتاح كوسيط ثاني:<syntaxhighlight lang="twig"> | |||
{% for k, v in sizes|filter((v, k) => v > 38 and k != "xl") -%} | |||
{{ k }} = {{ v }} | |||
{% endfor %} | |||
{# output l = 40 #} | |||
</syntaxhighlight>لاحظ أن الدالة السهمية لها وصول إلى السياق الحالي. | |||
== الوسائط == | |||
<code>array</code>: التسلسل أو الربط. | |||
<code>arrow</code>: الدالة السهمية. | |||
--- | |||
<nowiki><noinclude>{{DISPLAYTITLE: المرشح first في Twig}}</nowiki><nowiki></noinclude></nowiki> | |||
يعيد المرشح first أول عنصر في تسلسل أو ربط (mapping) أو سلسلة نصية:<syntaxhighlight lang="twig"> | |||
{{ [1, 2, 3, 4]|first }} | |||
{# outputs 1 #} | |||
{{ { a: 1, b: 2, c: 3, d: 4 }|first }} | |||
{# outputs 1 #} | |||
{{ '1234'|first }} | |||
{# outputs 1 #} | |||
</syntaxhighlight>لاحظ أن هذا المرشح يعمل مع الكائنات التي تستخدم واجهة [https://secure.php.net/manual/en/class.traversable.phphttps://secure.php.net/manual/en/class.traversable.php Traversable]. | |||
<nowiki>----</nowiki> | |||
<nowiki><noinclude>{{DISPLAYTITLE: المرشح format في Twig}}</nowiki><nowiki></noinclude></nowiki> | |||
يهيئ المرشح format السلسلة النصية باستبدال العناصر النائبة (placeholders) التي تتبع ترميز [https://secure.php.net/sprintf sprintf]. انظر المثال التالي الذي يطبع "I like foo and bar" إذا كان معامِل foo مساويًا لسلسلة foo النصية:<syntaxhighlight lang="twig"> | |||
{{ "I like %s and %s."|format(foo, "bar") }} | |||
</syntaxhighlight> | |||
--- | |||
<nowiki><noinclude>{{DISPLAYTITLE: المرشح format_currency في Twig}}</nowiki><nowiki></noinclude></nowiki> | |||
يهيئ المرشح format_currency العدد ليكون على صيغة العملة:<syntaxhighlight lang="twig"> | |||
{# €1,000,000.00 #} | |||
{{ '1000000'|format_currency('EUR') }} | |||
</syntaxhighlight>يمكن تمرير سمات (attributes) من أجل تعديل الخرج:<syntaxhighlight lang="twig"> | |||
{# €12.34 #} | |||
{{ '12.345'|format_currency('EUR', {rounding_mode: 'floor'}) }} | |||
{# €1,000,000.0000 #} | |||
{{ '1000000'|format_currency('EUR', {fraction_digit: 4}) }} | |||
</syntaxhighlight>القائمة التالية تحتوي على الخيارات المدعومة: | |||
* <code>grouping_used</code>. | |||
* <code>decimal_always_shown</code>. | |||
* <code>max_integer_digit</code>. | |||
* <code>min_integer_digit</code>. | |||
* <code>integer_digit</code>. | |||
* <code>max_fraction_digit</code>. | |||
* <code>min_fraction_digit</code>. | |||
* <code>fraction_digit</code>. | |||
* <code>multiplier</code>. | |||
* <code>grouping_size</code>. | |||
* <code>rounding_mode</code>. | |||
* <code>rounding_increment</code>. | |||
* <code>format_width</code>. | |||
* <code>padding_position</code>. | |||
* <code>secondary_grouping_size</code>. | |||
* <code>significant_digits_used</code>. | |||
* <code>min_significant_digits_used</code>. | |||
* <code>max_significant_digits_used</code>. | |||
* <code>lenient_parse</code>. | |||
يستخدم المرشح الإعدادات المحلية افتراضيًا، ويمكن تمريرها صراحة إليه:<syntaxhighlight lang="twig"> | |||
{# 1.000.000,00 £ #} | |||
{{ '1000000'|format_currency('EGP', locale='eg') }} | |||
</syntaxhighlight> | |||
لاحظ أن المرشح <code>format_currency</code> جزء من <code>IntlExtension</code> وهذا لا يكون مثبتًا افتراضيًا، لذا ثبته أولًا: | |||
<syntaxhighlight lang="twig"> | |||
$ composer require twig/intl-extra | |||
</syntaxhighlight> | |||
ثم ثبت <code>twig/extra-bundle</code> في حالة مشاريع Symfony: | |||
<syntaxhighlight lang="twig"> | |||
$ composer require twig/extra-bundle | |||
</syntaxhighlight> | |||
أما غير ذلك فأضف التوسيع صراحة إلى بيئة Twig: | |||
<syntaxhighlight lang="twig"> | |||
use Twig\Extra\Intl\IntlExtension; | |||
$twig = new \Twig\Environment(...); | |||
$twig->addExtension(new IntlExtension()); | |||
</syntaxhighlight> |
مراجعة 09:25، 28 أبريل 2021
يعيد المرشح default القيمة الافتراضية الممررة إليه إذا كانت غير معرفة أو فارغة، وإلا فإنه يعيد قيمة المتغير:
{{ var|default('var is not defined') }}
{{ var.foo|default('foo item on var is not defined') }}
{{ var['foo']|default('foo item on var is not defined') }}
{{ ''|default('passed var is empty') }}
إذا استُخدم default على تعبير يستخدم المتغيرات في بعض استدعاءات التوابع فتأكد أن تستخدمه في كل حالة يكون المتغير فيها غير معرف:
{{ var.method(foo|default('foo'))|default('foo') }}
قد يطلِق استخدام المرشح default
على قيمة بوليانية سلوكًا غير متوقع، وذلك لأن false
تعامَل كقيمة فارغة، وعندئذ استخدم ??
:
{% set foo = false %}
{{ foo|default(true) }} {# true #}
{{ foo ?? true }} {# false #}
الوسائط
default: القيمة الافتراضية
<noinclude>{{DISPLAYTITLE: المرشح escape في Twig}}</noinclude>
يهرِّب المرشح escape سلسلة نصية باستخدام خطط تعتمد على السياق، وهي تستخدم خطة تهريب HTML افتراضيًا:
<p>
{{ user.username|escape }}
</p>
يعرَّف المرشح باسم بديل هو e
من أجل التيسير وتوفير الوقت:
<p>
{{ user.username|e }}
</p>
يمكن استخدام المرشح escape في سياقات أخرى كذلك غير HTML مستفيدين من وسيط اختياري يعرّف خطة التهريب التي يجب استخدامها:
{{ user.username|e }}
{# يكافئ #}
{{ user.username|e('html') }}
انظر كيف يمكن تهريب المتغيرات المدرَجة في شيفرة جافاسكربت:
{{ user.username|escape('js') }}
{{ user.username|e('js') }}
يدعم المرشح escape خطط التهريب التالية لمستندات HTML:
html
: يهرب سلسلة نصية لسياق متن HTML.js
: تهرب سلسلة نصية لسياق جافاسكربت.css
: تهرب سلسلة نصية لسياق CSS. يمكن تطبيق تهريب css على أي سلسلة نصية تُدخل في CSS، وتهرِّب كل شيء عدا الأحرف والأرقام.url
: تهرب سلسلة نصية لمحدد الموارد الموحد (URI)، ولا يُدخل إلا مكونٌ فرعي.html_attr
: تهرب سلسلة نصية لسياق سمة HTML.
لاحظ أن التهريب السياقي في مستندات HTML يصعب تنفيذه، ويتوقف اختيار خطة التهريب المناسبة على عوامل كثيرة، فانظر توثيقًا مثل the OWASP prevention cheat sheet لتعلم المزيد عن الأمر.
لاحظ أن المرشح escape يستخدم دالة htmlspecialchars الخاصة بلغة PHP من أجل خطة تهريب HTML.
انتبه عند استخدام التهريب التلقائي إذ أن Twig يحاول ألا يهرب متغيرًا تهريبًا مضاعفًا (double-escape) إذا كانت خطة التهريب التلقائية هي نفسها التي يستخدمها مرشح escape، لكن ذلك لا يعمل عند استخدام متغير ما كخطة تهريب:
{% set strategy = 'html' %}
{% autoescape 'html' %}
{{ var|escape('html') }} {# لن يهرَّب تهريبًا مضاعفًا #}
{{ var|escape(strategy) }} {# سيهرَّب تهريبًا مضاعفًا #}
{% endautoescape %}
التهريب التلقائي يجب أن يعطَّل عند استخدام متغير كخطة تهريب:
{% set strategy = 'html' %}
{% autoescape 'html' %}
{{ var|escape(strategy)|raw }} {# won't be double-escaped #}
{% endautoescape %}
المهرِّبات الخاصة
تستطيع تعريف مهربات خاصة باستدعاء التابع setEscaper()
على نسخة توسيع المهرب، ويجب أن يكون أول وسيط هو اسم المهرب ليستَخدم في استدعاء escape، والثاني يجب أن يكون نوع بيانات PHP قابل للاستدعاء "callable":
$twig = new \Twig\Environment($loader);
$twig->getExtension(\Twig\Extension\EscaperExtension::class)->setEscaper('csv', 'csv_escaper');
عند استدعاء Twig لنوع البيانات callable فإن الأخير يستلم نسخة من بيئة Twig والسلسلة النصية التي يجب تهريبها، ومجموعة محارف (charset).
لاحظ أن المهربات لا يمكن تخطيها لأنها تُعد التطبيق الأخير، وكذا من أجل تحسين الأداء.
الوسائط
strategy
: خطة التهريب.
charset
: مجموعة محارف السلسلة النصية.
---
<noinclude>{{DISPLAYTITLE: المرشح filter في Twig}}</noinclude>
المرشح filter
يرشح العناصر من تسلسل أو ربط (mapping) باستخدام دالة سهمية تستقبل القيمة من ذلك التسلسل أو الربط:
{% set sizes = [34, 36, 38, 40, 42] %}
{{ sizes|filter(v => v > 38)|join(', ') }}
{# output 40, 42 #}
وهو يسمح -مع الوسم for
- بترشيح العناصر التي يراد التكرار عليها:
{% for v in sizes|filter(v => v > 38) -%}
{{ v }}
{% endfor %}
{# output 40 42 #}
كما يعمل مع الربط أيضًا:
{% set sizes = {
xs: 34,
s: 36,
m: 38,
l: 40,
xl: 42,
} %}
{% for k, v in sizes|filter(v => v > 38) -%}
{{ k }} = {{ v }}
{% endfor %}
{# output l = 40 xl = 42 #}
تستقبل الدالة السهمية المفتاح كوسيط ثاني:
{% for k, v in sizes|filter((v, k) => v > 38 and k != "xl") -%}
{{ k }} = {{ v }}
{% endfor %}
{# output l = 40 #}
لاحظ أن الدالة السهمية لها وصول إلى السياق الحالي.
الوسائط
array
: التسلسل أو الربط.
arrow
: الدالة السهمية.
---
<noinclude>{{DISPLAYTITLE: المرشح first في Twig}}</noinclude>
يعيد المرشح first أول عنصر في تسلسل أو ربط (mapping) أو سلسلة نصية:
{{ [1, 2, 3, 4]|first }}
{# outputs 1 #}
{{ { a: 1, b: 2, c: 3, d: 4 }|first }}
{# outputs 1 #}
{{ '1234'|first }}
{# outputs 1 #}
لاحظ أن هذا المرشح يعمل مع الكائنات التي تستخدم واجهة Traversable.
----
<noinclude>{{DISPLAYTITLE: المرشح format في Twig}}</noinclude>
يهيئ المرشح format السلسلة النصية باستبدال العناصر النائبة (placeholders) التي تتبع ترميز sprintf. انظر المثال التالي الذي يطبع "I like foo and bar" إذا كان معامِل foo مساويًا لسلسلة foo النصية:
{{ "I like %s and %s."|format(foo, "bar") }}
---
<noinclude>{{DISPLAYTITLE: المرشح format_currency في Twig}}</noinclude>
يهيئ المرشح format_currency العدد ليكون على صيغة العملة:
{# €1,000,000.00 #}
{{ '1000000'|format_currency('EUR') }}
يمكن تمرير سمات (attributes) من أجل تعديل الخرج:
{# €12.34 #}
{{ '12.345'|format_currency('EUR', {rounding_mode: 'floor'}) }}
{# €1,000,000.0000 #}
{{ '1000000'|format_currency('EUR', {fraction_digit: 4}) }}
القائمة التالية تحتوي على الخيارات المدعومة:
grouping_used
.decimal_always_shown
.max_integer_digit
.min_integer_digit
.integer_digit
.max_fraction_digit
.min_fraction_digit
.fraction_digit
.multiplier
.grouping_size
.rounding_mode
.rounding_increment
.format_width
.padding_position
.secondary_grouping_size
.significant_digits_used
.min_significant_digits_used
.max_significant_digits_used
.lenient_parse
.
يستخدم المرشح الإعدادات المحلية افتراضيًا، ويمكن تمريرها صراحة إليه:
{# 1.000.000,00 £ #}
{{ '1000000'|format_currency('EGP', locale='eg') }}
لاحظ أن المرشح format_currency
جزء من IntlExtension
وهذا لا يكون مثبتًا افتراضيًا، لذا ثبته أولًا:
$ composer require twig/intl-extra
ثم ثبت twig/extra-bundle
في حالة مشاريع Symfony:
$ composer require twig/extra-bundle
أما غير ذلك فأضف التوسيع صراحة إلى بيئة Twig:
use Twig\Extra\Intl\IntlExtension;
$twig = new \Twig\Environment(...);
$twig->addExtension(new IntlExtension());