اسمارتی(Smarty) - از آغاز تا پایان

siavashmusic

Active Member
* این آموزش ها منبع اصلیشون از راهنمای Smarty هست البته من برداشت خودم رو نسب به این راهنما بیان میکنم به همراه مواردی که توی نت و کتب مختلف برای یادگیری این Template Engine جستجو کردم پس در صورتی که منبع خاصی باشی حتما اشاره میکنم

مبحث اول :

[highlight]مقدمه : [/highlight]


تقریبا 2 سال پیش برای انجام یه پروژه قالبمند مجبور شدم دنبال یه موتور تمپلیت بگردم که با اسمارتی آشنا شدم میشه گفت با شناختن اسمارتی و بطور کلی Template Engine یه تحویل بزرگی توی طراحی - برنامه نویسی من پیش اومد (حالا چرا ؟! زیاد مهم نیست چون اینجا جاش نیست . . .) وقتی فهمیدم که اسمارتی یه کلاس Php هست که برای مدیریت کدهای استفاده شده در وب سایت بکار میره و موجب میشه که براحتی اجزاء سایت رو ویرایش کنیم برام خیلی مهم و جذاب بود بطور مثال شما درنظر بگیرید یه مطلبی که بصورت خبر در یک سایت منتظر شده چطور میتواند تیتر خبر / تاریخ انتشار خبر / نویسنده خبر / متن خبر را بصورت قالبمند نمایش دهد !؟ برای تحقق به این آرمان اسمارتی این امکان را میدهد که تمپلیتی قابل ویرایش و قابل استفاده در تگ های HTML طراحی کنیم ! با این اوصاف دیگه هم Programer و هم Designer در صورت نیاز چنانچه تمایل به دست بردن در ظاهر و یا کدهای سیستم داشته باشند بدون دخالت در حیطه کاری هم میتونند کار خودشون رو بدون هیچ مشکلی انجام دهند

خوب این یک مقدمه بود که فکر میکنم بصورت ساده و سلیس توضیح دادم بهتره حالا بریم سر اصل مطلب و برای بیان اون بهتره یه مقدار کتابی تر و رسمی تر صحبت کنیم

------------------------------
برای شروع اسمارتی بهتر است با سایت این موتور تمپلیت اشنا بشویم برای دسترسی به این کلاس و دریافت اخرین نسخه میتوانید از آدرس اینترنتی www.smarty.net جدیدترین پکیج که شامل اخرین تغییرات نیز میباشد دریافت کنید
Template Engine های فراوانی برای Php موجود هست که میتوان اسمارتی یکی از برترین های آنها دانست Smarty از Php و Zend Engine بهره میگیرد و برنامه ها را با کمترین زمان ممکن اجرا میکند چون اسمارتی یکبار الگو را کامپایل میکند تا زمانی که الگو تغییری حاصل نکند دیگر نیاز به کامپایل ان ندارد اط طرفی همانطور که در ادامه بطور مفصل عرض خواهم کرد Smarty از Caching به نحو احسنت بهره گرفته است


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

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

اسمارتی درون شاخه ای که فراخوانی میشود اما بدلیل موارد امنیتی الگو ها نباید درون شاخه هایی که از طریق وب قابل دسترسی میباشند جاگذاری شوند از این جهت برای معرفی مسیر Smarty بدین شکل عمل میکنیم



PHP:
$smarty->template_dir = '/var/www/templates/app1/template/';
$smarty->compile_dir = '/var/www/templates/app1/compile/';
$smarty->config_dir = '/var/www/templates/app1/config/';
$smarty->cache_dir = '/var/www/templates/app1/cache/';

شاخه Template مسیری است که اسمارتی درون آن بدنبال فایل های tpl. میگردد (منظور فایل های مربوط به ساختار تمپلیت میباشد)
شاخه Compileمسیری است که اسمارتی درون آن الگوهای کامپایل شده را ذخیره میکند
شاخه Config مسیری است که اسمارتی درون آن بدنبال فایل های تنظیمات میگردد
شاخه Cache مسیری است که اسمارتی درون آن فایل های Cache شده خود را ذخیره میکند

روش دیگری نیز روشی دیگر جهت معرفی این متغییرها وجود دارد که روش ارث بری نامیده میشود که بصورت زی میتوانید عمل کنید.

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/www/templates/app1/template/';
$this->compile_dir = '/var/www/templates/app1/compile/';
$this->config_dir = '/var/www/templates/app1/config/';
$this->cache_dir = '/var/www/templates/app1/cache/';
// set other Smarty options
$this->use_sub_dirs = false;
}
}
?>

[highlight]
خصوصیات اسمارتی Smarty
[/highlight]

1- دارای سرعت زیاد میباشد
2- تا زمانی که در PHP خطایی رخ نداده باشد، مفید بود و بدون مشکل کار میکند.
3- فقط یکبار کامپایل می شود.
4- فقط فایلهایی را که تغییر کرده اند را دوباره کامپایل می نماید.
5- شما می توانید توابع سفارشی و یا متغیرهای ویرایشگر استفاده کنید، بنابراین قالبها قالب انعطاف پذیری پیدا می کنند.
6- قالب ها با استفاده از تگهای حائل (delimiter tag) یعنی {} ، {{}} ، <—{}--!> قابل پیکربندی می باشند.
7- ساختارهای if/elseif/else/endif در عبارات PHP گذاشته می شوند، یعنی عبارت {if …} می تواند ساده و یا پیچیده باشد.
8- اجازه استفاده بخش ها مثل if ها و غیره را بصورت نامحدود تودرتو وجود دارد.
9- می توان کدهای PHP را در فایلهای Template درون سازی نمود، اگر چه توصیه نمیشود
10- امکان ساپورت Caching که یکی از بزرگترین و بهترین قابلیت های اسمارتی محسوب میشود

* توجه : برای استفاده از اسمارتی به Php 4.0.6 به بالا نیاز است


پایان مبحث اول
 
آخرین ویرایش:

siavashmusic

Active Member
Caching در Smarty

همانطور که قبلا اشاره کرده بودیم Cache در اسمارتی نکته بسیار مهمی محسوب شده بگونه ای که پس از یکبار فراخوانی تمپلیت در موارد بعدی نیازی به فراخوانی مجدد و متقابلا خواندن از دتابیس و Feed های مختلف نیست در واقع این عملکرد خارق العاده اسمارتی میباشد که موجب افزایش سرعت آن میشود
بطوریکه میبیندی در بخش خصوصیات بدین صورت ذکر شده It is extremely fast یعنی [highlight]بشدت[/highlight] سریع که نشان دهنده این امر میباشد

[highlight] 1. شروع Caching در اسمارتی [/highlight]


بطور کلی استفاده از قابلیت Cacheدر اسمارتی باعث ، ایجاد تغیرات در صدا زدن display() وfetch() میشود که این دو تابع بیشتر کاربرد را در اسمارتی دارند که تابع اول برای نمایش فایل تمپلیت و تابع دوم برای خواند دیتابیس مورد استفاده قرار میگیرد.زمانی که خروجی توابع display() یا fetch() کش میشود ، فایل Cache شده در دایرکتوری $cache_dir ایجاد میشود ، این فایل میتواند یک فایل تمپلیت ، Config و ... را در بر بگیرد.


[highlight] 2. تنظیمات Caching [/highlight]

اولین کار فعال کردن قابلیت Caching در اسمارتی است ، اینکار با مقداردهی متغیر $caching انجام میشود.

PHP:
<?php
require('Smarty.class.php');
$smarty = new Smarty;

$smarty->caching = true;

$smarty->display('index.tpl');
?>


در حالت معمولی تابع display(‘index.tpl’) هنگام صدا زدن ، فایل تمپلیت را رندر میکند و نتیجه را بصورت خروجی نمایش میدهد ، اما زمانی که شما Caching را فعال میکنید ، این تابع به هنگام رندر کردن فایل تمپیلیت ، یک کپی از انرا بصورت کپی Cache شده ، ذخیره میکند ، زمانی که دوباره تابع display(‘index.tpl’) صدا زده شود ، فایل Cache شده ، بصورت خروجی نمایش داده میشود و نیاز دوباره به رندر فایل تمپلیت نخواهد بود ، و این یعنی افزایش سرعت و کاهش بار بر روی سرور !

نکته : فایل های موجود در دایرکتوری $cache_dir نام های شبیه فایلهای تمپلیت اصلی دارند، اما با این تفاوت که دارای پسوند .php هستند ، اما این فایل های اسکریپتهای قابل اجرا (executable php scripts) نیستند ، دقت کنید که این فایل ها را ویرایش نکنید.

تمام صفحاتی که Cache میشوند ، دارای طول عمر مشخصی خواهند بود ، این زمان توسط متغیر $cache_lifetime مشخص میشوند ، مقدار پیشفرض این تابع ، 3600 ثانیه ، برابر 1 ساعت ، هست ، و پس از گذشت این زمان ، فایل های Cache غیر قابل استفاده میشوند و دراولین بار صدا زدن تابع display() با فایل های جدید رندر شده جایگزین میشوند.

امکان این که شما به هر صفحه طول عمر مشخصی بدهید نیز وجود دارد ، اینکار با با نسبت دادن مقدار 2 به متغیر $caching انجام میشود

PHP:
<?php
require('Smarty.class.php');
$smarty = new Smarty;

$smarty->caching = 2; // lifetime is per cache

// set the cache_lifetime for index.tpl to 5 minutes
$smarty->cache_lifetime = 300;
$smarty->display('index.tpl');

// set the cache_lifetime for home.tpl to 1 hour
$smarty->cache_lifetime = 3600;
$smarty->display('home.tpl');

// NOTE: the following $cache_lifetime setting will not work when $caching = 2.
// The cache lifetime for home.tpl has already been set
// to 1 hour, and will no longer respect the value of $cache_lifetime.
// The home.tpl cache will still expire after 1 hour.
$smarty->cache_lifetime = 30; // 30 seconds
$smarty->display('home.tpl');
?>


اگر $compile_chek فعال باشد ، در هر بار اجرا شدن صفحات ، ابتدا اخرین زمان ایجاد Cache File چک شده و اگر از آن زمان به بعد تغییر دیگری در فایل تمپیلیت بوجود امده باشد ، فایل های Cache شده ی قبلی با فایل های جدید جایگزین میشود ، اینکار overhead کمی را ایجاد میکند که این مقدار ، بسیار ناچیز است و مشکلی ایجاد نمیکنید اما گر نیاز به بالاترین performance دارید باید ، برای دستیابی به بهترین performance مقدار $compile_chek را بصورت false تنظیم کنید.

متغیر $force_complie زمانی تنظیم میگردد که شما در حال ، تست و رفع خطا ( debugging ) باشید ، در این صورت ، در هر بار اجرا شدن صفحات ، فایل Cache جدید ایجاد میشود ، زیرا دراین زمان شما در پی رفع اشکلات و خطا هستید و با تغیر سورس برنامه ، تغیرات را نمیتوانید مشاهده کنید زیرا ، فایل های Cache شده ی قبلی نمایش داده میشوند ، راه دیگر این است که متغیر $caching را با مقدار false تنظیم کنید.

از تابع is_cheked() میتوانید برای فهمیدن اینکه ، تمپلیت مورد نظر در حال حاضر دارای فایل Cache معتبر هست یا خیر استفاده کنید ، و در صورتی که فایل Cache مورد نیاز موجود بود ، از ادامه عملیات رندر تمپیلیت و به دنبال دریافت اطلاعات و پردازش آنها ، جلوگیری کنید.

PHP:
<?php
require('Smarty.class.php');
$smarty = new Smarty;

$smarty->caching = true;

if(!$smarty->is_cached('index.tpl')) {
    // No cache available, do variable assignments here.
    $contents = get_database_contents();
    $smarty->assign($contents);
}

$smarty->display('index.tpl');
?>

شما میتوانید قسمت هایی از صفحه خود را ، بصورت کاملا Daynamic نگه داشته و بقیه قسمت هارا Cache کنید ، اینکار با استفاده از تابع insert در Smarty Engine قابل انجام است ، برای مثال ، فرض کنید که در سمت راست صفحه خود یک بنر دارید که در هر بار اجرا شدن صفحه ، بنر متفاوتی را نمایش میدهد ( مثل همین بنر بالای همین صفحه مجید آنلاین ) ،در صورتی که تمام قسمتهای این صفحه Cache شود ، در هر بار اجرا شدن صفحه تنها همان بنری که در زمان Cache شدن موجود بوده ، نمایش داده میشود ، و نتایج متفاوت ظاهر نخواهد شد ، با استفاده از تابع insert شما میتوانید قسمتهای متخلفی از صفحه را از Cache شدن ، محفوظ نگه دارید و آنها را بصورت کاملا Daynamic نمایش دهید.

در صورتی که $compile_chek بصورت False تنظیم شده باشد ، پس چگونه میتوان ، در زمان تغیرات در فایل ها ، Cache جدید را جایگزین Cache های قبلی کرد ؟

فرض کنید که صفحه اصلی وبلاگ خود را Cache کردید ( یا بصورت Full Cache ، یا بصورت چند قسمتی . . . ) ، حال زمانی که شما یک مطلب جدید را وارد بانک اطلاعاتی میکنید ، با استفاده از توابع clear_all_cache() تمام فایل های Cache موجود را پاک کرده و یا با تابع clear_cache() تنها فایل های Cache قبلی را پاک کرده و تغیرات را جایگزین کند .

PHP:
<?php
require('Smarty.class.php');
$smarty = new Smarty;

$smarty->caching = true;

// clear out all cache files
$smarty->clear_all_cache();

// clear only cache for index.tpl
$smarty->clear_cache('index.tpl');

$smarty->display('index.tpl');
?>

پایان مبحث دوم
 
آخرین ویرایش:

miladmovie

Active Member
در صورتی که بخوایید یک صفحه رو کش کنید مثلا show.php ولی به این فایل با توجه به ورودی URL مقادیر متفاوتی نشون می ده می تونید از این روش استفاده کنید
PHP:
<?php
require('Smarty.class.php');
$smarty = new Smarty;

$smarty->caching = 1;

$my_cache_id = $_GET['article_id'];

$smarty->display('show.tpl', $my_cache_id);
?>
 

mosi20

Active Member
سلام
من يه چيزايي رفتم خوندم و آخرش اين چيزا را فهميدم.
اين قالب فايل index.tpl هستش
HTML:
{* Smarty *}
{foreach item='tekrar_name' from=$mytekrar}
 <a href="{$tekrar_name.id}">{$tekrar_name.name}</a><br />
{/foreach}
اين هم فايل index.php
PHP:
<?php

// load Smarty library
require_once('smarty/Smarty.class.php');
$smarty = new Smarty();
$smarty->caching = 1;


$smarty->template_dir = 'temp/templates/';
$smarty->compile_dir = 'temp/templates_c/';
$smarty->config_dir = 'temp/configs/';
$smarty->cache_dir = 'temp/cache/';


$items_list[1]['name']='manam';
$items_list[1]['id']='1';
$items_list[2]['name']='toii';
$items_list[2]['id']='2';
$smarty->assign('mytekrar',$items_list);

$smarty->display('index.tpl');
?>
يكم اگه 2 تاييشو نگاه كنيد ميفهميد چي شده.
اول يه array تعريف ميكنيم مثلا به اسم $items_list
و براش مقادير name و id را مشخص ميكنيم.
حالا توي فايل tpl با استفاده از foreach اين array را به قالب مربوط ميكنيم.
 

siavashmusic

Active Member
خروجی تاریخ و ساعت در اسمارتی - date_format

فعلا جسته گریخته مطلب مینویسم انشالله از هفته آینده مبحث به مبحث اسمارتی رو دنبال میکنیم تا بتونیم تمومش کنیم



برای نمایش تاریخ و ساعت روی تمپلیت از این ویرایشگر استفاده میکنیم بصورت و فرمت های گوناگون میتونید ساعت جاری رو در هر قسمت از Template به نمایش در بیارید

date_format


اینModifiers یا ویرایشگر ساعت و تاریخ رو براساس استاندارد ()strftime در php نمایش میده شما میتوند تاریخ رو به هر روشی که دوست دارید (مطابق با MySql ) و توسط فانکشن ()strftime قابل بررسی باشه به Smarty ارسال کنید
حالا براحتی میتونید با استفاده از ویرایشگر date_format بر روی شکل نمایش تاریخ کنترل داشته باشید

به مثال زیر توجه کنید
PHP:
$smarty->assign('yesterday', strtotime('-1 day'));

Where template is (uses $smarty.now):​
PHP:
{$smarty.now|date_format}
{$smarty.now|date_format:"%D"}
{$smarty.now|date_format:"%I:%M %p"}
{$yesterday|date_format}
{$yesterday|date_format:"%A, %B %e, %Y"}
{$yesterday|date_format:"%H:%M:%S"}

حالا اینم خروجی :
PHP:
Feb 6, 2001
02/06/01
02:33 pm
Feb 5, 2001
Monday, February 5, 2001
14:33:00

کلیه مبدل های متناظر Modifiers date_format

a% نام اختصاری روزهای هفته توسط این کارکتر فراخوانی می شود
َ A% نام کامل روزهای هفته
b%نام اختصاری ماههای سال
B%نام کامل ماههای سال
c% جهت نمایش تاریخ و ساعت جاری مورد استفاده قرار میگیرد
C% نام قرن
d% شماره روز جاری ماه = عددی بین 00 الی 31
D% معادل پارامترهای %m/%d/%y
e% شماره روز جاری ماه = عددی بین 1 الی 31
g% شماره سال جاری = عددی بین 00 الی 99
G% شماره سال جاری = عددی بین 0000 الی 9999
h% مشابه b% میباشد
H% ساعت جاری = عددی میان 00 الی 23
I% ساعت جاری = عددی بین 01 الی 12
j% شماره روز جاری سال = عددی بین 001 الی 366
K% ساعت جاری = عددی بین 0 تا 23
l% ساعت جاری = عددی بین 1 الی 12
m% شماره ماه جاری سال = عددی بین 01 الی12
M% دقیقه جاری
n% کارکتر جرکت به سطر بعدی
p% نمایش پیشفرض am یا pm با توجه به وقت جاری
r% نمایش زمان با پیشفرش های am , pm
R% نمایش ساعت با نماد 24 ساعته
S% نمایش ثانیه
t% کارکتر tab
T% زمان جاری بصورت %H:%M:%S
u% شماره روز هفته = عددی بین 1 الی 7
U% شماره روز سال جاری
V% شماره هفته از سال جاری براساس استاندارد = بین عدد 01 الی 53
w% شماره روز جاری هفته = عددی بین 0 تا 6
W% شماهر هفته جاری سال
x% نحوه نمایش تاریخ بدون ساعت
X% نمایش ساعت بدون تاریخ
y% نمایش عدد سال جاری = عددی بین 00 الی 99
Y% نمایش عدد سال جاری = 0000 الی 9999
Z% نام نصف النهار زمانی
%% نمایش کارکتر %

تا قبل از Smarty نسخه 2.6.10 String های عددی قابل پردازش توسط ()strtotime بصورت تاریخ پردازش میشدند نه ساعت
همچنین در این نسخه داده های عددی ارسالی به ویرایشگر date_format همواره بعنوان فرمت یونیکس پردازش میشوند


پایان
 

NabiKAZ

Well-Known Member
سلام ،
اميدوارم مثل آموزشهايي (مثل اينجا) نباشه که فقط استارت زده ميشه و تداوم نداره.

در مورد مبحث template engine ها من یه بررسی کردم دیدم همچین smarty بدون برنامه نویسی هم نیست ! یعنی یه جورایی برنامه نویسی و سبک کد نویسی خودش رو در قالبها و فایلهای tpl نیاز داره که فرد designer باید به اونها آشنا باشه. نمونش همین فرمان foreach یا include است...
به همین دلایل دنبال سیستم دیگه بودم.

رفتم سراغ phpNuke و سعی کردم از سیستم اون سر در بیارم، دیدم که سیستم template engine اون بسیار ساده و جالبه و نیاز به یادگیری حتی یک فرمان یا برنامه نویسی نداره و به طوری که designer کاملا فکرش رو روی html میزاره و درگیر دستورات و متغییر ها و ... نمیشه.

نمیخوام ذهن خواننده ها رو منحرف کنم، فقط نظر شخصی خودم رو گفتم. سعی میکنم در این باره تاپیک مجزا ایجاد کنم.

تشکر
نبی
 

jalilvand

Member
اسمارتی هم نیازی به برنامه نویسی نداره. البته برنامه نویسیش خیلی کارو راحت کرده ولی با یه assign و display و loop تقریبا همه کاری می شه کرد (در حد مبتدی).

حالا چرا ادامه نمیدید؟
 

NabiKAZ

Well-Known Member
سلام ،
اميدوارم مثل آموزشهايي (مثل اينجا) نباشه که فقط استارت زده ميشه و تداوم نداره.

ظاهراً گفته من درست از آب در اومده.
دوستان عزیز لطف کنند و محبت بفرمایند از این به بعد در انتخاب نام تاپیک دقت بیشتری به خرج دهند و مثلا از این عناوین استفاده شود:
آموزش جامع و کامل ... در 9999999 سال !
یا:
آموزش جامع و کامل و بدون نقص و همه چیز از آغاز تا به پایان ... فقط در 4 خط !!!

اینجوری کاربرها، منتظر یا گمراه نخواهند شد.
بد میگم؟
 

siavashmusic

Active Member
چهارچوب و Base دستورات در اسمارتی Part One

قبل از هر چیز عذرخواهی میکنم حقیقتا اونقدر سرم شلوغ هست که نمیرسم بیام سوالات دوستان رو پاسخ بدم همونطور که میبینید کاملا دست تنها هستم و عملا فقط مکن داریم توی این بخش مدیریت میکنم و بقه مدیران بدلیلی مشغله فراوان وقت سر زدن رو ندارند به همین دلیل یه مقدار بدقولی قابل بخشش باید باشه اینطور نیست ؟!

لطفا دوستانی که توی این بخش پست ارسال کردند پست های خودشون رو DELETE کنند تا آموزش ها بصورت پیوسته باشه
اخیرا یک سیستم مدیریت ثبت لینک نوشتم با قابلیت بسیاغر استثنایی که برای اولین بار در یک پروژه بزرگ تحت وب از تکنولوژی اسمارتی توش بهره بردم انشالله پس از آماده شدن لینکش رو میدم تا بررسی کنید

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

همونطور که میدونید دستورات ُSmarty درون یک جفت {} قرار میگیرد و کلیه ک های خارج از این علامت بعنوان پیام ثابت بکار میرود و غیر قابل تغییر میباشد چنانچه اسمارتی با دستورات مرتبط با تمپلیت برخورد میکند خروجی متانسب با دستورات را برای ما نمایشم میدهد
دقیقا همانند کامنتی که ما در فایل های php استفاده میکنیم امکان توضیح و تفسیر هر کد و مجموعه دستوران مرتبط توسط علایم {* و *} قابل انجام است

مثال :


کد:
<body>
{* a single line comment*}
{* this multiline comment is not sent to browser*}
{* include the header file here*}
{include file="header.tpl"}
{* Dev not:$includeFile is assigned in foo.php script *}
<!-- this html comment is send to browser-->
{include file=$includeFile}
{include file=#includeFile#}
{* this <select> block is redundant *}
{*
<select name="company">
{html_options=$vals selected=$selected_id}
</select>
*}
</body>

متغیرها :

متعییرها با علامت $ مشخص میشوند که برای نامیدن آن از اعداد - حروف و علامت خط تیره استفاده میشود
جهت دسترسی به عناصر یک آرایه توابع و ویژگیهای یک شیء میتوان از متغییر ها بهره برد در مورد فایل پیکربندی بدین شکل نمیباشد یعنی در فایل های پیکربندی اسمارتی متغییرها از علامت $ استفاده نمیکنند اما بجای آن از یک جفت ## یا از طریق فراخوانی در $smarty.config قابل دسترسی میباشند


کد:
{$foo} <-- displaying a simple variable (non array/object)
{$foo[4]} <--display the5th element of a zero-indexed array
{$foo.bar} <-- display the "bar" key value of an array , similar to PHP $foo['bar']
.
.
.
این مبحث رو در ادامه دروس اسمارتی توضیح میدم

توابع در اسمارتی :

توابع از طریق پارمترهایی که درون علایم {} قرار گرفته اند مورد بررسی قرار میگیرند
مثالی از فراخوانی یک تابع

کد:
{funcname attl1="val" attr2="val"}

دستورات اسمارتی یکی از دو عمل زیر را انجام میدهند . ..

الف - چاپ محتویات یک متغییر
ب - فراخوانی یک تابع

مثال :

کد:
{config_load file="colors.conf"}
{include file="header.tpl"}
{if $highlight_name}
Welcome,<font color="{#fontColor#"">{$name}!</font>
{else}
Welcome,{$name}@
{/if}
{include file="footer.tlp"}

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

کد:
{if} , {section} , {strip}
غیر قابل تغییر میباشند اما توابعی که بصورت یک Addons یا Plugin به تمپلیت افزوده میشوند قابل تغییر میباشند که مانند :


کد:
{html_options} , {popup}

جزو این گروه میباشند .

پارامترها :

در اثر توابع از صفات جهت نوع عملکرد آنها استفاده می شود در اسمارتی نیز یک صفت برای تابع عملکردی همانند پارامترها در توابع سایر زبانهای برنامه نویسی دارد هرچند ملزم به قرار دادن مقادیر عددی درون علایم نقل و قول نیستید اما بهتر است از رشته های حروفی درون این علایم قرار گیرند استفاده از متغییرها بعناون صفت یک تابع بدون مانع است و برای استفاده آن نیاز به علامیم نقل و قول نمیباشد

کد:
{include file='header.tpl'}
{include file='header.tpl' attrib_name='attrib value'}
{include file=$includeFile}
{include file=#includeFile# title='Smarty is cool'}
{html_select_date display_dats=yes}
{mailto address='[email protected]'}
<select name='company_id'>
{html_options options=$companies selected=$company_id}
</select>

پایان بخش اول . . .

سیاوش عقیلی
 

alireza82

Well-Known Member
سلام
تقریبا موارد ابتدایی همشون گفته شدن فقط من هم یه تیکه مربوط به دسترسی به متغییر ها ی خاص رو میزارم اینجا.
خوب این هم برای دسترسی به متغییر هایی مثل سشن ها و کوکی ها و متغییر های پست و گت :
کد:
{* display value of page from URL ($_GET) http://www.example.com/index.php?page=foo *}
{$smarty.get.page}

{* display the variable "page" from a form ($_POST['page']) *}
{$smarty.post.page}

{* display the value of the cookie "username" ($_COOKIE['username']) *}
{$smarty.cookies.username}

{* display the server variable "SERVER_NAME" ($_SERVER['SERVER_NAME'])*}
{$smarty.server.SERVER_NAME}

{* display the system environment variable "PATH" *}
{$smarty.env.PATH}

{* display the php session variable "id" ($_SESSION['id']) *}
{$smarty.session.id}

{* display the variable "username" from merged get/post/cookies/server/env *}
{$smarty.request.username}
و برای دسترسی به متغییر های ثابت از
کد:
{$smarty.const.MY_CONST_NAME}
استفاده میکنیم.
 

bahy_my

Active Member
سلام... درجمع حرفه ای ها جا شیم خودش خیلی خوبه.
************************

بعد از یادگیری مراحل اولیه ی کار با اسمارتی و ارسال متغیر به فایل تمپلیت نوبت به مرحله ی بعدی میشه که شما با این آموزش می تونید بگید " من با اسمارتی می تونم یه پروژه رو انجام بدم ".. البته باید تمرین کرد !!.. توی هر چیزی ;)
خوب. بریم سراغ درس
تابع if در اسمارتی :

PHP:
{if $var eq "bahman"} 
Salam {$var}, Modiriat montazere shomast 
{/if}

این یک مثال ساده بود...

عملگر های شرطی در اسمارتی اینطوری هستن :




== برابر با eq
!= برابر با neq|ne
< برابر با lt
> برابر با gt
<= برابر با lte|le
>= برابر با gte|ge​



برای ایجاد حلقه در اسمارتی توبع foreach و section وجود دارن.
که ما قصد داریم section رو کار کنیم ( توی این آموزش )

فرض بر اینه که می خوایم از یک بانک اطلاعاتی اطلاعات رو بخونیم و توی فایل تمپلیت نشون بدیم.
اول از همه باید متغیر ها رو توی Php معرفی کنیم و بعد اون ها رو به فایل ارسال کنیم و از تابع section برای نمایش استفاده کنیم.


PHP:
// start sql query 
$db=mysql_connect("localhost","root",""); 
mysql_select_db("data"); 
$query=mysql_query("select * from user"); 
for($i=0; $i<mysql_num_rows($query); $i++){ 
$record=mysql_fetch_array($query); 
// inja maghadire filedhaye sql ro varede do motaghayer mikonid 
$phone[$i]=$record['phone']; 
$users[$i]=$record['name']; 
// be tedade fieldha code bala ro benevisid va dar file tpl mesle hamin do filed tekrar konid 
} 
// end sql query 

// entering variables 

$smarty->assign("title","Hello"); 
$smarty->assign('users',$users); 
$smarty->assign('phone',$phone); 
// end entering variables 

// start display template 
$smarty->display('header.tpl'); 
$smarty->display('index.tpl'); 
$smarty->display('footer.tpl'); 
// end display template


خوب مثلا فایل footer.tpl امل اینه :
HTML:
</BODY> 
</HTML>

فایل هدر رو هم که از آموزش قبلی دارین.

این الگوریتم :


PHP:
for($i=0; $i<mysql_num_rows($query); $i++){ 
$record=mysql_fetch_array($query); 
// inja maghadire filedhaye sql ro varede do motaghayer mikonid 
$phone[$i]=$record['phone']; 
$users[$i]=$record['name']; 
// be tedade fieldha code bala ro benevisid va dar file tpl mesle hamin do filed tekrar konid 
}

میاد تمام رکورد های فیلد های name و phone در جدول user رو به آرایه های معادل خودشون نسبت می ده...
( این دیگه کد php هستش... باید خودتون متوجهش بشید.. اگه نشدین دوباره فکر کنین... اگه بازم نشدین php رو بزارید کنار... اگه دوست دارین تنبلی کنید توی انجمن php بپرسین جواب داده خواهد شد )

خوب, کار ما توی php تموم شد.. حالا این آرایه ها توی اسمارتی با {$users}, {$phone} قابل دسترسی اند ( یادتنو نره اینا آرایه هستن)
خوب... اسمارتی :

PHP:
<strong>salam, khobi ?</strong><br /> 
<br /> 

{section name=name loop=$users } 
salam {$users[name]}, khoobi ?<br /> 
shomare mikhay ? : {$phone[name]}<br /> 
{/section}

تابع section دو پارامتر الزامی می گیره :
loop که به تعداد اندیس های آرایه ی users حلقه رو ادامه میده.
و name که یک مقدار دلخواه می گیره و به عنوان اندیس آرایه قرار می گیره و محتویات رو نشون می ده.
:دی
به همین سادگی, به همین زیبایی.
خوب آموزش تموم شد.
البته برای حرفه ای شدن چیزای دیگه ای هم باید یاد بگیرین. سایر توابع و اصلاح گرهای متغیر ها رو در درس های بعد و یا در سوالات خودتون خواهید دید.
موفق باشید.
فعلاً خداحافظ
 

bahy_my

Active Member
اصلاح گرهای اسمارتی (قسمت 1/3)

سلام.
ما می خوایم 21 اصلاح گر توی اسمارتی رو توی سه قسمت آموزش بدیم.
خوب اول بگیم اصلاح گر چیه.
مبتدی(مثه خودم) : اصلاحگرها پارامترهایی هستن که متغیرها می گیرن و به توجه با اون خودشون رو تغییر میدن و مطابق می کنن با اونا.
و به این صورت به کار می رن:

مثلا :

PHP:
{$var|count_charactars}
خوب...بسم ا.. :

1) count_charactars
شمارش کارکترها
2) count_words
شمارش کلمات
3) count_sentences
شمارش جمله ها
4) count_paragraphs
شمارش بندها
5) capitalize
حروف اول کلمات رو بزرگ میکنه.
6) upper
تمام حروف رو بزرگ می کنه.
7) lower
تمام حروف رو کوچیک می کنه.
خوب.. اینا اصلاحگرهای خیلی ساده ای بودن که مربوط به قسمت اول بود.
نظرات و یا سوالاتتون رو بگین خوشحال میشم.
منتظر دو قسمت بعدی اصلاح گرها باشین.
خدافظ ( می دونم سطح اینا خیلی پایین بود اما باید گفته میشد... تکرار نکنید )
 

bahy_my

Active Member
اصلاح گرهای اسمارتی (2/3)
***
سلام
خوب, می ریم سراغ قسمت دوم اصلاح گرهای اسمارتی :

8) default:'string'
این اصلاح گر مقدار پیشفرض رو برای یک متغیر در نظر می گیره چنان چه اگه متغیر مقدارنداشت این مقدار نمایش داده بشه.
9)
PHP:
date_format:'%A %H %d %S'

این اصلاح گر دقیقاً مثل تابع strftime توی php هست. ( تاپیک "در دست گرفتن زمان" رو بخونید). این تابع روی یک عدد اجرا میشه که تابع strtotime در php این عدد رو بر میگردونه.
برای مثال :

PHP:
PHP : 
$date=strtotime('-3 day'); 
$smarty->assign('user_date',$date); 

SMARTY : 
{$user_date|date_format:'%A %H %d %S'}

10) string_format
این تابع فرمت خروجی یک رشته رو تعیین می کنه.
برای مثال :
PHP:
PHP : 
$string="salam 12.8124"; 

SMARTY : 
{$string|string_format:'%d'}


11) replace:'search':'replace'
برای مثال :

PHP:
{$string|replace:'salam':'hello'}

این کدی در متغیر string واژه ی salam رو با hello جایگزین می کنه.
12) truncate:80:'...':false
این اصلاح گر متن رو خلاصه می کنه به 80 کارکتر و در ادامه ی اون کارکترهای "..." رو قرار می ده و چون مقدار سوم false هست, این سه نقطه نه در میان آخرین کلمه بلکه بعد از پایان اون قرار می گیرن.و به این ترتیب ممکنه که بیش از 80 کارکتر بشه متن خلاصه ی شما.
مثال :


PHP:
PHP : 
$string=" You are here - Nokia UK Find products Latest phones Site search Home Find products Get support and software Buy online Music Latest phones All phones Upcoming phones Accessories Technologies Newsletter Design & Display Flip phone Slide Phone High Colour resolution Wide screen display Functionality Camera High quality images Bluetooth Wireless connection MP3 player Radio Video ecorder Gaming Email High speed Internet 3G Video calling Push to talk Speaker phone ClearSelect & compareCompare 
You can compare a maximum number of 4 phones at a timeYou have 0 phones in trayCompare now Clear all Viewing 0 phones 
View as: Icon List Sort by: Latest Model 
This application uses cookies to function properly. Please allow the use of cookies in your browser settings. 
Sorry - there are no phones that match your preferences. Please try other combinations. 
Sorry, no products found. Nokia for Business Operators Investors Developers Press Corporate responsibility Careers About Nokia Forum Nokia Nokia World Wide Site Index Site terms Privacy policy Copyright ©2007 Nokia. All rights reserved. 
"; 

SMARTY : 
{$string|truncate:100:'...':false}

و اگه به جای false شما مقدار true رو بدین اگه کارکتر 100ام ( البته منهای سه کارکتر نقطه.. ینی در حقیقت 87 کارکتر) روی یک کلمه باشه از همون جا مقدار جایگزینی شما قرار می گیره.

13) spacify[:' _ ']
این اصلاح گر اگه هیچ مقداری نداشته باشه بین هر کارکتر توی متغیر یه اسپیس می ندازه و اگه مقدار داشته باشه, اون موقدار بین هر کارکتر قرار می گیره.

حالا هم یه اصلاح گر ساده بگم تا خستگی از تنتون در آد :
14) cat:'text'
این اصلاح گر مقدار text رو به انتهای متغیر اضافه می کنه.
خسته نباشید !!!
تا جلسه ی سوم خداحافظ

منبع تو امضامه.
 

bahy_my

Active Member
سلام. اینم قسمت سوم
15) strip[:replacement]
این اصلاح گر تمام کارکترهای فاصله ( تب, خط بعد, اسپیس) رو با '' تعویض می کنه و اگه مقدار بدیم با اون تعویضش می کنه.
16) nl2br
این واضحه.
17)
کد:
regex_replace:'/pattern/':'replace'
اینم خوب باز واضحه !
18) strip_tags[:false|true]
این اصلاح گر کدها رو غیر فعالی می کنه.
ینی در حقیقت پترن <?> رو با جای خالی عوض می کنه.
19)(آرایه ها)با علامت @ می تونیم به پارسر بفهمونیم که آقا جون متغیر ما آرایه هستش و اصلاح گر مربوط به آرایه هست.
مثلاً :
@count
و یا ... که من هنوز در اون سطح نمی دونم. البته میشه گفت که این مورد خودش یک اصلاح گر نبود !
20)
کد:
wordwrap:50:'<br />':true
پارامترها دقیقاً شبیه اصلاحگر truncate هستش.
البته اینا شدن 20 تا که من قول 21 رو دادم شرمنده.
احتمالاً توی شمارش اشتباه کردم.
اما
منتظر باشید.(احتمالاً !!)
خوب, این جلسه تموم شد.
به هر حال اگه بد آموزش دادم به بزری خودتون ببخشید.
منبع هم توی امضامه.
موفق باشید و...
خداحافظ
 

alireza82

Well-Known Member
سلام
به همه
چند روز پسش میخواستم کتاب این دوستمون اقای عبدالعلی رو بخرم که تو سایت ناقوس اتفاقی به یه کتاب برخوردم! با توجه به عنوان این مبحث گفتم اینجا معرفیش کنم تا بقیه دوستان استفاده کنن!
کتاب: SMARTY برای برنامه نویسان php
انتشارات: ناقوس
نویسنده: سهیل صالحی
قیمت روی جلد: 2000 تومان
تعداد صفحات: 207
کتاب رو سفارش دادم خودم! کتاب بدی نیست سطح کیفی رو بهش B میدم.
گفتم شاید دوستان مایل باشن تهیش کنن.
به هر حال خالی از لطف نیست
موفق باشید
 

bahy_my

Active Member
سلام. خوبی ؟... ممنون از راهنمایی.
تمام چیزهایی که تو این تاپیک دیدی از این کتاب بود.
 

miladmovie

Active Member
سلام
به همه
چند روز پسش میخواستم کتاب این دوستمون اقای عبدالعلی رو بخرم که تو سایت ناقوس اتفاقی به یه کتاب برخوردم! با توجه به عنوان این مبحث گفتم اینجا معرفیش کنم تا بقیه دوستان استفاده کنن!
کتاب: SMARTY برای برنامه نویسان php
انتشارات: ناقوس
نویسنده: سهیل صالحی
قیمت روی جلد: 2000 تومان
تعداد صفحات: 207
کتاب رو سفارش دادم خودم! کتاب بدی نیست سطح کیفی رو بهش B میدم.
گفتم شاید دوستان مایل باشن تهیش کنن.
به هر حال خالی از لطف نیست
موفق باشید
این کتاب یک ترجمه ناشاینه است از راهنمای smarty !

http://smarty.php.net/manual/en
 

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

بالا