PDA

View Full Version : سوال در مورد اکشن actionDelete در yii



barname_newis
چهارشنبه 10 اردیبهشت 1393, 00:01 صبح
سلام خسته نباشید
من لیست محصولاتم رو در اکشن index کنترلرم نمایش میدم و میخوام کاربر زمانی که چند محصول رو انتخاب میکنه بتونه اونها رو به صورت ایجکس حذف کنه
اکشن delete رو که نگاه میکنم فقط یک آی دی رو به عنوان پارامتر میگیره و در ضمن همون طور که گفتم میخوام به صورت ایجکس باشه
ممنون میشم راهنمایی کنید

MMSHFE
چهارشنبه 10 اردیبهشت 1393, 08:59 صبح
برای نمایش محصولات از ویجت خاصی استفاده میکنید یا خودتون دستی نمایش میدین؟

barname_newis
چهارشنبه 10 اردیبهشت 1393, 13:16 عصر
برای نمایش محصولات از ویجت خاصی استفاده میکنید یا خودتون دستی نمایش میدین؟

نه دستی کد نوشتم .
از این (http://yiibooster.clevertech.biz/extendedGridView)ویجت میخواستم استفاده کنم که تو داکیومنتیشن هاش توضیح نداده سمت مودل یا کنترلر چه کد هایی باید بزارم . شما ویجت مشابهی سراغ دارید؟

MMSHFE
چهارشنبه 10 اردیبهشت 1393, 13:41 عصر
خوب اگه دستی نوشتین باید یکسری موارد رو (مثل اصلاح قسمت نمایش محصولات بعد از حذف) رو هم مدنظر قرار بدین اما برای اینکه بدونید کل کار چه جوریه، یک نمونه مثال میزنم.
1- موقع نمایش محصولات، لینک Delete رو اینطوری تولید کنید:

echo CHtml::link('Delete', '#', array('class'=>'delete', 'id'=>$model->id));
که منظورم از model$ همون اکتیو رکورد محصول مربوطه است (توی حلقه ای که محصولات رو باهاش نشون میدین).
2- این کد رو به صفحه ویو اضافه کنید:

Yii::app()->clientScript->registerScript('delete', '
$(".delete").click(function() {
var id = $(this).attr("id");
$.ajax({
type: "post",
url: "' . Yii::app()->createAbsoluteUrl('products/delete') . '",
data: "id="+id,
success: function(result) {
if(result === "ok") {
// update page here
}
else {
alert("Unknown Error ("+result+")");
}
}
});
});
';

barname_newis
چهارشنبه 10 اردیبهشت 1393, 15:22 عصر
ممنون جناب شهرکی
ببینید من قسمت نمایش محصولاتم به این صورت هست :
http://www.uploadax.com/images/47389765096379166734.jpg

کاربر چکباکس هر سطر ور که انتخاب کرد بتونه اون سطر ها رو حذف کنه ولی تو اکشن actionDelete به صورت پیش فرض فقط امکان ارسال یک پارامتر هست من میخوام اکشن delete رو جوری کاستومایز کنم که بشه چند رکورد رو از جدول حذف کرد نه فقط یک رکورد !
اکشن پیش فرضی که gii میسازه :




public function actionDelete($id)
{
$this->loadModel($id)->delete();

// if AJAX request (triggered by deletion via admin grid view), we should not redirect the browser
if(!isset($_GET['ajax']))
$this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('admin'));
}


راستی جناب شهرکی من با ویجت CListView لیست محصولات رو نمایش میدم

barname_newis
چهارشنبه 10 اردیبهشت 1393, 15:48 عصر
با این روشی که شما فرمودید عمل کردم ولی وقتی اطلاعات به صورت ایجکس ارسال میشه از طریق فایرباگ چک کردم این خطا صادر میشه :
NetworkError: 400 Bad Request - http://localhost/shoping_cart/index.php?r=admin/products/delete&id=4"

MMSHFE
پنج شنبه 11 اردیبهشت 1393, 10:22 صبح
دوست دارم خودتون به نتیجه برسین تا اینکه من بخوام بگم. اول راهی که خودتون به جواب برسین رو میگم و بعد اگه نشد، بگین تا توضیح بدم چیکار باید انجام بدین. افزونه های FireBug و TamperData و Javascript Deobfuscaor رو نصب کنید (اینها ابزارهای کار هر Web Developer حرفه ای هستن). وقتی صفحه Load شد، TamperData رو فعال کنید (Start) و بعد روی دکمه حذف کلیک کنید و ببینید چه درخواستی ساخته میشه (TamperData قبل از ارسال، Request ساخته شده رو نشونتون میده و میتونید حتی تغییرش بدین و بعد ارسال کنید). توی فایرباگ هم در سربرگ Net در قسمت XHR میتونید درخواستهای AJAX رو رصد کنید. با کلیک کردن Persist هم میتونید کاری کنید که وقتی صفحه تغییر کرد، اطلاعات قبلی این سربرگ پاک نشه. بعد ببینید چطور میتونید خودتون درخواست سفارشی بسازین. مثلاً با JS یا jQuery بیاین همه چک باکسهای تیک خورده رو پیدا کنید و id اونها رو بصورت یک رشته که با کاما از هم جدا میشه، بفرستین برای actionDelete و اونجا با explode برحسب کاما بشکنید تا دوباره آرایه بدست بیاد و رکوردهای متناظر با آرایه رو حذف کنید. بعد هم ListView رو بروزرسانی کنید.

barname_newis
پنج شنبه 11 اردیبهشت 1393, 12:15 عصر
ممنون آقای شهرکی
مشکل این بود که با get میخواستم request ارسال کنم و تو فیلتر کنترلرم فقط post رو برای اکشن delete مجاز کرده بودم
یه مشکل دارم : الان که میخوام یه درخواست post برای اکسن delete ارسال کنم باز error 400 میاد برام
این کدم :


Yii::app()->clientScript->registerScript('delete', '$(".delete").click(function() {
var id = $(this).attr("id");
$.ajax({
type: "post",
url: "' . Yii::app()->createAbsoluteUrl('admin/products/delete') . '",
data: {id:id},
success: function(result) {
if(result === "ok") {
// update page here
}
else {
alert("Unknown Error ("+result+")");
}
}
});
});');

MMSHFE
پنج شنبه 11 اردیبهشت 1393, 12:31 عصر
خوب ببینید دقیقاً خطای تولیدی چیه (400 کد خطاست. متنش رو هم بنویسید).

barname_newis
پنج شنبه 11 اردیبهشت 1393, 13:11 عصر
خوب ببینید دقیقاً خطای تولیدی چیه (400 کد خطاست. متنش رو هم بنویسید).

متن پیام هم اینه : bad request

MMSHFE
پنج شنبه 11 اردیبهشت 1393, 13:21 عصر
حالا شد. اینجا رو ببینید:
http://www.yiiframework.com/forum/index.php/topic/35874-ajax-post-return-error-400-bad-request