amir_s
Active Member
سلام دوستان
این Template Engine ی که می بینید رو برای یک سیستم WMS که در حال نوشتنش هستم، نوشتم ... از اونجایی که این سیستم هنوز آماده نشده، این Template Engine هم نقص هایی داره که با پیشرفت پروژه و با راهنمایی و کمک شما حرفه ای های این کار بر طرف میشه ...
بریم سر اصل مطلب ...
این فایل Class اصلی این Template Engine هست که در فایلی مثلا به نام theme.inc.php ذخیره می کنیم .
و اما طریقه استفاده از اون ...
فرض کنید برای یک سیستم خبری بخواید از این موتور استفاده کنید .
این قالب یکسری متغیر های عمومی داره ... مثلا Title صفحه و یا URL صفحه و ... و قسمت هایی که باید تکرار پذیر باشن ...
مثلا متن خبرها ... و لینکها، و خود خبر ها هم بعضی از قسمت هاشون ممکنه فرق کنن ... مثلا یکی ادامه مطلب داره ، یکی لینک نظر دهید داره و ...
خیلی خیلی ساده و فقط برای بررسی نحوه عملکرد، فرض کنید این یک فایل Template هستش ... که اون رو به نام template.htm ذخیره می کنیم :
همونطور که می بینید، متغیر ها به شکل [VarName] ( البته می تونن هر جوری باشن ) هستن و بعضی قسمت ها هم به صورت <!-- NAME --> ( متن داخل اونها باید فقط شامل حروف، اونهم حروف بزرگ باشه، دقیقا مثل مثال ) هستن ...
قسمت هایی مثل داخل قسمت LINKS ، تکرار میشن و لینک ها رو میسازن ... قسمت NEWS هم که مثل LINKS تکرار پذیره ... با این تفاوت که داخل خودش تگ های دیگه ای داره ... مثلا COMMENT و MORE که برای هر نوشته می تونن وجود داشته باشن و یا نداشته باشن ( توی ادامه مثال متوجه خواهید شد )
قسمت COPYRIGHT رو هم برای یک مثال دیگه اضافه کردیم ...
و حالا فایل index.php
ابتدا فایل theme.inc.php رو include کنید و بعد یک Instance از کلاس بسازید، پارامتر درون این Function آدرس فایل Templateمون هستش:
حالا تگ های عمومی یا همون General رو مثل همون URL و TITLE صفحه اضافه کنید، به این صورت :
همونطور که دیدید، تابع general دو تا پارامتر میگیره، اولی آرایه ای از تگ ها و دومی آرایه ای از اطلاعاتی که باید با تگ ها replace بشن.
برای اضافه کردن لینک ها ابتدا باید یک block بسازید ... از این دستور استفاده کنید ( پارامتر اول، یک String از همون تگیه که درون فایل Template بود. و پارامتر دوم هم آرایه ای از تگ هایی که درون این Block وجود داره )
حالا با استفاده از دستور addBlockContent می تونید به قسمت LINKS، هر چیزی که می خواید اضافه کنید، استفاده از این دستور محدودیت نداره ... یعنی هر چه قدر استفاده کنید، لینک های قبلی سر جاشون میمونن :
متوجه شدید که پارامتر اول، نام اون Blockی هست که ایجاد کردید و پارامتر دوم آرایه ای از مقادیری که باید Replace بشن ... به این شکل ما سه تا لینک اضافه کردیم ...
البته این دستور پارامتر سومی هم می گیره که اختیاری هستش ... که در ادامه توضیح میدم ...
برای قسمت NEWS هم به همین ترتیب ... ابتدا Block رو ایجاد کنید و بعد محتویاتش رو قرار بدید ... اما اینجا اون پارامتر سوم به کار میاد، و اجازه میده که شما بعضی تگ های خاص رو حذف کنید ... مثلا لینک read more و یا لینک comment ، پارامتر سوم هم آرایه ای از این تگ هاست ... :
در اینجا ما سه تا خبر اضافه کردیم ... اولی هم لینک Read More داره و هم Comment ، دومی لینک Comment نداره ، و سومی هیچ کدوم رو نداره !
ضمنا می تونید با استفاده از دستور removeBlock یک Block خاص رو Remove کنید ... مثلا در فایل Template مثال ما، شما می تونید قسمت Copyright رو با استفاده از دستور زیر حذف کنید :
و در انتها هم با استفاده از apply تغییرات رو اعمال کنید و با استفاده از دستور getContent ، قالب رو دریافت کنید :
کل مثال فایل php اینطوری میشه :
همین.
همونطور که عرض کردم، خیلی تا کامل شدن اون WMS مونده ... این Class هم قراره با کامل شدن اون پروژه کامل بشه ...
پس حتما نقصهایی داره که بی صبرانه منتظر شنیدنش هستم.
ممنون از وقتی که می گذارید.
(فایل های بالا رو پیوست کردم )
این 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 هم قراره با کامل شدن اون پروژه کامل بشه ...
پس حتما نقصهایی داره که بی صبرانه منتظر شنیدنش هستم.
ممنون از وقتی که می گذارید.
(فایل های بالا رو پیوست کردم )