ورود

نسخه کامل مشاهده نسخه کامل : Smarty يک Templating Engine برای PHP



masoud_razor
10-07-2008, 21:35
مقدمه : چرا از Template استفاده کنيم ؟
در يک جمله می توان گفت برای جدا کردن منطق برنامه از نحوه ارائه!
با استفاده از يک Templating Engine می توان به اين هدف درست يافت به ترتيبی که برنامه نويس در گير ارائه و طراح رابط کاربر درگير کار برنامه نويس نشوند و با يک زبان مشترک باهم تعامل خواند داشت. به اين ترتيب برنامه نويس خيلی راح می تواند منطق برنامهرا عوض کند بدون اينکه در گير ارائه شود و طراح نيز می تواند بدون کمک برنامه نويس شکل و شمايل يک سايت را کاملاً عوض کند.
اين چند جمله بايد تا حدی برای شما روشن کرده باشد که با استفاده از اين روش تا چه حد انعطاف در کار بوجود می آيد. جالب نيست؟!

تعداد زيادی Templating Engine برای PHP وجود دارد از کلاسهای PEAR گرفته تا Smarty و بسياری ابزار های ديگر، ولی با توجه به موضوع اين مقاله از ديگر ابزار ها صرف نظر کرده و به Smarty(
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید) می پردازيم .
Smarty از PHP و Zend Engine استفاده می کند و با استفاده از آن، برنامه ها را با کمترين سربار نسبت به حالتی که از Template استفاده نشده باشد اجرا می شوند چون Smarty يک بار الگو را کامپايل کرده و تا وقتی که الگو تغيير پيدا نکد از نسخه کامپايل شده استفاده می نمايد. برای بالا بردن کارايی امکانات caching هم دارد.

Smarty چگونه کار می کند ؟

Smarty بصورت شی گرا طراحی شده و عمل می کند پس برای استفاده از آن بايد يک instance از آن ايجاد کنيم :



<?php
require_once('Smarty.class.php'); // use absolute path here, if necessary
$smarty = new Smarty;
?>




Smarty بصورت پيش فرض در همان شاخه ای که صدا می شود دنبال الگو می گردد ولی بنا به دلايل امنيتی الگوها نبايد در شاخه ای که از طريق وب قابل دسترسی هستند قرار گيرند برای معرفی مسير دايرکتوريهای Smarty به شکل زير عمل می کنيم :



$smarty->template_dir = '/var/[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]';
$smarty->compile_dir = '/var/[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]';
$smarty->config_dir = '/var/[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]';
$smarty->cache_dir = '/var/[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]';




شاخه template شاخه ای است که Smarty در آن به دنبال فایلهای .tpl می گردد.
شاخه compile شاخه ای است که Smarty در آن الگوهای کامپایل شده را ذخیره می کند.
شاخه config شاخه ای است که Smarty در آن به دنبال فایلهای تنظیمات می گردد.
شاخه cache شاخه ای است که Smarty در آن به دنبال فایلهایcache را ذخیره می کند.

روش دیگری نیز برای معرفی این متغیر ها وجود دارد و آن هم استفاده از مفهوم ارث بری است :




<?php
// require the Smarty class
require_once('Smarty.class.php');

// extend the Smarty class
class my_Smarty extends Smarty {

function my_Smarty() {

// create the Smarty object
$this->Smarty();
// set Smarty folders
$this->template_dir = '/var/[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]';
$this->compile_dir = '/var/[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]';
$this->config_dir = '/var/[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]';
$this->cache_dir = '/var/[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]';

// set other Smarty options
$this->use_sub_dirs = false;

}

}
?>





حالا وقت آن رسیده که استفاده از Smarty را در عمل ببینیم :




//test.php
<?php
// require the Smarty class
require_once('Smarty.class.php');
// extend the Smarty class
class my_Smarty extends Smarty {

function my_Smarty() {

// create the Smarty object
$this->Smarty();
// set Smarty folders
$this->template_dir = '/var/[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]';
$this->compile_dir = '/var/[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]';
$this->config_dir = '/var/[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]';
$this->cache_dir = '/var/[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]';

// set other Smarty options
$this->use_sub_dirs = false;

}

}
//creating an instance of my_smarty
smarty=new my_smarty();
// assign values from PHP
$smarty->assign('title', 'this is a sample');
$smarty->assign('testـstatement', 'Hello friends');

// display a template
$smarty->display('test.tpl');
?>








//test.tpl
<html>
<head><title>{ $title }</title></head>
<body> { $testـstatement }!</body>
</html>



هنگامی که مرور گر درخواستی برای صفحه test.php می فرستد مقدار متغیر ها بصورت \ویا توسط PHP مقدار دهی میشود و خروجی برای کار بر به شکل زیر خواه بود :

[/code]


Hello friends !

[/code]

استفاده ازفایلهای Configuration :
این فایلهای برای طراحیان Template بسیار مفید است، چرا که می توانند تنظیماتی را که در سراسر سیستم استفاده می شود مانند رنگها و ... را در این فایلها قرار دهند.

masoud_razor
10-07-2008, 21:36
#config.conf
# Sample configuration file
# Pound signs are used for comments
colorA=#cccccc
colorB=#eeeeee
title=\"iranphp – first Persian PHP Resource\"
[test_section]
test_section_title=\"test\"
test_section_title_Color=#000000







//test.tpl
{config_load file=\"config.conf\"}
<html>
<head><title>{ $title }</title></head>
<body bgcolor=\"{colorA}\"> { $testـstatement }!</body>
</html>




در مثال فوق با اجرای test.php مقادیر متغیر ها توسط PHP و Config فایل تعیین می شود و در نتیجه خروجی زیر تولید می شود :



<html>
<head><title>iranphp – first Persian PHP Resource </title></head>
<body bgcolor=\"#cccccc\"> test!</body>
</html>




Smarty امکانات بسیار گسترده تراز آنچه در این مقاله به آن اشاره شد دارد از جمله فیلترها ،حلقه ها و عبارات شرطی و بسیاری امکانات دیگر که بررسی آنها خارج از بحث این مقاله است و در اینجا مراد نشان آشنایی با این Templating Engine بود .

منابع :

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

موفق باشيد

masoud_razor
10-07-2008, 21:41
نمونه برنامه
تابع چک کردن صحت ادرس e-mail ی


<?php

function checkemail($email){
list($mailbox,$domain) = split('@',$email,2);
$state = 'domain';

// find preferred mailserver
if(getmxrr($domain,$mailhosts,$pref)){
asort($pref);
foreach($pref as $preferred){
$mailserver = $mailhosts[key($pref)];
break;
}
$state = "trying mailserver $mailserver\";
$state = mailconnect($mailserver,$email);
}else{
// no mail exchange found try as host
$state = \"No MX, trying $domain\";
$state = mailconnect($domain,$email);
}
return $state;
}

function mailconnect($mailserver,$email){
$myhostname = $SERVER_NAME;
$connection = fsockopen($mailserver, 25);
if($connection){
$state = \"connected to $mailserver\";
// Nothing to do with greeting
//$smtpgreeting = fread($connection, 512);

//if($smtpgreeting){
fputs($connection, \"HELO $myhostname\r\n\");
$hello = fgets($connection, 512);
if($hello){
$state = \"chatting to $mailserver: $hello\";
fputs($connection, \"MAIL FROM: <webserver@$myhostname>\r\n\");
$youok = fgets($connection, 512);
if($youok){
$state = \"chatting to $mailserver: $youok\";
fputs($connection, \"RCPT TO: <$newaddress>\r\n\");
$recepient = fgets($connection, 512);
$state = \"chatting to $mailserver: $recepient\";
if(ereg('250',$recepient)){
fputs($connection, \"QUIT\r\n\");
$deliverable = true;
$state = false;
}elseif(ereg('220',$recepient)){
fputs($connection, \"QUIT\r\n\");
$deliverable = true;
$state = false;
}else{
$deliverable = false;
$state = \"RCPT? $recepient $newaddress\";
}
}
}else{
$state = \"$mailserver not accepting mail now, please try again.\";
}
//}else{
//$state = 'mailserver not greeting me';
//break;
//}
}else{
$state = \"$mailserver not listening\";
}
return $state;
}
?>





با استفاده از تابع checkmail می توانید وضعیت هر آدرس پست الکترونیکی را پیدا کنید . دقت کنید که این تابع وضعیت رو بر می گرداند شما می توانید با تغییر هر وضعیت به true یا false از صحت یا سقم آدرس پست الکترونیک با خبر شوید و آنرا در برنامه خود استفاده کنید

masoud_razor
10-07-2008, 21:43
نمونه برنامه
گرفتن متحوای یک سایت



<?php
function get_web_content($website_address) {
$site_content=''; // to make notice happy
$file_handle=fopen($website_address,"r\");
while ($line=fgets($file_handle,1000))
{
$site_content.=$line;
}

fclose ($file_handle);

return $site_content;
}

$website_address='[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]';
$site_content=get_web_content($website_address);

?>

masoud_razor
10-07-2008, 21:45
نمونه برنامه



ی Login - Logout

<?php

//need this to get session variables
session_start();
//Solution for -Page has Expired- error
header("Cache-Control: \");
header(\"pragma: \");


//Check if session is ok or not
if (!$PHPSESSID) {
session_register(\"username\");
} else if (!$visitors) {
session_register(\"username\");
}

//is login button pressed
if($login){
if($loginname){
if($password){
if($loginname==\"test\" && $password==\"test\"){
$username=\"Test User\";

/* If you like jump to another page uncomment this and change
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
* to point where you like it
*
header(\"Location: [ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]");
exit;
* */
} else {
$msg=\"Wrong username or password\";
$username=\"\";
}
}else {
$msg=\"Password missing\";
$username=\"\";
}
} else {
$msg=\"Username missing!\";
$username=\"\";
}
}

//*If logout unset all session variables
if($logout){
$username=\"\";
}
?>

<html>
<head>
</head>
<body>
<form name=\"logaction\" method=\"post\">
<?php
if(!$username){
?>
Username<br>
<input type=\"text\" name=\"loginname\" size=\"10\">
<br>
Password<br>
<input type=\"password\" name=\"password\" size=\"10\">
<br>
<input type=\"submit\" name=\"login\" value=\"Login\">
<br><br>
Try <br>
username:test<br>
password:test<br>
<?php
//display login messages
echo \"<br>\".$msg.\"<br>\n\";

} else {
//display user name
echo \"User:\".$username.\"<br>\n\";
?>
<input type=\"submit\" name=\"logout\" value=\"Logout\">

<!--
Enter here data here
-->
<?php
}
?>
</form>
</body>
</html>

masoud_razor
10-07-2008, 21:57
نحوه اتصال به بانک اطلاعاتی MySQL ی

<?php
$link = mysql_connect("localhost\", \"mysql_user\", \"mysql_password\")
or die(\"Could not connect\");
print (\"Connected successfully\");
mysql_close($link);
?>

masoud_razor
10-07-2008, 22:22
ایجاد بانک اطلاعاتی جدید در MySQL سرور






<?php
$link = mysql_pconnect("localhost\", \"mysql_user\", \"mysql_password\")
or exit(\"Could not connect\");

if (mysql_create_db(\"my_db\")) {
print (\"Database created successfully\n\");
} else {
printf (\"Error creating database: %s\n\", mysql_error ());
}
?>
در اینجا در صورتی که Username و Password شما دسترسی به ایجاد بانک جدید در MySQL داشته باشد بانکی با نام my_db ایجاد خواهد شد

masoud_razor
10-07-2008, 22:38
بابا یکی یه تشویقی تشکری بکنه دمتون گرم

neopersia
10-07-2008, 23:42
سلام و خسته نباشید
من دو تا پیشنهاد دارم.
اول اینکه کدهای PHP رو بزاری تو تگ [php] تا درست نشون داده بشه و راحت بشه اونا رو خوند.
دومیش هم اینه که برای هر پست یا کد منبعشو بنویسی تا دوستانی که میخوان استفاده کنند در صورت نیاز به اطلاعات در مورد اون بتونن مراجعه کنند و همینطور اعتبار اون کد هم تا حدی مشخص میشه.
مثلاً پست شماره 7 رو ببینید. میاد برای ارسال یک کوئری یک اتصال دائمی به دیتابیس ایجاد میکنه که حتی بعد از توقف اسکرپت هم بسته نمیشه! گذشته از اون اصلاً توی یک سرور واقعی به مشتری اجازه نمیدن با استفاده از php دیتابیس بسازه (به دلایل امنیتی)

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

David.Jn
11-07-2008, 01:36
سلام و خسته نباشید
من دو تا پیشنهاد دارم.
اول اینکه کدهای PHP رو بزاری تو تگ [php] تا درست نشون داده بشه و راحت بشه اونا رو خوند.
دومیش هم اینه که برای هر پست یا کد منبعشو بنویسی تا دوستانی که میخوان استفاده کنند در صورت نیاز به اطلاعات در مورد اون بتونن مراجعه کنند و همینطور اعتبار اون کد هم تا حدی مشخص میشه.
مثلاً پست شماره 7 رو ببینی....

منم عجیب موافقم:46:

dogtag
11-07-2008, 11:58
منبعش که معلومه از iranphp ه

من هم یه 2 دو کلمه حرف دارم باهات:
این خوبه که می خوای آموزش بدی (بد بینانه اش میشه: می خوای پست هات رو زیاد کنی) ، ولی منبع خیلی مهمه.
دوستان خیلی رعایتت رو کردند ولی من 1 کم خودمونی تر بگم.
این که بیای کپی - پیست کنی، خیلی کار نا فرمیه.
الان شما کوتیشن های کدت escape شده است، تو تگ PHP هم نذاشتی، به قول خودمون tidy هم که نیست، منبع هم نگفتی.

ولی اطلاعات خوبی رو رسوندی، ممنون

masoud_razor
11-07-2008, 14:58
سلام و خسته نباشید
من دو تا پیشنهاد دارم.
اول اینکه کدهای PHP رو بزاری تو تگ [php] تا درست نشون داده بشه و راحت بشه اونا رو خوند.
دومیش هم اینه که برای هر پست یا کد منبعشو بنویسی تا دوستانی که میخوان استفاده کنند در صورت نیاز به اطلاعات در مورد اون بتونن مراجعه کنند و همینطور اعتبار اون کد هم تا حدی مشخص میشه.
مثلاً پست شماره 7 رو ببینید. میاد برای ارسال یک کوئری یک اتصال دائمی به دیتابیس ایجاد میکنه که حتی بعد از توقف اسکرپت هم بسته نمیشه! گذشته از اون اصلاً توی یک سرور واقعی به مشتری اجازه نمیدن با استفاده از php دیتابیس بسازه (به دلایل امنیتی)

یه درخواست هم دارم در مورد عنوان تاپیک. عنوانی که انتخاب کردید فقط برای پستهای اول مناسبه. بهتره یک عنوان دیگه برای این تاپیک انتخاب بشه.
منبع [ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]