【问题标题】:Laravel Sessions: Why does my function load the old session?Laravel 会话:为什么我的函数会加载旧会话?
【发布时间】:2019-07-26 06:14:51
【问题描述】:

我正在使用会话处理购物车功能。我正在尝试制作更新购物车中商品数量并在页面标题上重新加载小计和购物车商品列表的功能。该功能更新会话并重新加载小计,但问题是它重新加载了购物车的商品列出旧会话的信息(在我更新之前)。我希望它获取新会话的信息。你能给我任何想法如何解决这个问题吗?非常感谢!

我尝试了 js setTimeout($('#cart-button').load(),2000) 来延迟该函数以查看它是否可以获取新会话,但它仍然无法正常工作。

P/s:我刚刚尝试将 $this->ajaxReloadCart($cart->totalQty, $this->money($cart->totalPrice), $cart->items); 放入 subOneItem() 函数中,它工作正常,但购物车列表现在位于小计 div 中

这是我的 js 函数

$('#sub-1-{{$item['item']['id']}}').click(function(){
                    var qty = $('#qty-{{$item['item']['id']}}').val();
                    var int_qty = parseInt(qty);
                    if(int_qty > 1){
                        int_qty--;
                        $('input#qty-{{$item['item']['id']}}').val(int_qty);
                        $('#sub-total').load('sub-one/{{$item['item']['id']}}');
                        $('#cart-button').load('reload-mini');
                     }
                     if(int_qty <= 1){
                        int_qty = 1;
                     }

                });

我的路线

Route::get('sub-one/{id}','PageController@subOneItem');
Route::get('reload-mini','PageController@reloadMiniCart');

我的控制器功能

-ajaxReloadCart

public function ajaxReloadCart($totalQty, $totalPrice, $items){
        echo '  <button type="button" class="btn btn-default">
                    <a href="view-cart">
                        <i class="fa fa-shopping-cart fa-lg"></i>
                        <div class="item-number">'
                            .$totalQty.
                        '</div>
                    </a>
                </button>';
        echo   '<button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
                    <span class="caret"></span>
                    <span class="sr-only">Toggle Dropdown</span>
                </button>';
        echo '  <ul class="dropdown-menu cart-items-list" id="cart-items-list">';
        foreach($items as $item){
            $price = $this->money($item['item']['price']);
            echo '  <li>
                    <div class="row" style="margin-left:0; margin-top:10px;">
                        <div class="col-xs-4 col-sm-4 col-md-4 col-lg-4">
                            <img src="upload/product/'.$item['item']->productimg->first()->name.'" width="100" />
                        </div>
                        <div class="col-xs-8 col-sm-8 col-md-8 col-lg-8">
                            <div class="row">
                                <a href="product/'.$item['item']['id'].'"><strong>'.$item['item']['name'].'</strong></a>
                            </div>
                            <div class="row">'
                                .$price.' X '.$item['qty'].
                            '</div>
                        </div>
                    </div>
                    </li>';
        }
        echo '  <li><a><strong>Subtotal:</strong>&nbsp; <div class="pull-right">'.$totalPrice.'</div></a></li>
                <li role="separator" class="divider"></li><li><a href="#">To Checkout</a></li></ul>';
    }

-subOneItem

 public function subOneItem($id){
        $product = Product::find($id);
        $oldCart = Session::has('cart') ? Session::get('cart') : null;
        $cart = new Cart($oldCart);

        $cart->subOne($product, $id);
        Session::put('cart',$cart);


        $totalPrice = $this->money($cart->totalPrice);
        // display mini cart and total price
        echo $totalPrice;

    }

-reloadMiniCart

    public function reloadMiniCart(){
        $oldCart = Session::has('cart') ? Session::get('cart') : null;
        $cart = new Cart($oldCart);

        $this->ajaxReloadCart($cart->totalQty, $this->money($cart->totalPrice), $cart->items);
    }

【问题讨论】:

    标签: javascript php ajax laravel


    【解决方案1】:

    在将新的购物车值分配给会话之前,请先尝试清除会话 使用Session::forget('cart'); 或使用Session::flush() 清除所有会话

    然后将新的购物车信息分配给会话

    在你的 subonitem() 函数之后 Session::put('cart',$cart);

    添加Session::save();

    【讨论】:

    • 仍然无法正常工作。我认为这不是问题,因为我有 addToCart 功能,它的工作方式相同,并且仍然使用更新的数据重新加载购物车列表。
    • 这是我的 addToCart 函数:``` public function getAddToCart(Request $request, $id){ $product = Product::findOrFail($id); $oldCart = Session::has('cart') ?会话::get('cart') : null; $cart = 新购物车($oldCart); $cart->add($product, $product->id);会话::put('cart',$cart); $this->ajaxReloadCart($cart->totalQty, $this->money($cart->totalPrice), $cart->items); } ```
    • 我刚试过把 $this->ajaxReloadCart($cart->totalQty, $this->money($cart->totalPrice), $cart->items);在 subOneItem() 函数中,它工作正常,但购物车列表现在位于小计 div 中。你有什么想法吗?
    • 所以您的 $total 价格更新了吗?但不是购物车中的商品列表?
    • 会话和 $totalprice 已更新,但 reloadMiniCart() 函数仍会获取旧会话的数据
    【解决方案2】:

    我找到了重新加载购物车列表的其他方法,但我认为这不是最好的方法。 如果你们找到其他方法,请在下面评论。我想找到更好的方法。

    我的解决方案: 每 1 秒重新加载购物车列表

    setInterval(function(){
            $('#cart-button').load('reload-mini');
        },1000);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-02
      • 1970-01-01
      • 2014-07-18
      • 1970-01-01
      • 2015-02-23
      • 2014-06-27
      • 2023-04-07
      相关资源
      最近更新 更多