negar_a 1 گزارش دادن ارسال شده در خرداد 99 سلام دوستان. من میخوام محصولات انتخابی رو در سشن ذخیره کنم . از اونجایی که هر محصول یک ایدی ویژه داره ، بر اساس ایدی در سشن ذخیره میکنم که اگر دوباره اون محصول انتخاب شد ، به سبد اضافه نشه . $product = Product::find($id); if(!isset($sessionBasket[$id])) { $sessionBasket[$id] = [ "title" => $product->title, "quantity" => 1, "price" => $product->price, ]; session()->push('sessionBasket', $sessionBasket); } اما push خودش هم ایندکس اضافه میکنه و نتیجه به این شکل برگردانده میشه . Array ( [0] => Array ( [5] => Array ( [title] => ماشین پلیس 778 [quantity] => 1 [price] => 60000 ) ) [1] => Array ( [3] => Array ( [title] => ماشین جدید 45 [quantity] => 1 [price] => 340000 ) ) [2] => Array ( [5] => Array ( [title] => ماشین پلیس 778 [quantity] => 1 [price] => 60000 ) ) ) از چه کدی بجای push استفاده کنم . put هم گویا قبلی رو پاک میکنه و جدید اضافه میکنه با تشکر نقل قول Share this post Link to post Share on other sites
Amir_Kh1984 17 گزارش دادن ارسال شده در خرداد 99 سلام ابتدا باید وجود یا عدم وجود session را بررسی کنید. در صورت موجود نبون آنرا ایجاد کنید. if (!session()->get('cart')) session()->put('cart', []); $cart = session()->get('cart'); حال باید بررسی کنید که آیا محصول جدید در سبد خرید وجود دارد یا خیر؟ if(!isset($cart[$id])) { $cart[$id] = [ "id" => $id, "title" => $product->title, "price" =>$product->price, "quantity" => 1 ]; session()->put('cart', $cart); } فکر کنم مشکل کد شما این باشه که session بنام sessionBasket را ایجاد نکردید!!! من از همین کدهای فوق در سبد خرید پروژه خودم استفاده کردم و نتیجه گرفتم. برای حذف یک محصول از سبد خرید هم می توانید از کد زیر استفاده نمایید. if(isset($cart[$id])) { $cart = session()->get('cart'); unset($cart[$id]); // update session session()->put('cart', $cart); if (!sizeof($cart)) { session()->put('cart', []); session()->forget('cart'); } } امیدوارم که این پاسخ مشکل شما را حل کرده باشد. موفق باشید. 1 نقل قول Share this post Link to post Share on other sites
negar_a 1 گزارش دادن ارسال شده در خرداد 99 ممنونم از پاسخ خوبتون. یک سوال . فکر میکنم منطق کدتون اینه که اگر کاربر روی یک محصول چندبار کلیک کرد به تعداد اون محصول (quantity ) اون محصول اضافه بشه . درسته ؟ آیا بهتر نیست این مورد رو به شکل دیگه قرار بدیم ؟ مثلا در انتها که سبد خرید رو کاربر مشاهده میکنه ، قسمت اضافه کردن تعداد بزاریم ؟ نقل قول Share this post Link to post Share on other sites
Amir_Kh1984 17 گزارش دادن ارسال شده در خرداد 99 اگر بخواهید با هر بار کلیک به تعداد محصول یک واحد اضافه بشه باید از کد زیر استفاده کنید. if(!isset($cart[$id])) { $cart[$id] = [ "id" => $id, "title" => $product->title, "price" =>$product->price, "quantity" => 1 ]; session()->put('cart', $cart); } else { $cart = session()->get('cart'); $cart[$id]['quantity']++; session()->put('cart', $cart); } ضمنا هر طوری که شما بخواهید می توانید سبد خرید را پیاده سازی کنید. می توانید همانند سایت های خرید انلاین بعد از افزودن محصول به سبد خرید قسمتی را برای افزایش یا کاهش تعداد محصول قرار دهید. امیدوارم که این پاسخ مشکل را برطرف کرده باشد. موفق باشید. 1 نقل قول Share this post Link to post Share on other sites
negar_a 1 گزارش دادن ارسال شده در خرداد 99 با سلام . در ادامه سوال قبل ، من یک سشن به نام total ایجاد کردم که اطلاعات ذخیره شده در اون به این شکله : Array ( [5] => Array ( [id] => 5 [price] => 30000 ) [7] => Array ( [id] => 7 [price] => 40000 ) [11] => Array ( [id] => 11 [price] => 50000 ) ) من اگه بنویسم print_r(session("total")[7]) چون چنین چیزی وجود داره خروجی رو درست نشون میده . اما اگر بخوام چک کنم سشنی با افست مثلا 33 وجود داره یا نه ، اصلا اجازه ی چک کردن نمیده و خطا میده (چون وجود نداره ) چطور چنین چیزی رو چک کنم ؟ if(!(session()->get('total')[33])){ } نقل قول Share this post Link to post Share on other sites
Amir_Kh1984 17 گزارش دادن ارسال شده در خرداد 99 سلام شما باید از تابع ()isset استفاده کنید: if(! isset(session()->get('total')[33])) { } کلا در زبان PHP برای بررسی وجود/عدم وجود یک متغیر باید از تابع ()isset استفاده کنید. 1 نقل قول Share this post Link to post Share on other sites
negar_a 1 گزارش دادن ارسال شده در خرداد 99 خیلی ممنون . در مثال قبل اگر اسم سشن مثلا cart باشه و محتویات بالا رو داشته باشه . وقتی به این شکل مینویسم اون مقدار سشن مربوطه رو برمیگردونه. session()->get('cart')[5]; اما اگر بخوام یکی از ایتم های سشن حذف بشه این کد جواب نمیده . به چه شکل میشه یکی از ایتم های سشن رو حذف کرد ؟ session()->forget('cart')[$id]; مثلا $id قبلش تعریف شده نقل قول Share this post Link to post Share on other sites
Amir_Kh1984 17 گزارش دادن ارسال شده در خرداد 99 سلام برای حذف می توانید از تابع ()unset بصورت زیر استفاده کنید. public function drop(Request $request) { $cart = session()->get('cart'); $id = $request->id; if(isset($cart[$id])) { unset($cart[$id]); // update session session()->put('cart', $cart); if (!sizeof($cart)) { session()->put('cart', []); session()->forget('cart'); } return true; } return false; } از تابع ()forget برای حذف کل session استفاده می شود. برای حذف یک عنصر از session کافی است از تابع ()unset استفاده کنید. 1 نقل قول Share this post Link to post Share on other sites