spryker/product-bundle

ProductBundle模块

7.19.0 2024-05-06 12:15 UTC

README

Latest Stable Version Minimum PHP Version

产品组合是将两个或多个现有产品组合成一个新的产品,用于商店展示和销售。通常组合包含具体产品,因为组合中的所有项目都需要是潜在的订单项(即有库存)。新的(组合)产品在组合状态下实际上不存在。当购买组合时,在订单管理系统中仍将作为单独的项目进行处理。ProductBundle提供了所有这些产品组合功能,可以将多个具体产品组合成一个,并出售它。

安装

composer require spryker/product-bundle

以下信息描述了如何安装新发布的“Product”模块(2017年1月)。这些说明仅适用于您需要将此模块添加到已安装的框架版本中。如果您尚未安装Spryker框架,请忽略这些说明,因为从2017年1月之后发布的所有版本中都包含此模块。

确保您已更新模块到

计算:>=2.2.0,产品选项:>=3.1.0,销售聚合器:>=3.1.0,税收:>=3.1.0,购物车:>= 2.4.0。这些都是次要版本,兼容性保持不变。

插件配置

插件配置是将模块通过注册组合插件的过程集成到项目中。

注册组合的插件:

  1. \Pyz\Zed\Calculation\CalculationDependencyProvider::getCalculatorStack 中,添加 CalculateBundlePricePlugin 并将其放置在 ExpenseTaxWithDiscountsCalculatorPlugin 之后或 GrandTotalWithDiscountsCalculatorPlugin 之前。

  2. \Pyz\Zed\Cart\CartDependencyProvider::getCartPreCheckPlugins 中,用 CartBundleAvailabilityPreCheckPlugin 替换 CheckAvailabilityPlugin

  3. \Pyz\Zed\Cart\CartDependencyProvider::getExpanderPlugins 中,添加 CartItemWithBundleGroupKeyExpanderPlugin 并将其放置在 CartItemProductOptionPluginCartItemPricePlugin 之后,如果这些选项未使用。

  4. \Pyz\Zed\Cart\CartDependencyProvider::getPostSavePlugins 中,将 CartPostSaveUpdateBundlesPlugin 添加为最后一行。

  5. \Pyz\Zed\Cart\CartDependencyProvider::getExpanderPlugins 中,将 CartItemWithBundleGroupKeyExpanderPlugin 添加为最后一行。

  6. \Pyz\Zed\Checkout\CheckoutDependencyProvider::getCheckoutPreConditions 中,添加 ProductBundleAvailabilityCheckoutPreConditionPlugin

  7. \Pyz\Zed\Oms\OmsDependencyProvider::getReservationHandlerPlugins 中,添加 ProductBundleAvailabilityHandlerPlugin

  8. \Pyz\Zed\Product\ProductDependencyProvider::getProductConcreteAfterUpdatePlugins 中,添加 ProductBundleProductConcreteAfterCreatePlugin

  9. \Pyz\Zed\Product\ProductDependencyProvider::getProductConcreteAfterUpdatePlugins 中,添加 ProductBundleProductConcreteAfterUpdatePlugin

  10. \Pyz\Zed\Product\ProductDependencyProvider::getProductConcreteReadPlugins 中,添加 ProductBundleProductConcreteReadPlugin

  11. \Spryker\Zed\ProductBundle\Communication\Plugin\Sales\ProductBundleOrderSaverPlugin::saveOrder 中,添加 ProductBundleOrderSaverPlugin

  12. \Spryker\Zed\ProductBundle\Communication\Plugin\SalesAggregator\ProductBundlePriceAggregatorPlugin::aggregate 中,添加 ProductBundlePriceAggregatorPlugin

  13. \Pyz\Zed\Stock\StockDependencyProvider::getStockUpdateHandlerPlugins 中,添加 ProductBundleAvailabilityHandlerPlugin

插件说明

  • CalculateBundlePricePlugin - 计算组合价格。
  • CartBundleAvailabilityPreCheckPlugin - 购物车预检查插件,用于检查组合可用性。它替换了 CheckAvailabilityPlugin
  • CartItemWithBundleGroupKeyExpanderPlugin - 购物车扩展插件,用于提取组合项目。
  • CartPostSaveUpdateBundlesPlugin - 对报价中未使用的组合进行清理。
  • CartItemWithBundleGroupKeyExpanderPlugin - 将当前项目组密钥更改为包含组合标识符信息。
  • ProductBundleAvailabilityCheckoutPreConditionPlugin - 在下单时(最终结账步骤)检查产品组合的可用性。
  • ProductBundleAvailabilityHandlerPlugin - 一个可用性处理程序,每次组合项目移动到预留状态时都会更新组合的可用性。
  • ProductBundleProductConcreteAfterUpdatePlugin - 这是一个持久化产品组合的插件,由产品管理组件使用。
  • ProductBundleProductConcreteReadPlugin - 将产品组合数据写入 ProductConcreteTransfer
  • ProductBundleOrderSaverPlugin - 当放置包含组合的订单时,保存与组合相关的信息。
  • ProductBundlePriceAggregatorPlugin - 对销售组合的产品信息进行汇总。
  • ProductBundleAvailabilityHandlerPlugin - 一个库存处理插件,当组合或组合产品发生变化时,更新组合的可用库存。

数据库迁移

数据库迁移是将数据库设置调整为包含新插件活动的过程。

配置数据库迁移:

  1. 创建一个名为 spy_product_bundle_pk_seq 的序列
CREATE SEQUENCE "spy_product_bundle_pk_seq";

CREATE TABLE "spy_product_bundle"
(
    "id_product_bundle" INTEGER NOT NULL,
    "fk_bundled_product" INTEGER NOT NULL,
    "fk_product" INTEGER NOT NULL,
    "quantity" INTEGER DEFAULT 1 NOT NULL,
    "created_at" TIMESTAMP,
    "updated_at" TIMESTAMP,
    PRIMARY KEY ("id_product_bundle")
);

ALTER TABLE "spy_product_bundle" ADD CONSTRAINT "spy_product_bundle-fk_bundled_product"
    FOREIGN KEY ("fk_bundled_product")
    REFERENCES "spy_product" ("id_product")
    ON UPDATE CASCADE
    ON DELETE CASCADE;

ALTER TABLE "spy_product_bundle" ADD CONSTRAINT "spy_product_bundle-fk_product"
    FOREIGN KEY ("fk_product")
    REFERENCES "spy_product" ("id_product")
    ON UPDATE CASCADE
    ON DELETE CASCADE;
  1. 删除旧表/字段。
DROP TABLE IF EXISTS "spy_sales_order_item_bundle_item" CASCADE;`

`ALTER TABLE "spy_sales_order_item_bundle"

  DROP COLUMN "tax_rate",

  DROP COLUMN "bundle_type";

DROP TABLE IF EXISTS "spy_product_to_bundle" CASCADE;

Yves/项目更改

以下信息描述了需要对 Yves 进行的修改。您可以在当前的 Spryker demoshop 中找到产品模块的演示实现和 Yves 的所有代码。

购物车

购物车存储商品数量的方式已更改。

现在,购物车中的商品数量通过 $this->cartClient->getItemCount() 返回。

实施对购物车的更改:

  1. \Pyz\Yves\Cart\Plugin\Provider\CartServiceProvider:register 中,更改
public function register(Application $app)
{
    $app['cart.quantity'] = $app->share(function () {
        return $this->getClient()->getItemCount();
    });
}
  1. 购物车操作必须更新以覆盖产品组合逻辑,如下所示:使用 CartOperationHandler 代替 \Pyz\Yves\Cart\Handler\ProductBundleCartOperationHandler(您可以从 demoshop 中获取它)。

  2. Twig 更改

  • src/Pyz/Yves/Cart/Theme/default/cart/parts/cart-item.twigsrc/Pyz/Yves/Cart/Theme/default/cart/index.twig - 现在处理产品组合。
  • 项目已收到一个名为 ProductBundle 的新模块,其中当前存储了组合分组器。该分组器在 \Spryker\Yves\ProductBundle\Grouper\ProductBundleGrouper 中对项目进行分组,以便在展示中使用。

因此,显示项目的视图也必须在 \Pyz\Yves\Cart\Controller\CartController::indexAction 中进行更改

$cartItems = $this->getFactory()
          ->createProductBundleGroupper()
          ->getGroupedBundleItems($quoteTransfer->getItems(), $quoteTransfer->getBundleItems());

结账

结账摘要步骤已更改,需要调整到如下购物车项目列表

\Pyz\Yves\Checkout\Process\Steps\SummaryStep 中,将分组器和购物车客户端注入到 SummaryStep 中,并更新 getTemplateVariables 方法。

/**
    * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
    *
    * @return array
    */
   public function getTemplateVariables(AbstractTransfer $quoteTransfer)
   {
       return [
           'quoteTransfer' => $quoteTransfer,
           'cartItems' => $this->productBundleGrouper->getGroupedBundleItems(
               $quoteTransfer->getItems(),
               $quoteTransfer->getBundleItems()
           ),
       ];
   }

src/Pyz/Yves/Checkout/Theme/default/checkout/partials/summary-item.twig src/Pyz/Yves/Checkout/Theme/default/checkout/summary.twig 有新的项目渲染结构,请从 demoshop 中获取示例。

客户

客户控制器现在使用产品组合分组器。

更改以下内容 在:\Pyz\Yves\Customer\Controller\OrderController::getOrderDetailsResponseData 中执行

$bundleItemGrouper = $this->getFactory()->createProductBundleGroupper();
       $items = $bundleItemGrouper->getGroupedBundleItems(
           $orderTransfer->getItems(),
           $orderTransfer->getBundleItems()
       );

       return [
           'order' => $orderTransfer,
           'items' => $items
       ];

获取新的订单项目列表实现,包括 src/Pyz/Yves/Customer/Theme/default/order/partials/order-items.twig

文档

Spryker 文档