【问题标题】:Yii2 session array with pagination带有分页的 Yii2 会话数组
【发布时间】:2017-05-03 15:00:12
【问题描述】:

您好,我在使用分页存储会话数组时遇到问题。我做网店,我有商店页面,我有一些东西要卖,在“购买”按钮上,我为数据库中的每个项目设置了 ID。而且我需要制作 1 个可以在分页上正常工作的数组,这样我就可以在“购物车”中使用这些 ID,这样用户就可以查看他实际购买的内容。这是我对出售物品的看法:

<?php foreach ($stock as $stocklist): ?>
    <div class="col-sm-4"> 
        <div class="prod_box">
            <div class="product_title"  value="<?php $stocklist->name ?>" >  <?php echo $stocklist->name ?> </div>
            <div class="prod_price"  value="<?php $stocklist->price ?>">   <?php echo $stocklist->price ?>  $ </div>
            <div class="prod_buy">
                <button type="submit" value="<?= $stocklist->id ?>" class="custombtn" method='post'  title="Add to Cart" > Buy </button>
            </div>
        </div>
    </div>
<?php endforeach; ?>

我还使用 JS (Ajax) 将购买的每件商品发送到控制器,并将每个 ID 放入数组中:

<script type="text/javascript">
    $(document).ready(function () {
        var IDs = [];
        $('.custombtn').click(function () {
            var id = $(this).attr("value");
            IDs.push(id);
            $.ajax({
                type: 'POST',
                url: '<?php echo Url::to(['stock/shop']); ?>',
                data: {IDs},
                dataType: 'json'
            });
            console.log(IDs);
        });
    });
</script>

在控制器中我有:

public function actionShop() {

    Yii::$app->session->open();
    $session = Yii::$app->session;

    $query = Stock::find();
    $pagination = new Pagination([
        'defaultPageSize' => 6,
        'totalCount' => $query->count(),
    ]);
    $stock = $query->orderBy('id')
            ->offset($pagination->offset)
            ->limit($pagination->limit)
            ->all();

    if (Yii::$app->request->post()) {

        $session = Yii::$app->session;

        $data = Yii::$app->request->post();

        $session['lastIDs'] = $data;
    }

    return $this->render('shop', [
                'stock' => $stock,
                'pagination' => $pagination,
    ]);
}

所以:

$session['lastIDs'] = $data;

我在会话中保存了所有 ID,但是当我使用分页切换页面并单击更多东西来购买物品时,ID 被覆盖。我还尝试制作 2 个会话变量并合并数组,但随后它保存了所有 API 调用,因此我购买了 20 个“项目”的 20 个数组,每个数组都有最后一次单击的 +1 ID,而不仅仅是 1 个数组购买的 ID。

【问题讨论】:

    标签: jquery arrays session pagination yii2


    【解决方案1】:

    用 JS 重写:

    <script type="text/javascript">
        $(document).ready(function () {
            $('.custombtn').click(function () {
                var id = $(this).attr("value");
                console.log(id);
                $.ajax({
                    type: 'POST',
                    url: '<?php echo Url::to(['stock/ajax']); ?>',
                    data: {id: id},
                    dataType: 'json'
                });
            });
        });
    </script>
    

    也制作 actionAjax where :

    public function actionAjax() {
    
        if (Yii::$app->request->isAjax && Yii::$app->request->isPost) {
            Yii::$app->session->open();
            $session = Yii::$app->session;
            if (!isset($session['selectedItems'])) {
                $session['selectedItems'] = [];
            }
    
            $allItemsIDs = $session['selectedItems'];
            $itemID = Yii::$app->request->post("id");
            $allItemsIDs[] = $itemID;
            $session['selectedItems'] = array_unique($allItemsIDs);
    
            return "OK";
        }
    }
    

    和 actionShop 仍然存在:

     public function actionShop() {
    
    
        $query = Stock::find();
        $pagination = new Pagination([
            'defaultPageSize' => 6,
            'totalCount' => $query->count(),
        ]);
        $stock = $query->orderBy('id')
                ->offset($pagination->offset)
                ->limit($pagination->limit)
                ->all();
    
        return $this->render('shop', [
                    'stock' => $stock,
                    'pagination' => $pagination,
        ]);
    }
    

    【讨论】:

      【解决方案2】:

      那就试试这个

      公共函数 actionShop() {

      if (!Yii::$app->session->isActive) {
      
          Yii::$app->session->open();
      
          $query = Stock::find();
          $pagination = new Pagination([
              'defaultPageSize' => 6,
              'totalCount' => $query->count(),
          ]);
          $stock = $query->orderBy('id')
                  ->offset($pagination->offset)
                  ->limit($pagination->limit)
                  ->all();
      
      
      }
      return $this->render('shop', [
                  'stock' => $stock,
                  'pagination' => $pagination,
      ]);
      

      }

      【讨论】:

      • 我想我必须在会话中保存数组,这样我就可以在购物车和结帐页面中使用它,你写的只是打开一个会话而不是保存数组。会话中没有保存你写的“值”
      【解决方案3】:

      合作过:

      $(document).ready(function() {

      var IDs = [];
      $('.custombtn').click(function() {
          var id = $(this).attr("value");
          IDs.push(id);
          console.log(IDs);
          $.ajax({
              type: 'POST',
              url: '<?php echo Url::to(['stock/shop']); ?>',
              data: {
                  data: IDs
              },
              dataType: 'json'
          });
      });
      

      });

      【讨论】:

      • 问题出在控制器中,因为当我使用分页时,我无法将来自不同页面的 ID 保存在一个数组中
      猜你喜欢
      • 2016-05-31
      • 1970-01-01
      • 1970-01-01
      • 2017-03-22
      • 2020-03-13
      • 2017-09-27
      • 1970-01-01
      • 1970-01-01
      • 2016-11-21
      相关资源
      最近更新 更多