العارفون للphp و الhtml يعون ضرورة التفريق القصوي بين هذا و ذاك ( في صميم الهندسة MVC)، و يعون كذلك أن التفرقة الكاملة غير ممكنة، سنحتاج حتما لإظهار قيمة متغير php في موضع معين من الhtml، أو إنجاز حلقة تضع قيم جملة من المتغيرات php داخل الhtml، أو وضع قيمة متغير تحت شرط معين ...

من هنا ظهرت الحاجة للغة تسهل القيام بهذه الأمور دون جعل الكود مزيجا صعب القراءة يحتوي php و html، و هذه اللغة هي twig الذي يختصر الكثير من الأمور، مثلا : عوض كتابة <?php echo $myvar; ?> سنكتب في تويغ {{myvar}}. و لا تنحصر قيمة تويغ في إختصار الكتابة، بل إنه يوفر وسيلة للتراتبية و الإرث بين القوالب، و ميكانزمات أخرى لتأمين المتغيرات و حمايتها.

 

  1. إستعمال المتغيرات PHP

 

و عمليا، تتم مناداة التومبليت تويغ من الكونترولر كما فعلنا في برنامج أهلا، حسنا سنحتفظ بنفس المثال ( مناداة صفحة التويغ أهلا ahlan.twig.html  من طرف الكونترولر DefaultController)، لكننا هذه المرة سنضيف متغيرين، قوموا إذن بإعادة تعريف الطريقة أهلا في الكونترولر كما يلي :

public function ahlanAction()
{
	$man = 'زوارنا الكرام';
	$ayn = 'موقع باينة ';
	
	return $this->render('default/ahlan.html.twig', array(
	    'man' => $man,
	    'ayn' => $ayn
    ));
}

و في الملف app\Resources\views\default\ahlan.html.twig نضع المحتوى التالي:

 

<!DOCTYPE HTML>
<html dir="rtl">
  <head>
    <meta charset="utf-8">
    <title>درس باينة في تويغ</title>
  </head>
  <body>
	<h3></h3>
	<p>
		أهلا
		{{man}}
		في
		{{ayn}}
	</p>
  </body>

</html>

 

بإمكانكم التحقق من النتيجة على العنوان:

http://localhost/symf3/web/app_dev.php/ahlan

 

  1. الإرث في تويغ twig

 

فلنتصور مثال بوابة انترنيت تحتوي على قسم أخبار، و قسم منتديات و قسم إعلانات. سنعتبر أن هذه البوابة مبرمجة بسيمفوني و تحتوي على ثلاث "بنادل" Bundles، كل يختص في قسم. في هذه الحالة سنستطيع من خلال الإرث في تويغ من تعريف هيكل ينطبق على جميع الصفحات، ثم نستعمل هذا الهيكل لصناعة ثلاث هياكل كل لقسم من اقسام البوابة؛ بهذه الطريقة، لإنجاز صفحة html الخاصة بنوع معين من الأخبار فإننا سنرث من هيكل الأخبار الذي يرث بدوره من الهيكل العام. أكثر من ذلك، نستطيع في هيكل علوي تعريف قطعة نعطيها قيمة إعتباطية، و عندما نرث من هذا الهيكل، نستطيع الإحتفاظ بالقيمة الإعتباطية كما نستطيع تغييرها.

عمليا لنذهب لملف app\Resources\views\default\index.html.twig الموجود إعتباطيا عند تثبيت سيمفوني، و الذي تطرقنا إليه بعجالة عند شرح الكونترولر في الفصل الثاني من هذا الدرس، سنجد أن في بداية الملف مكتوب:

{% extends 'base.html.twig' %}

و التي تعني أنه يرث من الملف base.html.twig ، هذا الأخير يوجد في هذا الموضع: app\Resources\views\base.html.twig و ها هو محتواه:

 

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8" />
        <title>{% block title %}Welcome!{% endblock %}</title>
        {% block stylesheets %}{% endblock %}
        <link rel="icon" type="image/x-icon" href="{{ asset('favicon.ico') }}" />
    </head>
    <body>
        {% block body %}{% endblock %}
        {% block javascripts %}{% endblock %}
    </body>
</html>


الملفات التي ترث منه، ستأخذه كما هو و تعوض فيه الكتل التي يعاد تعريفها، مثلا الكتلة body لا تحتوي على شيء إعتباطيا، و سنعيد تحديد مضمومنها في الملفات التي ترث منها ( انظر الى الملف index.twig.html مثلا )

 

  1. هياكل التحكم و الحلقات

 

في تويغ تجد هياكل التحكم if و for ، نكتب مثلا للتحقق من ان متغيرا ما معرف:

{% if var is defined %} 

{% endif %}

 

نستعمل for مثلا لنطبع الاعداد من 1 الى 10

{% for i in 0..10 %}
    * {{ i }}
{% endfor %}

كما نستطيع إعمال for على مجموعة من الكائنات users كما سنرى عندما سنتطرق للكائنات العلائقية في الفصل الموالي، loop.index تعطي رقم الحلقة التي نحن بصددها. و username خاصية يفترض بها ان تكون موجودة في كائنات المجوعة users.

 

{% for user in users %}
    {{ loop.index }} - {{ user.username }}
{% endfor %}

 

المزيد من المعلومات عن تويغ متوفر في الموقع الرسمي تويغ

لن نتطرق هنا لجانب الستايل و الHTML الذي ندعو القارئ المبتدئ لإلقاء إطلالة على الدروس المخصصة للستيال و الHTML.
عموما توضع ملفات الجافاسكريبت و الستايل في ملف نسميه باسم البندل داخل الملف web\bundles