• php
  • 9754
  • 15/7/2008
  • حازم علي
  • بسم الله الرحمن الرحيم السلام عليكم ورحمة الله وبركاته القوالب هي تقييم للمبرمج فهي من تحدد سرعة البرنامج و إمكانية تصميمه و تطويره بسهوله
    لأن بكل بساطه المطور و المصمم ليسوا متعمقين في البرمجه بالشكل الكافي للتعديل
    و تخيل معي إن كانوا يستطيعوا ذلك فسيقوم شخص بتعديل جزء و يأتي صاحب الموقع لتغير التصميم فيأتي الاخر بتعديله أليس من المنطقي ان يحدث فقدان لأشياء داخل الملف لكثرة التعديل الغير دقيق . الفكرة التي سنقوم بتطبيقها لصناعة المحرك أولاً كما تكلمنا في موضوع البرمجه الكائنيه عن كيفية التخطيط لكائن تابع
    البرمجة كائنيه التوجيه في الإصدار php5 الاول ما الذي اريده من المحرك
    1- جلب ملف القالب
    2- التأكد من ان ملف القالب لم يتم عمل تعديلات عليه
    3- عمل التعديلا للقالب نفسه و هي
    - ان يقوم بتغيير المتغيرات المدخله في القالب الي متغيرات عامه موجوده في النظام
    - عمل نظام الشروط داخل النظام
    - عمل نظام جلب الملفات
    4- جلب ملف القالب المعدل من مجلد الكاش ثانياً ما هي الخصائص التي يجب توفرها 1- متغير عبارة عن مقبض لجلب ملفات القالب
    2- متغير به التعديلات التي سيقوم بها الكائن
    3- متغير به اسم مجلد القوالب حتي يتم جلب منه ملفات القالب
    4- متغير به اسم مجلد الكاش الذي سيتم إضافة الملفات المعدله اليه ليتم جلبه في صورة ملفات php
    5- مصفوفه بها المتغيرات العامه الاول نقوم بصناعة الكائن
    class template
    {


    }
    نقوم بعمل الخصائص التي اتفقنا عليها
    class Template
    {
    var $folder = \'templates\';// مكان القوالب
    var $cache = \'cache\'; // مجلد الكاش
    var $variable; // مصفوفة المتغيرات العامه في النظام
    var $output; // المخرجات
    var $input; // المدخلات
    }

    الان بعد تعريف الخصائص نقوم بعمل دالة مؤسس التصنيف لنعرف فيه الاشياء الاساسيه و هي
    مكان مجلد القوالب مكان مجلد الكاش
    مصفوفة المتغيرات العامه
    // الدله تأخذ مدخلين و هما مكان مجلد القوالب و مجلد الكاش
    FUNCTION __construct($temp,$cache)
    {
    $this->folder = $temp;// مجلد القوالب
    $this->cache = $cache;// مجلد الكاش
    $this->variable = $GLOBALS;// المتغيرات العامه
    }
    بعد تعريف الاشياء الاساسيه نقوم بعمل الوظائف التي اتفقنا عليها في اول الموضوع الوظيفه الاولى جلب ملف القالب و سنستخدم الداله file_get_contents

    // الداله تأخذ مدخل واحد و هو اسم مجلد القوالب
    FUNCTION inc_temp($file)
    {
    $file=\"$this->folder/$file\";/*استخدمنا الخاصيه فولدر التي تحمل اسم مكان مجلد القوالب ثم و ضعنا اسم القالب
    */
    if(file_exists($file))// التحقق من وجود ملف القالب قبل جلبه
    $this->input= file_get_contents($file);// جلب الملف
    else
    exit(\"<span dir=\'rtl\' style=\'color:red; font-weight:bold;\'>لم يتم العثو علي القالب $file</span>\");// رسالة الخطأ
    return $this->input;// الرجوع بمتغير يحمل ما في القالب
    }

    ثاني وظيفه هي التأكد من ان الملف لم يتم عمل اي تغيرات عليه حتي لا يتم تحديثه دون جدوى
    سنحتاج في هذه الداله فقط فتح الملف لا اكثر و سنستخدم الداله fopen
    // الداله تأخذ مدخل واحد و هو اسم ملف القالب داخل مجلد الكاش

    FUNCTION check_output($file)
    {
    if( file_exists($file))// التأكد من وجود الملف
    {
    // فتح الملف
    $check = @fopen(\"$file\",r);
    $r = @fread($check,filesize(\"$file\"));
    return $r; // الرجوع بمحتوى الملف
    @fclose($check);

    }

    }
    ثالث وظيفه و هي تبديل الاكواد التي في ملف القالب الي اكواد php و سنحتاج الي التعامل مع التعابير القياسيه الاكثر متعه من وجهة نظري تابع http://www.php.net/manual/en/referen...ern.syntax.php

    FUNCTION op()
    {
    $this->output= preg_replace(\'/\\{(.*)\\}/\',\'<?echo $this->variable[\'$1\\\'];?>\',$this->input);// تغير كل ما هو بين {} الي متغير عام
    $this->output= preg_replace(\'/\\<\\!\\-\\-include:(.*)\\-\\-\\>/\',\'<?$this->output(\\\'$1\\\');?>\',$this->output);/* عمل جلب داخلي للقوالب عن طريق دالة ouput سنعرضها بعد قليل
    */

    // تحويل كل ما هو داخل <if condition=\"\"> الي شرط
    $this->output= preg_replace(\'/\\<if condtion\\=\\\"(.*)\\\">/\',\'<?if($1){?>\',$this->output);
    // إغلاق الشرط
    $this->output= preg_replace(\'/\\<\\/if\\>/\',\'<?}?>\',$this->output);
    // الرجوع بالتعديلات كمخرجات
    return $this->output;
    }

    بعد عمل التعديلات سنقوم بإخرجها في ملف و من ثم جلبها لتصبح قالب
    // الداله تأخذ مدخل واحد و هو اسم ملف القالب
    FUNCTION output($temp)
    {
    $temp=str_replace(\'/\',\'-\',$temp);/*تحويل كل العلامه / الي - حتي لا يتم استغلالها في جلب ملفات خارج مجلد القوالب
    */
    //جلب ملف القالب لعمل التعديلات عليه فيما بعد
    $this->inc_temp($temp);//استدعاء الداله inc_temp
    // عمل التعديلات علي الملف و وضعها في متغير html
    $html=$this->op();//استدعاء الداله op

    /* استخدام الخاصيه كاش التي تحمل اسم مجلد الكاش و اسم الملف المدخل حتي نقوم بجلبه فيما بعد
    */
    $name=\"$this->cache/$temp.php\" ;
    // فتح الملف في مجلد الكاش للتأكد من ان الملف به تغيرات حتي نقوم بعمل التعديلات عليه
    $check= $this->check_output($name);// استدعاء الداله check_output

    // التأكد من انه يوجد اختلاف بين المدخلات و المخرجات حتي نقوم بالتعديل
    if($check != $html)
    {
    // التعديل علي ملف القالب داخل الكاش بالتعديلات التي تم عملها
    $file = @fopen(\"$name\",w);
    $w = @fwrite ($file,$html);
    @fclose($file);
    }

    // جلب الملف من داخل مجلد الكاش
    include_once(\"$name\");

    }
    هذه الخصائص يجب تطويرها و انصحك بتطويرها بل بإبتكار طريقه خاصه بك و لكن يجب ان تعرف الاساسيات الان طريقة استخدام المحرك
    $TPL= new template(\'مجلد القوالب\',\'مجلد الكاش\');
    $TPL->output(\'hazem.txt\');// عرض القالب

    الملف كامل
    <?php
    class Template
    {
    var $folder = \'templates\';
    var $cache = \'cache\';
    var $variable;
    var $output;
    var $input;
    FUNCTION __construct($temp,$cache)
    {
    $this->folder = $temp;
    $this->cache = $cache;
    $this->variable = $GLOBALS;
    }

    FUNCTION inc_temp($file)
    {
    $file=\"$this->folder/$file\";
    if(file_exists($file))
    $this->input= file_get_contents($file);
    else
    exit(\"<span dir=\'rtl\' style=\'color:red; font-weight:bold;\'>لم يتم العثو علي القالب $file</span>\");
    return $this->input;
    }

    FUNCTION op()
    {
    $this->output= preg_replace(\'/\\{(.*)\\}/\',\'<?echo $this->variable[\\\'$1\\\'];?>\',$this->input);
    $this->output= preg_replace(\'/\\<\\!\\-\\-include:(.*)\\-\\-\\>/\',\'<?$this->output(\\\'$1\\\');?>\',$this->output);
    $this->output= preg_replace(\'/\\<if condtion\\=\\\"(.*)\\\">/\',\'<?if($1){?>\',$this->output);
    $this->output= preg_replace(\'/\\<\\/if\\>/\',\'<?}?>\',$this->output);
    return $this->output;
    }
    FUNCTION check_output($file)
    {
    if( file_exists($file))
    {
    $check = @fopen(\"$file\",r);
    $r = @fread($check,filesize(\"$file\"));
    @fclose($check);
    }
    return $r;
    }
    FUNCTION output($temp)
    {
    $temp=str_replace(\'/\',\'-\',$temp);
    $this->inc_temp($temp);
    $html=$this->op();
    $name=\"$this->cache/$temp.php\" ;
    $check= $this->check_output($name);
    if($check != $html)
    {
    $file = @fopen(\"$name\",w);
    $w = @fwrite ($file,$html);
    @fclose($file);
    }

    include_once(\"$name\");

    }


    }

    ?>
    حمّل القالب
    عدد المقيّمين 2 وإجمالي التقييمات 9
    12345