• 2 رای - 4 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
روش های ساخت template engine
#1
می خوام دو روش برای ساخت template engine برای پروژه ها رو اموزش بدم البته امیدوارم اشکالاتم رو دوستانم گوش زد کنن .

نمیدونم اسمی که انتخاب کردم درسته یا نه لطفا اگه اشتباه هست راهنایی کنین .
این پست رو در جواب دوستی که چند روز پیش در مورد masterpage سوال کرده بود قرار میدم .

در روش اول سعی بر این هست که کامل html و php رو از هم جدا کنن که با این کار فهم و تغییر دادن کد خیلی راحت میشه (البته نه کامل کامل)

میرم سراغ اموزش

ابتدا ساختار کلی سایت رو با html ,css طراحی می کنیم .

در واقع قسمت های ثابت در تمام صفحات رو طراحی میکنم .
نمونش به صورت زیر هست .

کد پی‌اچ‌پی:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<
html xmlns="http://www.w3.org/1999/xhtml">
<
head>
<
meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<
link rel="stylesheet" href="style.css" />
<
title></title>
</
head>
<
body>

    <
div id="holder">
        <
div id="menu"></div>
        <
div id="content"></div>
        <
div id="footer"></div>
    </
div>

</
body>
</
html


قسمت هایی که قرار متن داخل اونها تغییر کنه عبارت است از title , menu ,content,footer پس این قسمت ها رو با یک علامت خاص مشخص میکنیم .

اینکار رو به صورت زیر انجام میدیم.

کد پی‌اچ‌پی:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<
html xmlns="http://www.w3.org/1999/xhtml">
<
head>
<
meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<
link rel="stylesheet" href="style.css" />
<
title>{title}</title>
</
head>
<
body>

    <
div id="holder">
        <
div id="menu">{menu}</div>
        <
div id="content">{content}</div>
        <
div id="footer">{footer}</div>
    </
div>

</
body>
</
html

قالب اصلی رو ساختیم حالا میریم سر وقت کد نویسی برای بغییه کارا یه فایل جدید با نام template.class.php تعریف میکنیم .
کاری که ما قررا هست توسط این کلاس انجام بدیم از قرار زیر هست.
محتوای مربوط به قسمت های مختلف مانند title و دیگر قسمت ها رو دریافت و در محل های مربوط به خودشون قرار بدیم که این قسمت رو با جایگذینی قسمت های مشخص کرده در فایل html مون با محتوامون انجام میدیم .

بغییه اموزش رو در اولین فرصت قرار میدم .
#2
حالا میریم سر وقت بغییه اموزش و ساخت کلاس .


روش کار رو در جلسه قبل توضیح دادم و کلیات کار همون ها هست ولی طرز نوشتن کلاس دلبخواهی هست و شما به هر نحوی که صلاح بدونین و خواسته باشین می تونین اون رو تغییر بدین .


کد پی‌اچ‌پی:
<?php
class template{
    
    private 
$array_varible=array();
    private 
$file;

    function 
set_varible($index,$value)
    {
        
$this->array_varible["$index"]=$value;
    }
    function 
get_template()
    {
        
        if( 
file_exists("template.html"))
        {
            
$fh fopen("template.html""r");
            
$this->file fread($fh,filesize("template.html"));
            foreach(
$this->array_varible as $var =>$value)
            {
                
                
$this->file=str_replace('{'.$var.'}',$value,$this->file);
            }
    
        }
    
    }
    function 
__destruct()
    {
        echo 
$this->file;
    }
}

?>

در اول کار یک ارایه خصوصی برای نگهداری مقادیری مانند عنوان صفحه محتوا و... و یک متغییر خصوصی برای نگهداری محتوای فایل template تعریف کردایم .

بعد سه تابع تعریف کردایم تابع اول یا set_varible نام فیلد و مقدار اون رو میگیره و در ارایه قرار میده . به عنوام مثال set_varible("title","my first page") a و اما تابع دوم این تابع در ابتدا وجود فایل را چک می کنه و در صورت موجود بودن ان کل فایل را خوانده و ان را در یک متغییر قرار می دهد سپس داخل ارایه حرکت کرده وبه ازای هر خانه ارایه یک بار تابع str_replace را فراخوانی کرده و توسط ان مقدار اندیس ارایه را همراه با دو علامت کروشه در دو طرف ان در متغییر حاوی فایل تمپلیت جستجو کرده سپس مقدار ان را با مقدار وجود در ارایه عوض می کنیم .

درتابع اخر نیز مقادیر را به خروجی میفرستیم . این تابع به صورت خودکار در در زمانی که فضای گرفته شده ازاد شود فراخوانی میشود .
تشکر شده توسط : scooter amir.s texas
#3
در روش اول در حالیکه php را از html جدا کرده بودیم و لی یک مشکل داشت و ان هم این بود که برای هر قسمت که قرار بود جاگذین شود یک بار کل فایل برای پیدا کردن ان قسمت خوانده و سپس قسمت پیدا شده با محتوای مورد نظر جایگذین می شد و این خود زمان زیادی را صرف می کرد .

در روش دوم از روشی بهتر استفاده می شود که سرعت ان به مراتب از این روش بیشتر است و در مقابل هنوز ازتباط php و html قطع نشده است .


توضیح این روش را بزودی در اینجا قرار خواهم داد .
تشکر شده توسط : mohsenkw
#4
در این روش شما ساختار فایل template را به صورت زیر تعریف می کنید و این بار پسوند ان را php تعیین می کنید

کد پی‌اچ‌پی:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<
html xmlns="http://www.w3.org/1999/xhtml">
<
head>
<
meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<
link rel="stylesheet" href="style.css" />
<
title><?php echo $this->title ?></title>
</head>
<body>

    <div id="holder">
        <div id="menu"><?php echo $this->menu ?></div>
        <div id="content"><?php echo $this->content ?></div>
        <div id="footer"><?php echo $this->footer ?></div>
    </div>

</body>
</html> 
در اینجا ما به جای جایگذینی علامات خاص با محتوا متغییر هایی را قرار داده ایم و فقط ما این متغییر ها را توسط کلاس template مقدار میدهیم


کلاس template را به صورت زیر پیاده سازی می کنیم و نام ان را template.class.php می گذاریم



کد پی‌اچ‌پی:
<?php
  
class template
  
{
      private 
$menu;
    private 
$content;
    private 
$title;
    private 
$footer;

    
    
    function 
set_menu($menu)
    {
        
$this->menu=$menu;
    }
    function 
set_content($content)
    {
        
$this->content=$content;
    }
    function 
set_title($title)
    {
        
$this->title=$title;
    }
    function 
set_footer($footer)
    {
        
$this->footer=$footer;
    }
    
    function 
__destruct()
      {
        include(
'template.php');
    }
  }
 
?>
تشکر شده توسط : amir.s texas mohsenkw
#5
با کار شما موافقم ولی کپی از یک متغییر به یک متغییر دیگه زمان بر نیست .

با این کار می خواستم قسمتی رو که با پایگاه داده کار میکنه با قسمت که وظیفه نمایش رو بر عهده داره جدا کنم .
در واقع یکمی به سمت تکنیک mvc پیش بریم البته نمی دونم چغدر در این زمینه موفق بودم .
تشکر شده توسط :
#6
محمد جان درسته که از متغییر اضافه استفاده کردم و حافظه اضافی دارم مصرف می کنم ولی در مقابل این حافظه اضافه چیز بیشتری بدست اوردم

و اون جدا کردن کامل قسمت اتصال به بانک اطلاعاتی با قسمت نمایش اطلاعات هست که خود این می تونه در بهبود سیستم در اینده خیلی مفید باشه .
تشکر شده توسط :
#7
اقا محمد اینجا داریم با هم بحث می کنیم تا بتونیم یه روش خوب و یه نتیجه گیری عالی بگیریم .

امیدوارم از حرفام ناراحت نشده باشی


در مورد سوالتون هم من اطلاعات درستی ندارم ولی امیدوارم بچه های سایت بتونن در این مورد جواب کاملی بدن چون برای خود من هم جالبه .

اگه یکی بیاد روش سیستم رو هم تجذیه و تحلیل کنه که دیگه عالی میشه .
تشکر شده توسط :
#8
HuhExclamation
تشکر شده توسط :
#9
4 سال بعد ...
تشکر شده توسط : undefined aliwebdesign


پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان