رفتن به مطلب
انجمن پشتیبانی لاراول ایران
negar_a

ذخیره ی محصولات در سشن

Recommended Posts

سلام دوستان.

من میخوام محصولات انتخابی رو در سشن ذخیره کنم . 

از اونجایی که هر محصول یک ایدی ویژه داره ، بر اساس ایدی در سشن ذخیره میکنم که اگر دوباره اون محصول انتخاب شد ، به سبد اضافه نشه .

 $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

هاست لاراول با پشتیبانی 24 ساعته و امکانات کامل از مدیرهاست

سلام

ابتدا باید وجود یا عدم وجود 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');
   }
}

امیدوارم که این پاسخ مشکل شما را حل کرده باشد.

موفق باشید.

Share this post


Link to post
Share on other sites

ممنونم از پاسخ خوبتون. 

یک سوال . 

فکر میکنم منطق کدتون اینه که اگر کاربر روی یک محصول چندبار کلیک کرد به تعداد اون محصول (quantity ) اون محصول اضافه بشه . درسته ؟

آیا بهتر نیست این مورد رو به شکل دیگه قرار بدیم ؟ مثلا در انتها که سبد خرید رو کاربر مشاهده میکنه ، قسمت اضافه کردن تعداد بزاریم ؟

Share this post


Link to post
Share on other sites

اگر بخواهید با هر بار کلیک به تعداد محصول یک واحد اضافه بشه باید از کد زیر استفاده کنید.

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);
}

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

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

موفق باشید.

Share this post


Link to post
Share on other sites

با سلام . 

در ادامه سوال قبل ، من  یک سشن به نام 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

خیلی ممنون . 

در مثال قبل اگر اسم سشن مثلا cart باشه و محتویات بالا رو داشته باشه . وقتی به این شکل مینویسم اون مقدار  سشن مربوطه رو برمیگردونه.

session()->get('cart')[5];

اما اگر بخوام یکی از ایتم های سشن حذف بشه این کد جواب نمیده . به چه شکل میشه یکی از ایتم های سشن رو حذف کرد ؟ 

        session()->forget('cart')[$id];

مثلا $id قبلش تعریف شده

Share this post


Link to post
Share on other sites

سلام

برای حذف می توانید از تابع ()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 استفاده کنید.

Share this post


Link to post
Share on other sites

وارد این گفتگو شوید

میتوانید پیام خود را ارسال کنید و بعد ثبت نام نمایید. در صورتی که حساب کاربری دارید, هم اکنون وارد شوید و در این گفتگو شرکت کنید.

مهمان
پاسخ به این موضوع ...

×   شما در حال چسباندن محتوایی با قالب بندی هستید.   حذف قالب بندی

  Only 75 emoji are allowed.

×   لینک شما به صورت اتوماتیک جایگذاری شد.   نمایش به عنوان یک لینک به جای

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • جدید...