PDA

View Full Version : اجرای یک تابع از SMARTY



Veteran
چهارشنبه 12 تیر 1392, 11:48 صبح
سلام دوستان
این تابع رو در نظر بگیرید

{function name=tbl_cattegory}
<ul>
{foreach $data as $entry}
<li>{$entry}</li>
{/foreach}
</ul>
{/function}

{$menu = ['1','2','3','4']}
{call tbl_cattegory data=$menu}
وفتی صفحه لود میشه اجرا میشه و نمایش میده اطلاعات رو
اما من میخوام بعد از اینکه جوابی که از اطلاعاتی که به صورت ایجکس فرستادم اومد اجرا بشه
در کل میخوام روی اجرا این تابع یا همون CALL کردنش مدیریت داشته باشم !
اما هرکار میکنم نمیشه !

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


<a onclick="{call tbl_cattegory data=$menu}">test</a>
<a onclick=" <ul> <li>1</li> <li>2</li> <li>3</li> <li>4</li> </ul>">test</a>منتطقی هم هست چراکه اسمارتی قبلش فایل tpl رو کامپایل میکنه !
ی جورایی میشه ما مقدار onclick رو به دست بیاریم اما خوب تابع رو من میخوام چندبار اجرا کنم !
خروجی تابع متفاوت هست در هر بار اجرا !!!
نمیشه نه ؟؟
اما خوب حالا چیکار کنم :لبخند:

MMSHFE
چهارشنبه 12 تیر 1392, 12:09 عصر
ببینید، Smarty هم یک Template Engine هست که با PHP نوشته شده، پس زمان اجرای اون، قبل از رسیدن نتیجه به کاربره (سمت سرور اجرا میشه). درنتیجه، مثل هر کد PHP دیگه، اگه بخواین با رویدادهای سمت کلاینت صداش بزنید، باید از AJAX‌ استفاده کنید.

Veteran
چهارشنبه 12 تیر 1392, 14:51 عصر
جناب شهرکی
کد زیر در یک فایل tpl هست به نام Plugin_category_list.tpl که ما اونرو در بخش مربوطه با کد زیر فراخوانی میکنیم


{include file="Plugin.category_list.tpl"}
اینم کد فایل Plugin_category_list.tpl



{load_presentation_object filename="Plugin_Category_list" assign="obj"}
<!DOCTYPE HTML>
<html lang="en">
<head>
</head>
<body>
{section name=i loop=$obj->Plugin_Category}
<tr>
<td>
{$obj->Plugin_Category[i].title}
</td>
<td>
{$obj->Plugin_Category[i].partition}
</td>
<td>
<div class="btn-group"> <a href="#" class="btn btn-primary"><i class="icon-user icon-white"></i> عملیات</a><a href="#" data-toggle="dropdown" class="btn btn-primary dropdown-toggle"><span class="caret"></span></a>
<ul class="dropdown-menu">
<li><a href="javascript:void(0)"><i class="icon-pencil"></i> ویرایش</a></li>
<li><a onclick="del_This_Item({$obj->Plugin_Category[i].id})" href="javascript:void(0)"><i class="icon-trash"></i> حذف</a></li>
</ul>
</div>
</td>
</tr>
{/section}
</body>
</html>
خط اول یک پلاگین اسمارتی هست که به دنبال فایلی به اسمی که به پارامتر filename دادیم در روت presentation میگرده ! جایی که کنترلر هست بعد فایل رو لود میکنه که این هست



Class Plugin_Category_list{
public $Plugin_Category='';
function __construct(){
if(!Users::isUserLoggedIn()){header('location: login.php');}
$this->Plugin_Category=CATEGORY_Class::category_list_Sele ctAll();
}
}

به وسیله store procedure ما داده هارو میکشیم بیرون و به Plugin_Category میدیم بعدش این Plugin_Category با obj که یک پارامتر دیگه از همون پلاگین اسمارتی هست assign میشه و ما اینجوری میتونیم به داده ها دسترسی داشته باشیم

{$obj->Plugin_Category[i].title}
اما ما برای اینکه بعد از درخواست ایجکس بتونیم داده هارو دوباره بازیابی کنیم باید این فایل tpl رو اجرا بکنیم اما چجوری ؟؟
اینم درخواست ایجکس
که ما میخوایم بعد از حذف داده ها به روز رسانی بشه


<script type="text/javascript">
{literal}
function del_This_Item(id){
$.post('presentation/templates/Ajax/ajax_category_list.php',{del_Cat_id:id},function(d ata){
if(data==='ok'){
alert('با موفقیت حذف شد')
$.post('presentation/templates/Ajax/Plugin_category_list.php',{fetch_tbl_category:1},f unction(data){
// اینجا
})
} else{
alert('مجدد تلاش کنید')
}
})
}

{/literal}
</script>

در نهایت باید ما با ایجکس بعد از موفقیت امیز اومدن عمل حذف فایل Plugin_category_list.tpl رو اجرا کنیم و خروجی رو بیاریم نمایش بدیم

Veteran
پنج شنبه 13 تیر 1392, 09:27 صبح
:عصبانی++:

MMSHFE
پنج شنبه 13 تیر 1392, 09:38 صبح
شما باید یک صفحه PHP دیگه داشته باشین که داده ها رو از دیتابیس fetch میکنه و با کمک Smarty اونها رو Render میکنه و توی قسمتی که نوشتین "اینجا //" اون فایل رو با AJAX درخواست کنید و خروجی رو توی بخش موردنظرتون از صفحه، قرار بدین.