ArTemplate نظام قوالب 0.2
ArTemplate نظام قوالب 0.2


السلام عليكم ورحمة الله تعالى وبركاته اما بعد
اليوم اضع بين ايديكم الاصدار الثاني من نظام القوالب الذي كان اسمه سابقا cmtp اما الان ف artp اختصار ل arabe templates

اولا الكلاس

كود PHP:
 <?php 
/*************************************************************************** 
 *    This program is free software; you can redistribute it and/or modify 
 *    it under the terms of the GNU General Public License as published by 
 *    the Free Software Foundation; either version 2 of the License, or 
 *    (at your option) any later version. 
 * 
 *    Project: ArTemplates 0.2 
 *    Author: Bilal El Moussaoui <bil-elmoussaoui@live.fr> - <bil.elmoussaoui@gmail.com> 
 *    Compatiable : PHP 4 and PHP 5 or more than 
 *    Don't Remove This Copyright Message 
 **************************************************************************/ 

class ARTP 

    public 
$cache "cache"
    public 
$templ "templates"
    private 
$vars,$content,$userCache
    public 
$AutoDeleteCache true
    public 
$DeleteCacheTime 60;// time with seconds 
    
public $LeftHand "{"
    public 
$templateExtension "html"
    public 
$RightHand "}"
     
    public function 
__construct($cache="cache",$templ="templates",$useCache=TRUE
    { 
        
$this->vars = &$GLOBALS
        
$this->cache = &$cache
        
$this->templ = &$templ
        
$this->userCache = &$useCache
        if(!
function_exists('file_get_contents')){ 
            function 
file_get_contents($file){ 
                try{ 
                    
$handl fopen($file,'r'); 
                    
$read fread($handl,filesize($handl)); 
                    
fclose($handl); 
                    return 
$read
                }catch(
Exception $e){ 
                 
                } 
            } 
        } 
    } 


    public function 
__toString(){ 
        return 
$this->__error("you can't print a class"); 
    } 

    public function 
__call($name$arguments) { 
        
$this->__error('Calling object method "'.$name.'" '.implode(', '$arguments).'<br />'); 
    } 

    public static function 
__callStatic($name$arguments) { 
       
$this->__error('Calling static method "'.$name.'" '.implode(', '$arguments).'<br />'); 
    } 
    
/* 
       * __error 
       * @param : error message 
       * @return Btempaltes Error message 
    */ 
    
private function __error($error
    { 
        die(
'<h1>CTMP ERROR : </h1> <strong>'.$error.'</strong>'); 
    } 

    
/* 
       * __getContent 
       * @param : file name 
       * @return : content of the file 
    */ 
    
private function getContent($file
    { 
        if(
file_exists($file)) 
        { 
            
$Output file_get_contents($file); 
            if(
$Output == false
            { 
                
trigger_error("error to get content"); 
            }else{ 
                return 
$Output
            } 
        } else { 
            
$this->__error("The File ".$file." is not Exsits"); 
        } 
    } 

    
/* * vide cache 
    * @return : delete all cache files 
    * @access : publics 
    * */ 
    
public function VideCache(){ 
        
$glob glob($this->cache.'*.php'); 
        foreach(
$glob as $file){ 
             
unlink($file); 
        } 
    } 

       
/* * parce(); 
        * @return : the php content 
        * @param : contenu 
        * @access : private 
        * */ 
    
private function parce($content
    { 
        
$content preg_replace_callback('#\\'.$this->LeftHand.'(if|elseif)\s+condition\s*=\s*"(.*?)\s*"\\'.$this->RightHand.'#iU',array($this,'__if_callback'),$content);// if|elseif condition 
        
$content preg_replace('#\\'.$this->LeftHand.'else\\'.$this->RightHand.'#iU','<?php }else{ ?>',$content);// else 
        
$content preg_replace_callback('#\\'.$this->LeftHand.'func\s+name\s*=\s*"(.*?)\s*"\s*args\s*=\s*"(.*?)\s*"\\'.$this->RightHand.'#iU',array($this,'__func_callback'),$content);// function 
        
$content preg_replace_callback('#\\'.$this->LeftHand.'obj\s+name\s*=\s*"(.*?)"\s+do\s*="\s*(.*?)\s*"\s+ret\s*=\s*"(.*?)\s*"\\'.$this->RightHand.'#iU',array($this,'__obj_callback'),$content); // object 
        
$content preg_replace_callback('#\\'.$this->LeftHand.'for\s+var\s*=\s*"(.*?)\s*"\s+start\s*=\s*"(.*?)\s*"\s+end\s*=\s*"(.*?)\s*"\\'.$this->RightHand.'#iU',array($this,'__for_callback'),$content); // for 
        
$content preg_replace_callback('#\\'.$this->LeftHand.'foreach\s+name\s*=\s*"(.*?)\s*"\s+keys\s*=\s*"(.*?)\s*"(\s+values\s*=\s*"(.*?)\s*")*\\'.$this->RightHand.'#i',array($this,'__foreach_callback'),$content);// foreach 
        
$content preg_replace_callback('#\\'.$this->LeftHand.'switch\s+var\s*=\s*"(.*?)\s*"\\'.$this->RightHand.'(.*?)\\'.$this->LeftHand.'endswitch\\'.$this->RightHand.'#is',array($this,'__switch_callback'),$content); 
        
$content preg_replace_callback('#\\'.$this->LeftHand.'\$(.*?)\\'.$this->RightHand.'#iU',array($this,'__vars_callback'),$content);// vars 
        
$content preg_replace('#(\\'.$this->LeftHand.'endif\\'.$this->RightHand.'|\\'.$this->LeftHand.'endfor\\'.$this->RightHand.'|\\'.$this->LeftHand.'endforeach\\'.$this->RightHand.')#iU','<?php } ?>',$content);// close php codes 
        
$content preg_replace_callback('#\\'.$this->LeftHand.'php\\'.$this->RightHand.'(.*?)\\'.$this->LeftHand.'endphp\\'.$this->RightHand.'#si',array($this,'__php_callback'),$content);//php code 
        
$content preg_replace_callback('#\\'.$this->LeftHand.'include\s+file\s*=\s*"(.*?)\s*"\\'.$this->RightHand.'#iU',array($this,'__include_callback'),$content);//include 
        
$content preg_replace_callback('#\\'.$this->LeftHand.'define\s*=\s*"\s*(.*?)\s*"\\'.$this->RightHand.'#iU',array($this,'__define_callback'),$content);// define 
        
return $content
    } 

     private function 
__switch_callback($matches
     { 
        
$return '<?php switch('.$this->__var_callback($matches[1]).') { '
        
$matches[2] = preg_replace('#\\'.$this->LeftHand.'case\s+condition=\s*"(.*?)\"\\'.$this->RightHand.'(.*?)\\'.$this->LeftHand.'break\\'.$this->RightHand.'#is'
                
'case $1:?>'.$this->__var_callback("$2").'<?php break;'$matches[2]); 
        
$matches[2] = preg_replace('#\\'.$this->LeftHand.'default\\'.$this->RightHand.'(.*?)\\'.$this->LeftHand.'break\\'.$this->RightHand.'#is',' default:?>$1<?php break;?>',$matches[2]); 
        
$return .= $matches[2]; 
        
$return .= '<?php } ?>'
        return 
$return
     } 

    private function 
__define_callback($matches
    { 
        if(
defined($matches[1])){ 
            return 
'<?php echo '.$matches[1].';?>'
        }else{ 
            
trigger_error('Use of undefined constant '.$matches[1].' - assumed '.$matches[1].'',E_USER_ERROR); 
        } 
    } 
    private function 
__vars_callback($matches
    { 
        if(
preg_match("#([a-zA-Z0-9\_\.\|]){1,}#i"$matches[1])){ 
            
$matches[1] = preg_replace("#\.(.*?)#i",'"][$1"',$matches[1]); 
            if(
strpos($matches[1],'|')){ 
                
$func substr($matches[1],strpos($matches[1],'|') + 1,strlen($matches[1])); 
                
$var substr($matches[1],0,strlen($matches[1]) -(strlen($func) + 1)); 
                if(
$func == 'lower'){ 
                    return 
'<?php echo strtolower($this->vars["'.$var.'"]); ?>'
                }else if(
$func == 'upper'){ 
                    return 
'<?php echo strtoupper($this->vars["'.$var.'"]); ?>'
                }else if(
preg_match('/^cat:"(.*?)"/i',$func)){ 
                    
preg_match('/^cat:"(.*?)"/i',$func,$matchesx); 
                    return 
'<?php echo $this->vars["'.$var.'"]."'.$matchesx[1].'";?>'
                }else if(
preg_match('/^truncate:([0-9]+)/i',$func)){ 
                    
preg_match('/^truncate:([0-9]+)/i',$func,$matchesx); 
                    return 
'<?php echo substr($this->vars["'.$var.'"],0,'.$matchesx[1].');?>'
                }else if(
preg_match('/^replace:"(.*?)":"(.*?)"/i',$func)){ 
                    
preg_match('/^replace:"(.*?)":"(.*?)"/i',$func,$matchesx); 
                    return 
'<?php echo str_replace("'.$matchesx[1].'","'.$matchesx[2].'",$this->vars["'.$var.'"]);?>'
                }else{ 
                    return 
'<?php echo $this->vars["'.$var.'"]; ?>'
                } 
            }else{ 
                return 
'<?php echo $this->vars["'.$matches[1].'"]; ?>'
            } 
        } else { 
            return 
$this->LeftHand.'$'.$matches[1].$this->RightHand
        } 
    } 

    private function 
__var_callback($vars
    { 
        
$vars preg_replace('#\\'.$this->LeftHand.'\$([a-zA-Z0-9\_]+)\\'.$this->RightHand.'#','$this->vars[\'$1\']',$vars); 
        
$vars preg_replace('#\\'.$this->LeftHand.'define\=\"(.*?)\"\\'.$this->RightHand.'#iU','$1',$vars); 
        return 
$vars
    } 

    private function 
__for_callback($matches
    { 
        
$matches[1] = $this->__var_callback($matches[1]); 
        
$return '<?php for('.$matches[1].'='.$matches[2].';'.$matches[1].'<='.$matches[3].';'.$matches[1].'++){ ?>'
        return 
$return
    } 

    private function 
__foreach_callback($matches
    { 
        if(isset(
$matches[3])){ 
            return 
'<?php foreach('.$this->__var_callback($matches[1]).' as '.$this->__var_callback($matches[2]).' => '.$this->__var_callback($matches[4]).') { ?>'
        }else{ 
            return 
'<?php foreach('.$this->__var_callback($matches[1]).' as '.$this->__var_callback($matches[2]).') { ?>'
        } 
    } 

    private function 
__obj_callback($matches
    { 
        
$matches array_map('trim',$matches); 
        if(isset(
$matches[3]) && $matches[3] === true
        { 
            return 
'<?php '.$this->__var_callback($matches[1]).'->'.$matches[2].'; ?>'
        }else{ 
            return 
'<?php echo '.$this->__var_callback($matches[1]).'->'.$matches[2].'; ?>'
        } 
    } 

    private function 
__if_callback($matches
    { 
        
$array = array(array('<','>','<=','>=','==','!='),array('gt','lt','gtq','ltq','eq','neq')); 
        
$cond  str_ireplace($array[1],$array[0],$matches[2]); 
        
$cond  $this->__var_callback($cond); 
        if(
preg_match('#^\\'.$this->LeftHand.'if#i',$matches[0])) 
        { 
            return 
'<?php if('.$cond.') { ?>'
        } else { 
            return 
'<?php }else if('.$cond.') { ?>'
        } 
    } 

    private function 
__func_callback($matches
    {     
        
$matches array_map('trim',$matches); 
        if(
function_exists($matches[1])){ 
            if(isset(
$matches[3])){ 
                
$matches[3] = trim($matches[3]); 
                
$matches[3] = $this->__var_callback($matches[3]); 
                return 
'<?php '.$matches[1].'('.$matches[3].'); ?>'
            }else{ 
                return 
'<?php '.$matches[1].'(); ?>'
            } 
        }else{ 
            
trigger_error('Call to undefined function '.$matches[1].'()',E_USER_ERROR); 
        } 
    } 

    private function 
__php_callback($matches
    { 
        return 
'<?php eval("'.addslashes($matches[1]).'"); ?>'
    } 

    private function 
__include_callback($matches
    { 
        if(
file_exists($matches[1]) && is_file($matches[1])) 
        { 
            return 
'<?php require('.$matches[1].'); ?>'
        }else{ 
            
$this->__error('Could require this file '.$matches[1]); 
        } 
    } 

    
/* 
       * display template function 
       * @param  : file name 
           * @param  : database content 
       * @return : file content 
           * @access : public  
    */ 
    
public function display($File,$dbcontent=false
    { 
        
$template realpath($this->templ)."/".$File.'.'.$this->templateExtension
        
$cache realpath($this->cache)."/".md5($File).".php"
        if(
$dbcontent == false
        { 
            
$this->content $this->getContent($template); 
            
$this->content $this->parce($this->content);                 
            if(
$this->userCache === true){ 
                if(
file_exists($cache)  && ($this->AutoDeleteCache === true)  
                    && (
time() - $this->DeleteCacheTime >= filemtime($cache))) 
                { 
                    
unlink($cache);// delete cache file 
                

                if(!
file_exists($cache) || filemtime($template) >= filemtime($cache)) 

  [
IMG]http://cdn5.tribalfusion.com/media/37536.gif[/IMG]    
                

                    
$opan  fopen($cache,"w"); 
                    if(
flock($opanLOCK_EX)) { 
                        
fwrite($opan,$this->content); 
                        
flock($opanLOCK_UN); 
                    } 
                    
fclose($opan); 
                } 
                
ob_start(); 
                require(
$cache); 
                
$content ob_get_clean(); 
                
ob_end_flush(); 
                return 
$content
            } else { 
                return eval(
"?>".$content); 
            } 
            unset(
$content); 
        } else { 
            
$dbcontent $this->parce($dbcontent); 
            if(
$this->userCache === true){ 
                if(
file_exists($cache) && ($this->AutoDeleteCache === true) &&  
                    
time() - $this->DeleteCacheTime >= filemtime($cache)) 
                { 
                    
unlink($cache);// delete cache file 
                

                if(!
file_exists($cache) || md5($db) !== md5(file_get_contents($cache))) 
                { 
                    
$opan fopen($cache,"w"); 
                    if(
flock($opanLOCK_EX)) { 
                        
fwrite($opan,$dbcontent); 
                        
flock($opanLOCK_UN); 
                    } 
                    
fclose($opan); 
                } 
                
ob_start(); 
                require(
$cache); 
                
$content ob_get_clean(); 
                
ob_end_flush(); 
                return 
$content
            } else { 
                return eval(
"?>".$content); 
            } 
          unset(
$dbcontent,$content); 
        } 
    } 
}


الكلاس تحت رخصة GPL3 مفتوح المصدر . يمنع حذف الحقوق و تبقى للمدرسة و حقوق المبرمج محفوظة

خصائص الكلاس :
امكانية استخدام الشروط وايضا التبديل switch
حلقات التكرار foreach , for
طباعة المتغيرات
استدعاء الملفات
التعامل مع الدوال
التعامل مع الكائنات
التعامل مع الثوابت

المميزات :
نظام الكاش
تشفير لملفات الكاش , مع استحالة معرفة الاسم الاصلي للملف مما يوفر حماية افضل.
امكانية حذف الكاش تلقائيا بعد مدة معينة
امكانية استخدام القوالب من قاعدة البيانات
يعمل على جميع اصدارات PHP حيث يعالج مشاكل بعض الدوال مثل file_get_contents
خصائص نوعا ما مثل smarty مثل دعم المتغيرات على الشكل التالي

كود PHP:
{$var|lower

طريقة التعامل مع الكلاس بشكل كامل
اولا سنتعرف على المتغيرات المتوفرة

كود PHP:
$cache 

يحمل اسم مجلد الكاش و ان لم يوجد يتم انشاء المجلد بشكل الي

كود PHP:
$templ 

يحمل اسم مجلد القوالب

كود PHP:
                            $AutoDeleteCache 
ياخذ قيمتين اما true او false حيث ان true تمكن القالب من حذف الكاش بشكل تلقائي بعد مدة معينة و false بدون حذف للكاش

كود PHP:
$DeleteCacheTime 

للتحكم في زمن حذف الكاش بعد كل مدة معينة و الامر يعتمد على حالة AutoDeleteCache حيث ان الزمن يجب ان يكون بالثواني

كود PHP:
$LeftHand 

وهي للتحكم في طريقة التعامل مع طريقة كتابة القالب من جهة اليسار (خاصية في smarty) مثال

كود PHP:
{$var
بواسطة الخاصية يمكنك ان تحدد بدل } ان تضع مثلا > او ] او اي رمز يناسبك

كود PHP:
$RightHand 
نفس الامر لكن من جهة اليمين

كود PHP:
$templateExtension 

صيغة ملفات القوالب, يمكنك ان تحدد اي صيغة لملف القالب الخاص بك.


ثانيا التعامل مع النظام
يمكنك التعامل مع النظام بشكل سلس وسريع
اول شيئ ستسدعي ملف الكلاس الخاص ب القالب بعد ذلك

كود PHP:
$artp = new ARTP(); 

ننشئ الكائن
ثم من اجل عرض صفحة معينة نضع

كود PHP:
echo $artp->display('header'); 


حيث ان header اسم ملف القالب الذي تود عرضه بدون اي صيغة لان الصيغة تحدد في الكلاس كما ذكرنا سابقا
بعد ذلك ننشئ مجلدين templates و cache الاول للقوالب و الثاني للملفات الكاش.

ننشئ ملف header بالصيغة التي حددت في الكلاس مع ضرورة وضع الملف في مجلد templates.
ضع في المجلد اي محتوى تريد مثال

كود PHP:
                            <html
    <
head
    </
head
     
    <
body
        <
h1
            
Template System 
        
</h1
    </
body

</
html

الان طريقة طباعة المتغيرات , تطبع المتغيرات بطريقة سلسة مثال


[PHP$var = "XML"; [/PHP]

المتغير var يجب ان يوضع في الملف الخاص بالقالب و طبعا قبل الامر الخاص باستدعاء القالب
وفي ملف القالب نضع الامر التالي

كود PHP:
{$var

وسيطبع المتغير بشكل اوتوماتيكي
الان طريقة التعامل مع الشروط
مثال

كود PHP:
$var 1

كود PHP:
                            if($var == ){ 

}else if(
$var == 2){ 

}else{ 



طريقة القيام بنفس الشرط باستخدام نظام القوالب

كود PHP:
{if condition="{$var} == 1"

{elseif 
condition="{$var} == 2"

{else} 

{endif} 

اعتقد الامر بسيط , لو توجد اي اشكالية في الخدمة

الان طريقة التعامل مع التبديل switch

كود PHP:
switch($var){ 
    case 
1
    echo 
"one"
    break; 
    case 
2
    echo 
"two"
    break; 
    default : 
    echo 
"not found"
    break; 


في السابق كنت تكتب التبديل على الطريقة التالية اما الان

كود PHP:
                            {switch var="{$var}"
    {case 
condition="1"
        
one 
    
{break} 
    {case 
condition="2"
        
two 
    
{break} 
    {default} 
        
not found 
    
{break} 
{endswitch 

الامر بسيط جدا و ليس بمعقد

الان طريقة التعامل مع حلقات التكرار
في البداية نضع مصفوفة , يمكن ان تكون مصفوفة مواضيع او اي شيئ

كود PHP:
$array = array('a','b','c','d','e'); 

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

كود PHP:
{foreach name="{$array}keys="{$keys}values="{$values}"
    {
$keys} => {$values
{endforeach} 

الامر فقط عملية foreach كما في php فقط تغير في كيفية الكتابة .

كود PHP:
    {$keys} => {$values

طباعة ل foreach حيث ان مفاتيح المصفوفة ستخزن في $keys وقيم المصفوفة ستخزن في $values

طريقة استخدام اكواد php داخل القالب

كود PHP:
{php
echo 
"yes"
{
endphp
طريقة طباعة الثوابت

كود PHP:
{define="__CLASS__"

طريقة التعامل مع المتغيرات بشكل اكثر احترافية ,
لو عند المصفوفة التالية

كود PHP:
$array = array('p'=>'php','h' => 'html'); 

واريد طباعة php
ساكتب كالتالي

كود PHP:
    {$array.p

و لو اريد طباعة html ساكتب

كود PHP:
    {$array.h

طريقة تطبيق بعض الدوال على المتغيرات
مثلا لو عندي نفس المصفوفة السابقة و اريد جعل كلمة Php كبيرة دون تدخل من php فقط عبر نظام القوالب
سانفذ الكود التالي

كود PHP:
{$array.p|upper
ولو عندك فقط متغير نفس الفكرة ستكون كالتالي

كود PHP:
{$var|upper
لو اردت ان تجعل الحروف صغيرة

كود PHP:
{$array.p|lower

لو اردت اضافة نفس في اخر قيمة المتغير

{$array.p|cat:"سيضاف النص في اخر المتغير"}

ولو اردت قص النص و اخذ فقط 30 حرف الاولية
ستضع فقط كالتالي

كود PHP:
    {$array.p|truncate:30

ولو اردت تغيير قيمة في المتغير بقيمة اخرى

كود PHP:
{$array.p|replace:"php":"xml"

حيث سيغير php بواسطة xml في قيمة المتغير


طريقة التعامل مع الكائنات

كود PHP:
                            class car
    var 
$name 'PHP'
     
    function 
go (){ 
        echo 
'yes ,,,,'
    } 

واريد استخراج المتغير name الموجود في الكلاس car
في البداية ننشئ الكلاس car

كود PHP:
$car = new car(); 
وفي القالب نضع

كود PHP:
{obj name="car" do="go()" ret="false"
حيث ان do هي ما سينفذ الكلاس و يمكنك ان تضع متغير مثل name ولكن بدون اقواس

اما بخصوص ret فهي ان اردت استخدام الكائن في شرط معين فانك تضع في قيمتها true اي ارجع القيمة و false ستقوم بطباعتها


الان طريقة التعامل مع الدوال
مثلا عندي الدالة

كود PHP:
                            function name(){ 
            echo 
'my name is bilal'
        } 


واريد تنفيذ الدالة داخل القالب
ساضع التالي فقط

كود PHP:
                            {func name="name" args=""

ولو ارد ارسال متغيرات مثال

كود PHP:
                            function calc($a,$b){ 
        echo 
$a+$b
    } 

سنضع في القالب

كود PHP:
{func name="calc" args="5,10"

طريقة استدعاء الملفات

كود PHP:
{include file="google.php"
نظام القوالب و قواعد البيانات , فلنفرض عندي جدول كالتالي

كود PHP:
     رمز PHP:                   CREATE TABLE IF NOT EXISTS `google` ( 
  `
idint(11NOT NULL AUTO_INCREMENT
  `
namevarchar(100NOT NULL
  
PRIMARY KEY (`id`) 
ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=

INSERT INTO `google` (`id`, `name`) VALUES 
(1'googl'), 
(
2'php'), 
(
3'googl'), 
(
4'php'); 
قمت بادخال 4 قيم و سنقوم بعرض النتائج في القالب
نضع اتصال

كود PHP:
$connect mysql_connect('localhost','root','root'); 
mysql_select_db('test',$connect); 
$query mysql_query("select * from google"); 

واستعلام لجلب جميع القيم من الجدول
نقوم بوضع

كود PHP:
while($rows mysql_fetch_assoc($query)){ 
     
$x[] = $rows


حيث نخزن القيمة في مصفوفة جديدة

الان فيا القالب

كود PHP:
                            {foreach name="{$x}keys="{$key}values="{$val}"
        {
$val.id}  
        <
br /> 
        {
$val.name
    {endforeach} 

المصفوفة السابقة في حلقة التكرار
name - id من الجدول استدعينا القيم كاستدعاء للمصفوفة



تمنياتي لكم بالتوفيق و السلام خير ختام



ArTemplate نظام قوالب 0.2

ArTemplate نظام قوالب 0.2