المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : [شرح] شرح برمجة نظام القوالب


خ ــادم الإسلام
27-10-2009, 03:47 صباحاً
بسم الله الرحمن الرحيم

السلام عليكم ورحمة الله وبركاته

القوالب هي تقييم للمبرمج فهي من تحدد سرعة البرنامج و إمكانية تصميمه و تطويره بسهوله
لأن بكل بساطه المطور و المصمم ليسوا متعمقين في البرمجه بالشكل الكافي للتعديل
و تخيل معي إن كانوا يستطيعوا ذلك فسيقوم شخص بتعديل جزء و يأتي صاحب الموقع لتغير التصميم فيأتي الاخر بتعديله أليس من المنطقي ان يحدث فقدان لأشياء داخل الملف لكثرة التعديل الغير دقيق .

الفكرة التي سنقوم بتطبيقها لصناعة المحرك



الاول ما الذي اريده من المحرك
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 (http://php.net/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 (http://php.net/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/reference.pcre.pattern.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“);

}


}

?>







نقلاً عن : حازم علي

بوسعد
27-10-2009, 06:38 صباحاً
يعطيك العافيه

ح ـــكـم القدر
07-12-2009, 05:52 صباحاً
لاهنت يالغالي