bertugfahriozer/ci4shoppingcart

Codeigniter 4 购物车

1.1.1 2024-07-11 03:49 UTC

This package is auto-updated.

Last update: 2024-09-11 04:07:59 UTC


README

购物车类允许将项目添加到会话中,该会话在用户浏览您的网站时保持活动状态。这些项目可以以标准的“购物车”格式检索和显示,使用户可以更新数量或从购物车中删除项目。

重要

购物车库已弃用,不应使用。它目前仅保留以支持向后兼容。

请注意,购物车类只提供核心“购物车”功能。它不提供运输、信用卡授权或其他处理组件。

使用购物车类

初始化购物车类

重要

购物车类利用CodeIgniter的Session类将购物车信息保存到数据库中,因此在使用购物车类之前,您必须设置一个数据库表,如Session文档中所示,并在您的.env文件中设置会话首选项以利用数据库。

Composer安装

composer require bertugfahriozer/ci4shoppingcart

当您安装composer时,您将看到示例目录。您可以复制并粘贴到您的项目或按照您的要求。

在控制器构造函数中初始化购物车类,使用$cart=new Cart()

use ci4shoppingcartLibrariesCart;

public $cart

public function __contruct(){
  $this->cart=new Cart();
}

加载后,可以使用以下方式访问购物车对象

$this->cart

注意:购物车类会自动加载和初始化Session类,所以除非您在应用程序的其他地方使用会话,否则您不需要加载Session类。

将项目添加到购物车

要将项目添加到购物车,只需将包含产品信息的数组传递给$this->cart->insert()方法,如下所示

$data = array(
        'id'      => 'sku_123ABC',
        'qty'     => 1,
        'price'   => 39.95,
        'name'    => 'T-Shirt',
        'options' => array('Size' => 'L', 'Color' => 'Red')
);

$this->cart->insert($data);

重要:上述前四个数组索引(id、qty、price和name)是必需的。如果您省略了其中任何一个,数据将不会保存到购物车中。第五个索引(options)是可选的。它旨在用于您的产品具有相关选项的情况。使用数组作为选项,如上所示。

五个保留索引是

  • id - 您的商店中的每个产品都必须有一个唯一的标识符。通常这将是“sku”或其他类似标识符。
  • qty - 购买的数量。
  • price - 项目的价格。
  • name - 项目的名称。
  • options - 识别产品所需的其他任何属性。这些必须通过数组传递。

除了上述五个索引之外,还有两个保留字:rowid和subtotal。这些由购物车类内部使用,因此请勿使用这些单词作为插入数据到购物车时的索引名称。

您的数组可能包含其他数据。您在数组中包含的任何内容都将存储在会话中。但是,最好在您的所有产品中标准化数据,以便更容易在表格中显示信息。

$data = array(
        'id'      => 'sku_123ABC',
        'qty'     => 1,
        'price'   => 39.95,
        'name'    => 'T-Shirt',
        'coupon'         => 'XMAS-50OFF'
);

$this->cart->insert($data);

如果成功插入单个项目,insert()方法将返回$rowid。

将多个商品添加到购物车

使用多维数组,如下所示,可以在一次操作中添加多个商品到购物车。这在您希望允许人们从同一页面上选择多个商品的情况下非常有用。

$data = array(
        array(
                'id'      => 'sku_123ABC',
                'qty'     => 1,
                'price'   => 39.95,
                'name'    => 'T-Shirt',
                'options' => array('Size' => 'L', 'Color' => 'Red')
        ),
        array(
                'id'      => 'sku_567ZYX',
                'qty'     => 1,
                'price'   => 9.95,
                'name'    => 'Coffee Mug'
        ),
        array(
                'id'      => 'sku_965QRS',
                'qty'     => 1,
                'price'   => 29.95,
                'name'    => 'Shot Glass'
        )
);

$this->cart->insert($data);

显示购物车

要显示购物车,您需要创建一个类似以下代码的视图文件。

<?php
/*add your controller */
  public function yourMethod(){
    return view('path/view',['cart'=>$this->cart]);
  }
/*view*/

<form action="<?php echo route_to('yourRoute')?>" method="post">
  <table cellpadding="6" cellspacing="1" style="width:100%" border="0">
    <tr>
      <th>QTY</th>
      <th>Item Description</th>
      <th style="text-align:right">Item Price</th>
      <th style="text-align:right">Sub-Total</th>
    </tr>

    <?php foreach ($cart->contents() as $items): ?>
    <tr>
      <td><input type="number" value="<?php echo $items['qty'] ?>" /></td>
      <td>
        <?php echo $items['name']; ?>
        <?php if ($cart->has_options($items['rowid']) == TRUE): ?>
        <p>
          <?php foreach ($cart->product_options($items['rowid']) as $option_name
          => $option_value): ?> <strong><?php echo $option_name; ?>:</strong>
          <?php echo $option_value; ?><br />
          <?php endforeach; ?>
        </p>
        <?php endif; ?>
      </td>
      <td style="text-align:right"><?php echo $cart->format_number($items['price']); ?>
      </td>
      <td style="text-align:right"><?php echo $cart->format_number($items['subtotal']); ?>
      </td>
    </tr>
    <?php endforeach; ?>

    <tr>
      <td colspan="2"></td>
      <td class="right"><strong>Total</strong></td>
      <td class="right"><?php echo $cart->format_number($cart->total()); ?>
      </td>
    </tr>
  </table>
  <button type="submit">Save Cart</button>
</form>

更新购物车

要更新购物车中的信息,您必须传递一个包含行 ID 和一个或多个预定义属性的数组到 $this->cart->update() 方法。

注意:如果数量设置为零,则商品将从购物车中删除。

$data = array(
        'rowid' => 'b99ccdf16028f015540f341130b6d8ec',
        'qty'   => 3
);

$this->cart->update($data);

// Or a multi-dimensional array

$data = array(
        array(
                'rowid'   => 'b99ccdf16028f015540f341130b6d8ec',
                'qty'     => 3
        ),
        array(
                'rowid'   => 'xw82g9q3r495893iajdh473990rikw23',
                'qty'     => 4
        ),
        array(
                'rowid'   => 'fh4kdkkkaoe30njgoe92rkdkkobec333',
                'qty'     => 2
        )
);

$this->cart->update($data);

您还可以更新在插入商品时定义的任何属性,例如选项、价格或其他自定义字段。

$data = array(
        'rowid'  => 'b99ccdf16028f015540f341130b6d8ec',
        'qty'    => 1,
        'price'  => 49.95,
        'coupon' => NULL
);

$this->cart->update($data);

什么是行 ID?

行 ID 是当商品被添加到购物车时由购物车代码生成的唯一标识符。创建唯一 ID 的原因是为了能够管理具有不同选项的相同产品。

例如,假设某人购买了两种相同的产品(相同的商品 ID),但尺寸不同。由于是同一件衬衫,两种尺寸的产品 ID(和其他属性)将相同。唯一的区别在于尺寸。因此,购物车必须有一种方法来识别这种差异,以便可以独立地管理这两种尺寸的衬衫。它是通过基于产品 ID 和与之相关的任何选项创建一个唯一的“行 ID”来做到这一点的。

在几乎所有情况下,更新购物车将是用户通过“查看购物车”页面进行的操作,因此作为开发者,您不太可能需要担心“行 ID”,除了确保您的“查看购物车”页面包含隐藏表单字段中的此信息,并确保在提交更新表单时将其传递给 update() 方法。请参阅上面的“显示购物车”示例以获取更多信息。

类参考

Cart

$product_id_rules = '.a-z0-9_-'

这些是我们用来验证产品 ID 的正则表达式规则 - 默认为字母数字、破折号、下划线或点

$product_name_rules = 'w -.:'

这些是我们用来验证产品 ID 和产品名称的正则表达式规则 - 默认为字母数字、破折号、下划线、冒号或点

$product_name_safe = TRUE

是否只允许安全的产品名称。默认为 TRUE。

insert([$items = array()])

将商品插入购物车并将其保存到会话表中。成功返回 TRUE,失败返回 FALSE。

update([$items = array()])

此方法允许更改给定商品的属性。通常,它是在用户在结账前更改数量时从“查看购物车”页面调用的。该数组必须包含每个商品的行 ID。

remove($rowid)

允许您通过传递 $rowid 来从购物车中删除商品。

total()

显示购物车中的总金额。

total_items()

显示购物车中的商品总数。

contents([$newest_first = FALSE])

返回一个包含购物车中所有内容的数组。您可以通过传递 TRUE 来按返回数组的顺序排序,这样内容将从新到旧排序,否则它将从旧到新排序。

get_item($row_id)

返回一个包含与指定行 ID 匹配的商品数据的数组,如果不存在此类商品则返回 FALSE。

has_options($row_id = '')

如果购物车中的特定行包含选项,则返回 TRUE(布尔值)。此方法设计用于与 contents() 一起在循环中使用,因为您必须传递行 ID 到此方法,如上面显示的“显示购物车”示例中所示。

product_options([$row_id = ''])

返回特定产品的选项数组。此方法旨在与 contents() 方法配合使用于循环中,因为您必须向此方法传递 rowid,如上述显示购物车示例所示。

destroy()

允许您销毁购物车。此方法可能在与客户订单处理完成后被调用。