My Template Engine

amir_s

Active Member
سلام دوستان

این Template Engine ی که می بینید رو برای یک سیستم WMS که در حال نوشتنش هستم، نوشتم ... از اونجایی که این سیستم هنوز آماده نشده، این Template Engine هم نقص هایی داره که با پیشرفت پروژه و با راهنمایی و کمک شما حرفه ای های این کار بر طرف میشه ...

بریم سر اصل مطلب ...

این فایل Class اصلی این Template Engine هست که در فایلی مثلا به نام theme.inc.php ذخیره می کنیم .
PHP:
<?php
	
	class Theme {
		var $list;
		var $file;
		var $content;
		var $BLOCKS;
		function Theme($theme_file) {
			$this->file = $theme_file;
			$this->f = fopen($this->file,"r");
			$this->content = fread($this->f,filesize($this->file));
			fclose($this->f);
		}
		function general($tags,$data) {
			$this->content = str_replace($tags,$data,$this->content);
		}
		function newBlock($to,$tags) {
			$__1 = explode("<!-- " . $to . " -->",$this->content);
			$__2 = explode("<!-- /" . $to . " -->",$__1[1]);
			$___1 = $__1[0];
			$___2 = $__2[0];
			$___3 = $__2[1];
			$____1 = $___1 . "<!-- " . md5($___2) . " -->" . $___3;
			$this->list[] = $to;
			$this->BLOCKS[$to]["p"] = $___2;
			$this->BLOCKS[$to]["tag"] = md5($___2);
			$this->BLOCKS[$to]["tags"] = $tags;
			$this->BLOCKS[$to]["block"] = "";
			$this->content = $____1;
		}
		function removeBlock($to) {
			$this->content = $this->remove($to,$this->content);
		}
		function remove($it,$fromIt) {
			$__1 = explode("<!-- " . $it . " -->",$fromIt);
			$__2 = explode("<!-- /" . $it . " -->",$__1[1]);
			$___1 = $__1[0];
			$___2 = $__2[0];
			$___3 = $__2[1];
			$____1 = $___1 . $___3;
			return $____1;
		}
		function addBlockContent($to,$data,$toRemoves = "") {
			$this->thisBlockb = $this->BLOCKS[$to]["p"];
			if ($toRemoves != "") {
				foreach($toRemoves as $rem) {
					$this->thisBlockb = $this->remove($rem,$this->thisBlockb);
				}
			}
			$this->BLOCKS[$to]["block"] .= str_replace($this->BLOCKS[$to]["tags"],$data,$this->thisBlockb);
		}
		function apply() {
			foreach ($this->list as $b) {
				$this->content = str_replace("<!-- " . $this->BLOCKS[$b]["tag"] . " -->",$this->BLOCKS[$b]["block"],$this->content);
			}
			$this->content = ereg_replace("<!-- [A-Z\-]+ -->","",$this->content);
			$this->content = ereg_replace("<!-- /[A-Z\-]+ -->","",$this->content);
		}
		function getContent() {
			return $this->content;
		}
		
	}

?>

و اما طریقه استفاده از اون ...
فرض کنید برای یک سیستم خبری بخواید از این موتور استفاده کنید .
این قالب یکسری متغیر های عمومی داره ... مثلا Title صفحه و یا URL صفحه و ... و قسمت هایی که باید تکرار پذیر باشن ...
مثلا متن خبرها ... و لینکها، و خود خبر ها هم بعضی از قسمت هاشون ممکنه فرق کنن ... مثلا یکی ادامه مطلب داره ، یکی لینک نظر دهید داره و ...
خیلی خیلی ساده و فقط برای بررسی نحوه عملکرد، فرض کنید این یک فایل Template هستش ... که اون رو به نام template.htm ذخیره می کنیم :
PHP:
<html>
	<head>
		<title>[Title]</title>
	</head>
	<body>
		<h1>Welcome to <a href="[URL]">[SiteName]</a></h1>
		<br />
		
		<h2>Lastest links :</h2>
			<ul>
				<!-- LINKS -->
					<li><a href="[LinkURL]">[LinkName]</a></li>
				<!-- /LINKS -->
			</ul>
		<br />
		<h2>Lastest news :</h2>
		
		<br />
			<!-- NEWS -->
					<h3>[NewsTitle]</h3>
					<p>[NewsText]</p><br />
					<!-- MORE --><a href="[URL]/[NewsID]">Read more</a><br /><!-- /MORE -->
					<!-- COMMENT --><a href="[URL]/comments/[NewsID]">Add a comment</a><br /><!-- /COMMENT -->
					<hr />
			<!-- /NEWS -->
		<br />
		
		<!-- COPYRIGHT -->
			Powered by AMIR_S Template Engine
		<!-- /COPYRIGHT -->
	</body>
</html>

همونطور که می بینید، متغیر ها به شکل [VarName] ( البته می تونن هر جوری باشن ) هستن و بعضی قسمت ها هم به صورت <!-- NAME --> ( متن داخل اونها باید فقط شامل حروف، اونهم حروف بزرگ باشه، دقیقا مثل مثال ) هستن ...
قسمت هایی مثل داخل قسمت LINKS ، تکرار میشن و لینک ها رو میسازن ... قسمت NEWS هم که مثل LINKS تکرار پذیره ... با این تفاوت که داخل خودش تگ های دیگه ای داره ... مثلا COMMENT و MORE که برای هر نوشته می تونن وجود داشته باشن و یا نداشته باشن ( توی ادامه مثال متوجه خواهید شد )

قسمت COPYRIGHT رو هم برای یک مثال دیگه اضافه کردیم ...
و حالا فایل index.php

ابتدا فایل theme.inc.php رو include کنید و بعد یک Instance از کلاس بسازید، پارامتر درون این Function آدرس فایل Templateمون هستش:
PHP:
include("theme.inc.php");

$thm = new Theme("template.htm");

حالا تگ های عمومی یا همون General رو مثل همون URL و TITLE صفحه اضافه کنید، به این صورت :
PHP:
	// General Tags
	$thm->general(
			array(
				"[URL]",
				"[Title]",
				"[SiteName]"
			),array(
				"http://localhost/te",
				"Test NEWS website",
				"My Site"
		));

همونطور که دیدید، تابع general دو تا پارامتر میگیره، اولی آرایه ای از تگ ها و دومی آرایه ای از اطلاعاتی که باید با تگ ها replace بشن.

برای اضافه کردن لینک ها ابتدا باید یک block بسازید ... از این دستور استفاده کنید ( پارامتر اول، یک String از همون تگیه که درون فایل Template بود. و پارامتر دوم هم آرایه ای از تگ هایی که درون این Block وجود داره )
PHP:
$thm->newBlock('LINKS',
						array(
							"[LinkURL]",
							"[LinkName]"
						));

حالا با استفاده از دستور addBlockContent می تونید به قسمت LINKS، هر چیزی که می خواید اضافه کنید، استفاده از این دستور محدودیت نداره ... یعنی هر چه قدر استفاده کنید، لینک های قبلی سر جاشون میمونن :
PHP:
	$thm->addBlockContent('LINKS',
							array(
								"http://majidonline.com",
								"Majid Online"
							));
							
	$thm->addBlockContent('LINKS',
							array(
								"http://yahoo.com",
								"Yahoo!"
							));
							
	$thm->addBlockContent('LINKS',
							array(
								"http://google.com",
								"Google"
							));


متوجه شدید که پارامتر اول، نام اون Blockی هست که ایجاد کردید و پارامتر دوم آرایه ای از مقادیری که باید Replace بشن ... به این شکل ما سه تا لینک اضافه کردیم ...
البته این دستور پارامتر سومی هم می گیره که اختیاری هستش ... که در ادامه توضیح میدم ...

برای قسمت NEWS هم به همین ترتیب ... ابتدا Block رو ایجاد کنید و بعد محتویاتش رو قرار بدید ... اما اینجا اون پارامتر سوم به کار میاد، و اجازه میده که شما بعضی تگ های خاص رو حذف کنید ... مثلا لینک read more و یا لینک comment ، پارامتر سوم هم آرایه ای از این تگ هاست ... :
PHP:
	$thm->newBlock('NEWS',
						array(
							"[NewsTitle]",
							"[NewsText]",
							"[NewsID]"
						));				
	
	$thm->addBlockContent('NEWS',
							array(
								"News Title one",
								"The news text one ... and the news text one ... ",
								"1"
							));
	
	$thm->addBlockContent('NEWS',
							array(
								"News Title two",
								"The news text two ... and the news text two ... ",
								"2"
							),array(
								"COMMENT"
							));
							
	$thm->addBlockContent('NEWS',
							array(
								"News Title three",
								"The news text three ... and the news text three ... ",
								"3"
							),array(
								"COMMENT",
								"MORE"
							));

در اینجا ما سه تا خبر اضافه کردیم ... اولی هم لینک Read More داره و هم Comment ، دومی لینک Comment نداره ، و سومی هیچ کدوم رو نداره !

ضمنا می تونید با استفاده از دستور removeBlock یک Block خاص رو Remove کنید ... مثلا در فایل Template مثال ما، شما می تونید قسمت Copyright رو با استفاده از دستور زیر حذف کنید :

PHP:
$thm->removeBlock('COPYRIGHT');

و در انتها هم با استفاده از apply تغییرات رو اعمال کنید و با استفاده از دستور getContent ، قالب رو دریافت کنید :

PHP:
$thm->apply();
	
	echo($thm->getContent());

کل مثال فایل php اینطوری میشه :
PHP:
<?php

	include("theme.inc.php");


	$thm = new Theme("template.htm");
	
	// General Tags
	$thm->general(
			array(
				"[URL]",
				"[Title]",
				"[SiteName]"
			),array(
				"http://localhost/te",
				"Test NEWS website",
				"My Site"
		));
	
	

	$thm->removeBlock('COPYRIGHT');

	
	

	$thm->newBlock('LINKS',
						array(
							"[LinkURL]",
							"[LinkName]"
						));
	
	
	$thm->addBlockContent('LINKS',
							array(
								"http://majidonline.com",
								"Majid Online"
							));
							
	$thm->addBlockContent('LINKS',
							array(
								"http://yahoo.com",
								"Yahoo!"
							));
							
	$thm->addBlockContent('LINKS',
							array(
								"http://google.com",
								"Google"
							));
							
						
						
							
	$thm->newBlock('NEWS',
						array(
							"[NewsTitle]",
							"[NewsText]",
							"[NewsID]"
						));				
	
	$thm->addBlockContent('NEWS',
							array(
								"News Title one",
								"The news text one ... and the news text one ... ",
								"1"
							));
	
	$thm->addBlockContent('NEWS',
							array(
								"News Title two",
								"The news text two ... and the news text two ... ",
								"2"
							),array(
								"COMMENT"
							));
							
	$thm->addBlockContent('NEWS',
							array(
								"News Title three",
								"The news text three ... and the news text three ... ",
								"3"
							),array(
								"COMMENT",
								"MORE"
							));

	
	$thm->apply();
	
	echo($thm->getContent());
?>

همین.

همونطور که عرض کردم، خیلی تا کامل شدن اون WMS مونده ... این Class هم قراره با کامل شدن اون پروژه کامل بشه ...
پس حتما نقصهایی داره که بی صبرانه منتظر شنیدنش هستم.


ممنون از وقتی که می گذارید.

(فایل های بالا رو پیوست کردم )
 

پیوست ها

  • Template Engine.rar
    1.5 کیلوبایت · بازدیدها: 29

amir_s

Active Member
یک پیشنهادی که خودم دارم اینه که تگ های مربوط به هر Block رو در قسمت newBlock وارد کنم تا در قسمت addBlockContent لازم نباشه هر دفعه نام تگ ها نوشته بشه .
 

pckiller

Member
سلام
موتور تمپلیت شما خیلی خوبه ولی یک جاش مشکل داره .
من نتونستم حل کنمش اما اگه شما بتونید حلش کنید خیلی خوب میشه آخه من از این موتور در چند سیستم استفاده کردم .

مشکل :

وقتی میخوایم یک لیست رو داخل یک بلاک که بلاک هم با این موتور درست شده تکرار کنیم کار نمیکنه چون چنین چیزی تعریف نشده.
این هم کدش .

کد:
<div id="DJ-Right"><ul>
<!-- RIGHT -->
<li><span><h2>[R.Title]</h2><div class="Icon" style="background:url([URL][R.Icon])"></div></span>
<h1>
<ul id="Rl1">
<!-- /RIGHTT -->
<li><a href="[R2.Link]">[R2.Text]</a></li>
<!-- /RIGHTT -->
</ul>
</h1>
</li>
<!-- /RIGHT -->
</ul></div>

خیلی ممنون میشکم کاری کنید که این امکان هم فراهم باشه


ممنون
 

جدیدترین ارسال ها

بالا