القالب
Smarty - PHP
من
: cjjer تم إجراء بعض التغييرات
لاستخدام PHP لتنفيذ الطبقة المنطقية وطبقة العرض لنموذج تطوير MVC. هناك مجموعة متنوعة من محركات القوالب للاختيار من بينها، ولكن بعد الولادة بالنسبة للمحرك الرسمي SMARTY، تغير الاختيار. مفهومها وتنفيذها طليعية للغاية. تتناول هذه المقالة بشكل أساسي الخصائص المختلفة لـ SMARTY مقارنة بمحركات القوالب الأخرى، وتقدم بإيجاز تركيب المحرك واستخدامه، وتستخدم حالة اختبار صغيرة لمقارنة سرعة وسهولة استخدام SMARTY وPHLIBtemplate.
1. يتطلب MVC قوالب.
تم تلخيص MVC لأول مرة كنمط تصميم أثناء عملية تطوير لغة SmallTalk. يمثل MVC النموذج والعرض والتحكم على التوالي. والغرض من ذلك هو السماح لأدوار التطوير المختلفة بأداء واجباتها في الحجم الكبير والمتوسطة المشاريع. في تطوير تطبيقات الشبكات، يمكن استخدام الرسم البياني التالي لتمثيل العلاقة بين المفاهيم.
يوضح هذا الشكل تطبيق ويب بسيط، المعلومات التي يراها المستخدم على المتصفح هي المحتوى الموجود على خادم قاعدة البيانات، ولكن تمت معالجتها بواسطة خادم التطبيقات من قبل. يتحمل المطورون مسؤولية إنشاء هياكل البيانات ومنطق معالجة البيانات وطرق تمثيل البيانات.
عندما أصبحت CGI شائعة في الصين في عام 1996، كان جميع مبرمجي الويب الأوائل يتعلمون ذاتيًا استخدام HTML، ولم يكن من الصعب طباعة سطور HTML في PERL، ومع ذلك، مع زيادة سرعة الشبكة خطوة بخطوة، زاد حجم الصفحة أيضًا الأصلي 20 إلى 30 كلفن، وقد ارتفع عشرة أضعاف. تخلق كتابة برامج CGI متطلبًا عاجلاً: فصل كود مصدر PERL وHTML. وهكذا ينعكس التقدم الاجتماعي في تقسيم العمل داخل فريق التطوير. نظرًا لأن الفنانين والمبرمجين ليسوا على دراية كبيرة بعمل بعضهم البعض، فهم بحاجة إلى استخدام لغة متفق عليها للتواصل أثناء التعاون.
هذه اللغة ليست لغتنا الأم أو الإنجليزية، ويطلق على هذا المصطلح اسم القالب، ويعتمد عليه المنطق والعرض. إنها طريقة تعبير تجمع بين خصائص HTML ولغات البرمجة النصية. بهذه الطريقة، يمكن لطبقة العرض عرض البيانات التي تمت معالجتها بواسطة الطبقة المنطقية بالتنسيق الذي يريده المستخدم. إذا كانت لديك خبرة في تطوير MFC ضمن نظام التشغيل Windows، فمن المؤكد أنك ستكون على دراية بتغليف Document/DocumentTemplate/View، وهذا مثال نموذجي جدًا لـ MVC. بالنسبة لتطبيقات الويب، أعتقد شخصيًا أن EJB/servlets/JSP في J2EE هي الأقوى، وبالطبع هناك هياكل بسيطة وجميلة. تطبيق آخر معروف هو COM/DCOM+ASP ويستخدمه معظم الأشخاص في بلدنا.
من خلال مقارنة العديد من تطبيقات MVC في تطبيقات الويب، يمكننا الحصول على مفهوم حول القوالب: مجموعة من البرامج النصية المدرجة في HTML، أو HTML النصي، الذي يمثل المحتوى المدرج من خلاله البيانات المتغيرة. فيما يلي مثال لملف القالب، بعد المعالجة، يعرض هذا القالب Hello,world!
تم حذف طريقة معالجة$greetings
في الوقت الحالي، وسيتم مناقشتها لاحقًا للمقارنة.
2. لماذا تختار SMARTY؟
بالنسبة لـ PHP، هناك العديد من محركات القوالب للاختيار من بينها، مثل PHPLIBtemplate الأقدم وFasttemplate النجم الصاعد، بعد عدة ترقيات، أصبحت ناضجة ومستقرة تمامًا. إذا كنت راضيًا جدًا عن محرك القالب الموجود لديك حاليًا، فيرجى مواصلة القراءة، وأعتقد أنه باعتبارك متحمسًا للبرمجيات الحرة أو مطورًا يسعى إلى الكفاءة والأناقة، فإن مقدمة SMARTY التالية ستكون مثيرة للاهتمام إلى حد ما.
بالإضافة إلى تأثير التفضيل الشخصي، كنت أميل دائمًا إلى استخدام التطبيقات القياسية الرسمية، مثل محرك XML الخاص بـ APACHE Axis. الميزة هي أنه يمكنك الحصول على أفضل توافق ممكن (على سبيل المثال، كان توافق MFC المبكر مع Win3x أفضل من أطر التطبيقات الأخرى، وبالطبع أصبحت جميع الإصدارات الآن كاملة جدًا). قبل إصدار SMARTY، كنت أستخدم امتداد القالب المتكامل في PEAR. هذا المحرك متوافق تقريبًا مع PHPLIBtemplate وFasttemplate، بدءًا من بناء جملة القالب وحتى معالجة القالب، تتم قراءة القالب في الذاكرة ثم يتم استدعاء وظيفة parse() لاستبدال العلامات المحددة مسبقًا بالبيانات.
دعونا نرى كيف يفعل SMARTY ذلك. بعد تلقي الطلب، حدد أولاً ما إذا كان عنوان url مطلوبًا لأول مرة، وإذا كان الأمر كذلك، فقم بتجميع ملف القالب المطلوب لعنوان url في برنامج نصي php، ثم قم بإعادة التوجيه، وإذا لم يكن الأمر كذلك، فهذا يعني أن قالب عنوان url قد تم يمكنك إعادة التوجيه على الفور دون إعادة الترجمة. يمكن ضبط شروط إعادة الترجمة على حد زمني ثابت.
ماذا عن ذلك؟ تعال للتفكير في الأمر ──أليس هذا هو مبدأ JSP! في الواقع، يبدو هذا النوع من التجميع أمرًا لا يصدق عند استخدامه على محرك برمجة نصية مفسرة مثل PHP، ولكن إذا فكرت في الأمر بعناية، ألا يتم تفسير وتنفيذ JAVA أيضًا بواسطة JVM؟ وهذا يعني أنه لا يوجد شيء مستحيل، فقط لا يمكن تصوره.
الآن بعد أن تحدثنا عن JAVA، اسمحوا لي أن أعبر عن آرائي حول مستقبل PHP. أعلن موقع PHP الرسمي أن الإصدار PHP 5.0 سيتم إصداره في نهاية عام 2003. يحتوي هذا الإصدار على العديد من الميزات الجديدة: مثل معالجة الاستثناءات، ومساحات الأسماء، والمزيد من التوجهات الكائنية، وما إلى ذلك. يمكن القول أنها تقترب من JAVA، وتعد SMARTY أيضًا إحدى الميزات الجديدة، مما يجعل PHP أكثر ملاءمة لتطوير المشاريع الكبيرة والمتوسطة الحجم. ولكن يبدو أنه يبتعد أكثر فأكثر عن سبب اختياري له في المقام الأول - وهو المرونة وسهولة الاستخدام. ولكن من منظور دورة حياة البرنامج، فإن PHP في مرحلة النمو، وتفوق المزايا على العيوب بالنسبة للمطورين لمنحها المزيد من الوظائف على أمل أن تكون مؤهلة للتطبيقات التجارية. كمستخدم مخلص لـ PHP، فأنت بالتأكيد لا تريد أن يتم اتهام PHP دائمًا بعدم كفاية القدرات، أليس كذلك؟
لماذا تختار SMARTY، فقط لأنه مثل JSP؟ هناك بالتأكيد أسباب أفضل. بادئ ذي بدء، بالإضافة إلى التكلفة العالية نسبيًا للتجميع الأول، طالما لم يتم تعديل ملف القالب، فإن البرنامج النصي لذاكرة التخزين المؤقت المترجمة متاح في أي وقت، مما يوفر الكثير من وقت التحليل () ثانيًا، يحتوي SMARTY على مكتبة وظائف غنية مثل PHP. من حساب الكلمات إلى المسافة البادئة التلقائية، التفاف النص والتعبيرات العادية، يمكنك استخدامها مباشرة إذا شعرت أنها غير كافية، على سبيل المثال، تحتاج إلى وظيفة عرض الترحيل لمجموعة نتائج البيانات، SMARTY يتمتع أيضًا بقدرات توسعة قوية، والتي يمكن توسيعها من خلال المكونات الإضافية.
الحقائق تتحدث بصوت أعلى من الكلمات. لقد قمت بتصميم برنامج اختبار وقارنت SMARTY و PHPLIBtemplate بناءً على عاملي السرعة وصعوبة التطوير. السبب وراء اختيار PHPLIBtemplate هو أنه في مقال باتريك "اختيار القالب الأكثر ملاءمة في عالم PHP"، هناك مقارنة بين PHPLIB. في مسابقة القالب وFasttemplate، فاز PHPLIBtemplate بانتصار كبير، مما أعطى SMARTY خصمًا جيدًا. قبل الاختبار، دعونا نتحدث عن المشكلات التي يجب الانتباه إليها أثناء عملية التثبيت.
3. المشكلات التي قد تواجهها
على موقع SMARTY الرسمي، يوجد دليل مستخدم مفصل، ويمكنك اختيار الإصدارات عبر الإنترنت بتنسيقات HTML وPDF. لن نقوم بتغطية المحتوى الموجود في الدليل هنا، ولكننا سنشرح فقط المشكلات التي قد تواجهها أثناء الاستخدام الأول.
السؤال الأول قاتل للغاية: يقول أنه لا يمكن العثور على الملف المطلوب؟ لا يقوم الجميع بكتابة التطبيقات وفقًا لبنية الدليل الافتراضية لـ SMARTY. يجب تحديد ذلك يدويًا بافتراض أن بنية الدليل هي كما يلي:
تحتاج إلى تحديد بنية الدليل في ملف Index.php:
$smart->template_dir = "smarty/templates/";
$smart->compile_dir = "smarty/templates_c/";
$smart->config_dir = "smarty/configs/";
$smart->cache_dir = "smarty/cache/";
تم حل المشكلة الأولى، ثم تأتي المشكلة الثانية: لماذا لا يمكن استخدام القالب الجميل الذي قمت بإنشائه للتو باستخدام Dreamweaver؟ لا يعني ذلك أن هناك أي خطأ في ملف القالب، بل لأن محدد العلامات الافتراضي لـ SMARTY هو {}، وللأسف يحتوي Javascript بالتأكيد على هذه العلامة. لحسن الحظ، يمكننا استخدام أي حرف كمحدد، بالإضافة إلى هاتين الجملتين:
$smart->left_delimiter = "{/";
$smart->right_delimiter = "/}";
الآن اكتمل التثبيت، لا توجد مشكلة.
4. التباين والقياس
أولاً، فكر في تصميم الاختبار. عامل الحكم الرئيسي هو بالطبع السرعة. ولاختبار السرعة تم استخدام الوسط الحسابي. كرر إنشاء الصفحة N مرات على صفحة الاختبار، ثم قم بمقارنة إجمالي وقت إنشاء الصفحة. عامل مهم آخر هو سهولة الاستخدام (بالنسبة لقابلية التوسع، ليست هناك حاجة لمقارنة النتائج)، لذلك لا يمكن أن يكون القالب المستخدم صغيرًا جدًا. أستخدم صفحة صفحتي الرئيسية الشخصية، وهي عبارة عن ملف HTML تم إنشاؤه باستخدام Firework+Dreamweaver، ويبلغ حجمه حوالي 7 كيلو بايت. تعتمد إعدادات المتغير أيضًا الكتل الأكثر استخدامًا، والتي تسمى الكتل في قالب PHPLIB والأقسام في SMARTY. لا تقلل من شأن الاختلاف في الأسماء، حيث تنقسم معايير سهولة الاستخدام إلى قسمين: ما إذا كان بناء جملة ملفات القالب وملفات البرامج النصية موجزًا وسهل الاستخدام.
دعونا نتعمق في الاختبار. دعونا نلقي نظرة أولاً على بناء جملة ملفي القالب: الجانب الأيسر من الشريط الأزرق هو قالب PHPLIB، والجانب الأيمن ينتمي إلى SMARTY. تختلف التفضيلات الشخصية، لذلك لن أعلق هنا. ركز على مقارنة عبارات المعالجة في البرنامج النصي، وانظر أولاً إلى قالب PHPLIB:
$tpl->set_file('phplib', 'bigfile.htm');
$tpl->set_block('phplib', 'row', 'rows');
for ($j = 0; $j < 10; $j++){
$tpl->set_var('tag' ,"$j");
$tpl->parse('rows', 'row', true);
}
$tpl->parse('out', 'phplib');
$tpl->p('out');
ما يلي هو SMARTY:
$smart->assign('row',$row);
$smart->display('bigfile.htm');
يستخدم SMARTY متغيرين فقط، العلامات والصف، بينما يحتوي قالب PHPLIB على معالج ملف قالب إضافي ومخرج غير قابل للتفسير. لأكون صادقًا، لم أكن أعرف سبب وجود هذا الأمر عندما علمت به لأول مرة. ولا يزال الأمر يبدو محرجًا الآن. لماذا لدى SMARTY عدد قليل جدًا من بيانات المعالجة؟ الجواب هو أن العمل يتم بواسطة المحرك. إذا كنت ترغب في التعمق في البرنامج المصدر، يمكنك أن تجد أن هناك وظيفة تسمى _compile_tag() في Smarty_compiler.class.php، وهي المسؤولة عن تحويل علامة القسم إلى عبارة PHP. هذه ليست تسمية عادية، فهي تحتوي على معلمات وبيانات، مما يوفر عبء العمل على برمجة البرامج النصية ولا يختلف كثيرًا.
الآن حان دورنا للتركيز على السرعة، ففي النهاية، بالنسبة لمطور الويب الماهر، فهي مسألة وقت فقط لإتقان الأداة الأكثر صعوبة، ناهيك عن محرك القالب، وهي تقنية ذات منحنى تعليمي لطيف. السرعة هي عمر تطبيق الويب، خاصة عند استخدام محرك القالب في موقع به عدد كبير من الزيارات المتزامنة، وهو الأمر الأكثر أهمية. قبل بدء الاختبار، اعتقدت أن قالب PHPLIB سيفوز في هذا الجانب لأنه تمت ترقيته عدة مرات ولا يحتوي على أي أخطاء. علاوة على ذلك، فإن محرك SMARTY كبير جدًا، على عكس منافسه الذي يحتوي على ملفين فقط.
من المؤكد أن نتائج الاختبار كما هو موضح أدناه، يتمتع قالب PHPLIB بميزة السرعة بنسبة 25٪:
لكن الأمر لن يكون دائمًا على هذا النحو، لقد قمت بالضغط على "تحديث" مرة أخرى، وهذه المرة حصلت على نتيجة مختلفة:
PHPLIB لم يتغير بشكل أساسي، لكن SMARTY زاد السرعة بنسبة 25%. استمر في التحديث، وستحصل على نتائج مشابهة للمرة الثانية: SMARTY أسرع بنسبة 10% تقريبًا من قالب PHPLIB. أعتقد أن هذا هو السبب في أن النسخة المترجمة أسرع من النسخة المفسرة. محرك SMARTY نفسه كبير جدًا، ويحتاج القالب إلى تجميعه في ملف php، وبالتالي فإن السرعة بالتأكيد ليست بنفس سرعة قالب PHPLIB المضغوط. ولكن هذا هو الحال فقط للمرة الأولى. عند تلقي الطلب للمرة الثانية، اكتشف SMARTY أن القالب قد تم تجميعه بالفعل، لذلك تم تخطي الخطوة الأكثر استهلاكًا للوقت، وكان على الخصم إجراء البحث والاستبدال خطوة بخطوة. هذا مثال كلاسيكي على "تبادل المساحة بالوقت" المذكور في مبادئ التجميع.
5. الخلاصة
الخلاصة هي أنه إذا وقعت في حب SMARTY، فماذا تنتظر؟ بالطبع، هذا لا يعني أنه قادر على كل شيء، تمامًا كما هو الحال عندما أستخدم نموذج MVC لكتابة موقع الويب الشخصي الخاص بي، فهو لا يقلل من عبء العمل فحسب، بل يجب علي دائمًا القلق بشأن الاقتران بين المستويات المختلفة.
ما هو SMARTY غير المناسب؟ خذ مثالا كلاسيكيا من الدليل: موقع توقعات الطقس. شيء آخر يتبادر إلى الذهن: سوق الأوراق المالية. سيكون استخدام SMARTY على هذا النوع من مواقع الويب غير فعال بسبب إعادة الترجمة المتكررة، لذا فإن قالب PHPLIB أكثر ملاءمة.
هذه المقالة ليست لمقارنة المحركين، ولكن لتوضيح مزايا SMARTY. الشيء الأكثر أهمية في استخدامه هو أنه جزء من نظام PHP الجديد كقوة مستقلة، بالإضافة إلى النظامين الرئيسيين .NET وJAVA ONE، هناك خيارات أخرى لتطوير الويب الكبيرة والمتوسطة الحجم. بالنسبة لمشروع حكومة الوحدة الوطنية، فإن أهميته لا تختلف عن قفز جيش ليو ودينج آلاف الأميال إلى جبال دابي.
المؤلف: يو بوكسيانغ