Magento:将捆绑中的简单产品添加到购物车中的单独行

2023-11-22

我的客户要求,每当用户添加产品时,他们销售的捆绑产品(服装上衣和下装)中的每个简单产品都应作为单独的行项目添加到购物车中。谁能指导我如何实现这一目标?我对 MVC 和 Zend Framework 相当熟悉,但我需要一些帮助来找到控制将捆绑产品添加到购物车的确切文件,或者单独添加这些项目的替代方法。请假设该服装唯一可能的产品类型是捆绑产品类型。


您将需要一名观察员:

    <checkout_cart_product_add_after>
        <observers>
            <reporting>
                <type>singleton</type>
                <class>Yourcompany_yourmodelname_Model_Observer</class>
                <method>onCartProductAdd</method>
            </reporting>
        </observers>
    </checkout_cart_product_add_after>

然后做观察者:

class ourcompany_yourmodelname_Model_Observer extends Mage_Core_Model_Abstract
{
    /**
     * Binds to the checkout_cart_product_add_after Event and passes control to the helper function to process the quote
     *
     * @param Varien_Event_Observer $observer
     * @return void
     */
    public function onCartProductAdd($observer){
        $product = $observer->getProduct();
        $isProductBundle = ($product->getTypeId() == 'bundle');
        $items_to_add = array();
        $oTypeInstance = $oProduct->getTypeInstance(true);
        $aSelections = $oTypeInstance->getSelectionsCollection($aOptionIds, $product );
        $aOptions = $oTypeInstance->getOptionsByIds($aOptionIds, $product);
        $bundleOptions = $aOptions->appendSelections($aSelections, true);
        foreach ($bundleOptions as $bundleOption) {
            if ($bundleOption->getSelections()) {
                $bundleSelections = $bundleOption->getSelections();    
                foreach ($bundleSelections as $bundleSelection) {
                       $items_to_add[] = $bundleSelection.getID();

               }

            }
       }
       insertExtractedProducts($items_to_add);
    }

     /**
     * Add extracted products into quote
     *
     * @param array $items_to_add
      */
    public function insertExtractedProducts($items_to_add){
        /**@var $cart Mage_Checkout_Model_Cart**/
        $cart = Mage::helper('checkout/cart')->getCart();
        $ids_to_add = array();
        foreach($items_to_add as $item_to_be_added){
            $ids_to_add[] = $item_to_be_added->getProductId();
        }
        $cart->addProductsByIDs($ids_to_add);
        $cart->save();
        Mage::getSingleton('checkout/session')->setCartWasUpdated(true);
        }
   }

虽然只是一个简单的示例,但可能会有所帮助。

Bundled products can be complicated to understand, when working with it via code: Here is a sample image: enter image description here

每个捆绑产品都有一对多选项,最终将链接到要添加到购物车捆绑中的产品。

Each Option consists of one to many Selections, which will be the linked products that will end up in the Shopping cart, under this bundled product. One Selection, can typically be set as the default, and will already be selected on the product page. More information can be found at this link on how to create and configure bundled products, because in this document, we will only discuss the programming side of it. The bundled product’s display page, will look like this: enter image description here

单击“添加到购物车”后,它在购物车中可能看起来像这样: 捆绑样品

Sample Shampoo
1 x Moisturiser-125ml $29.95
Default Conditioner
1 x Moisturiser-60g $99.95

当通过代码询问该产品时,您可以像任何普通产品一样加载它:

$oProduct->load($vProductId);

加载后,您需要获取一个产品类型实例,以便您可以加载该产品类型的选项。

$oTypeInstance = $oProduct->getTypeInstance(true);

现在我们可以通过以下方式获取该产品的选项 ID 列表:

$oTypeInstance = $oProduct->getTypeInstance(true);

为了询问选择,我们将选项列表添加到集合中,然后获取选项集合以及它们各自的选择:

$aSelections = $oTypeInstance->getSelectionsCollection($aOptionIds, $oProduct );
$aOptions = $oTypeInstance->getOptionsByIds($aOptionIds, $oProduct);
$bundleOptions = $aOptions->appendSelections($aSelections, true);

现在我们有一个选项集合,每个选项都有一个选择集合。我们现在可以循环浏览选项,并查看它们的选择。

foreach ($bundleOptions as $bundleOption) {
            if ($bundleOption->getSelections()) {
                $bundleSelections = $bundleOption->getSelections();

                foreach ($bundleSelections as $bundleSelection) {
                     // get some data here
                     $vName = $bundleOption->getTitle();
               }

            }
}

要获取捆绑产品的必需选择产品列表,您可以使用以下代码:

$requiredChildren = $this->getChildrenIds($product->getId(),$required=true);

然后,您可以循环遍历 ID 数组并按 ID 加载产品,以获取有关这些产品的更多信息。

购物车中的捆绑产品

为了循环浏览购物卡中捆绑产品的选定选项,您可以使用如下内容:

/**
 * @var Mage_Bundle_Model_Product_Type
 */
$typeInstance = $this->getProduct()->getTypeInstance(true);

// get bundle options
$optionsQuoteItemOption =  $this->getItem()->getOptionByCode('bundle_option_ids');
$bundleOptionsIds = unserialize($optionsQuoteItemOption->getValue());
if ($bundleOptionsIds) {
    /**
    * @var Mage_Bundle_Model_Mysql4_Option_Collection
    */
    $optionsCollection = $typeInstance->getOptionsByIds($bundleOptionsIds, $this->getProduct());

    // get and add bundle selections collection
    $selectionsQuoteItemOption = $this->getItem()->getOptionByCode('bundle_selection_ids');

    $selectionsCollection = $typeInstance->getSelectionsByIds(
        unserialize($selectionsQuoteItemOption->getValue()),
        $this->getProduct()
    );

    $bundleOptions = $optionsCollection->appendSelections($selectionsCollection, true);
    foreach ($bundleOptions as $bundleOption) {
        if ($bundleOption->getSelections()) {
            $label = $bundleOption->getTitle()

            $bundleSelections = $bundleOption->getSelections();

            foreach ($bundleSelections as $bundleSelection) {                        
                    $sName = $bundleSelection->getName();
            }
            // some more code here to do stuff
        }
    }
}

此代码从报价项目捆绑产品中获取选项,然后获取集合中该产品的选项,然后找到“选定”选项选择。

哈, 肖恩

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Magento:将捆绑中的简单产品添加到购物车中的单独行 的相关文章

  • 如何移动 Zend_Layout 的“视图”

    通常它会是这样的结构 application modules somemodule views scripts index index phtml 我如何将其移动到 application templates somemodule temp
  • Laravel 注册成功后如何重定向到上一页?

    现在redirectTo被设定为 home 我想知道如何重定向到上一页 我尝试使用 protected redirectTo URL previous 但我得到解析错误 期待 or 解决这个问题的最佳解决方案是什么 我想我需要重写 redi
  • Ajax 与 chrome 扩展

    我将 url 发送到 chrome 扩展中的 php 文件 并需要获得响应 但不起作用 清单 json name Get pages source version 1 0 manifest version 2 description Get
  • PHP FTP_PUT 上传到目录

    我正在自学PHP 一本名为 PHP完全参考 PHP5 2 的书 我目前正在使用第 11 章 FTP 上传 删除 makedir 等 但遇到了一些本书未涵盖的问题 根据我的教科书 这是上传到服务器的简单代码 connect ftp conne
  • Zend 框架会话丢失

    我有一个注册表单 当用户注册时 它会将他重定向到他的页面 在 Firefox 和 Chrome 中一切正常 但在 Internet Explorer 中则正常 看起来保存用户信息后 会话就关闭了 并且不会将用户重定向到他的页面 我该如何解决
  • 使用活动目录对 Intranet 站点上的用户进行身份验证

    我建立了一个 内联网 站点 它有自己的登录系统 用户注册为新用户 并使用其上的用户名 密码登录该站点 但是 现在我想扩展它 让 Intranet 站点使用现有的 ActiveDirectory 进行身份验证 这就是我正在寻找的 前进 当用户
  • 如何使用 Google Calendar API 和官方 PHP 库创建全天活动?

    我有这个代码 event new Event event gt setSummary event summary event gt setLocation event location start new EventDateTime sta
  • 如何使用 PATCH 更新简单的数据库字段?

    我是 php 和 API 的新手 我正在尝试学习这些方法 但我无法执行 PATCH 或 PUT 来更新我的简单 mysql 数据库 我使用了以下代码 if isset PATCH con mysqli connect localhost r
  • 我应该在 Symfony 中哪里放置既不是控制器也不是模型的类?

    对于我的应用程序包 我需要一些既不是控制器也不是模型的类 例如 我想要一个scorecard具有诸如 技能 效率 美丽 等成员的类 此外 它可能具有诸如 meanScore 之类的成员方法 getters 这样的类在 Symfony 框架中
  • 将 jQuery 与 Selenium WebDriver 结合使用 - 如何将 JSON 对象转换为 WebElement?

    我正在使用 Selenium WebDriver 我想执行 jQuery 代码来查找一些元素 我的代码如下 public function uploadGrantDoc script return itemlist grant file u
  • php 包含打印 1

    我编写了以下代码 当我将 include 函数与旨在输出到页面的函数 例如 或 echo include foo php 结合使用时 它会返回包含内容 但在已包含的内容后面带有 1 echo include foo php 应该 inclu
  • 将 Base64 字符串转换为图像文件? [复制]

    这个问题在这里已经有答案了 我正在尝试将我的 Base64 图像字符串转换为图像文件 这是我的 Base64 字符串 http pastebin com ENkTrGNG http pastebin com ENkTrGNG 使用以下代码将
  • 如何检测iPhone是否有视网膜显示屏?

    如何检测 iPhone 是否配备视网膜显示屏 有靠谱的办法吗 要么是纯 PHP 要么最好是 Zend Framework 方式来执行此操作 我通过这个弄清楚了 var retina window devicePixelRatio gt 1
  • 什么是 PHP session_start()

    它是否基于 cookie 启动当前会话 从 PHP 网站上得到的 PHP如何控制会话 如果我在用户打开我的登录页面时启动会话 我什至可以使用该会话做什么 我可以使用当前会话来获取有关登录用户的信息吗 PHP 会话系统允许您将数据安全地存储在
  • MVC 框架中的缓存策略?

    我编写了自己的小型 PHP MVC 框架 现在正在探索 PHP MVC 框架中的缓存策略 我正在考虑可以缓存什么 在哪里以及如何缓存 我的框架是简单的MVC框架 我有前端控制器 它启动应用程序 注册类自动加载 设置 php 运行时指令 最后
  • 如何在没有 SSH 和 CLI 访问生产的情况下部署 symfony 项目 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 大多数托管提供商仅具有 FTP 访问权限 是否可以 常见地进行 symfony 项目 3 x 或 4 x 的本地安装 然后通过 FTP 上
  • Laravel 5 Eloquent 在多个级别上将关系附加到 JSON

    因此 在模型中包含关系非常容易 例如 class User extends Model protected with roles class Role extends Model protected with permissions 当有对
  • 使用 yaml 路由描述时如何在运行时获取 Symfony2 中的路由名称?

    在这里你可以找到我的n关于 Symfony2 的第一个问题 我正在与一个分页捆绑 https github com makerlabs PagerBundle wiki使用中提供的路由名称routing yml文件 从我的角度来看 这种方法
  • 单元测试和静态方法

    阅读并学习单元测试 试图理解以下帖子 http misko hevery com 2008 12 15 static methods are death to testability 这解释了静态函数调用的困难 我不太清楚这个问题 我一直认
  • SimpleXML 返回空数组

    我正在尝试使用 Google Maps API 和 PHP SimpleXML 获取城市的纬度和经度 我尝试这样做 xml simplexml load file http maps googleapis com maps api geoc

随机推荐

  • AVAudio播放器速率

    所以我尝试在 iOS 5 1 1 中以不同的速率播放声音文件 但完全没有运气 到目前为止 我已经尝试设置 AVAudioPlayer 的速率 player AVAudioPlayer alloc initWithContentsOfURL
  • Rails:违反外键约束

    我有三个模型 Book genre BookGenre 以下是关系 class BookGenre lt ActiveRecord Base belongs to book belongs to genre end class Book l
  • Spark Dataframe的分区数量

    谁能解释一下将为 Spark Dataframe 创建的分区数量 我知道对于 RDD 在创建它时我们可以提及分区的数量 如下所示 val RDD1 sc textFile path 6 但是对于 Spark 数据帧 在创建时看起来我们没有像
  • Scala:强制 A 不是 B 的子类型

    我试图根据参数是否扩展给定的类来重载方法 并且遇到了一些麻烦 使用迈尔斯 萨宾 Miles Sabin 的方法 我生成了以下代码 object ExtendedGenericTypes trait lt lt A B Encoding fo
  • IIS 7 上的 ASP.net MVC 返回空白页面

    我在将 ASP net MVC 2 RC 2 应用程序部署到我的生产环境时遇到一些问题 我让它在开发和测试中都运行良好 主要区别似乎是生产盒尚未升级到 IIS 7 5 当我访问该网站时 我只是看到一个空白页面 如中所述我在 IIS 上部署
  • bootstrap 4 modal-backdrop样式(特定modal)

    我想知道如何更改特定模态的模态背景颜色 不是模态的背景颜色 如果我使用 shown bs modal 并有一些延迟 则可以更改颜色 但我想立即更改背景颜色 希望有人可以帮忙 谢谢 div class modal fade div class
  • 群组成员支持的协议与现有成员的协议不兼容

    我面临与卡夫卡相关的问题 我正在使用当前的服务 Producer 将消息发送到 Kafka 主题 events 该服务正在使用kafka 2 12 v1 0 0 用 Java 编写 我正在尝试将其与示例项目集成spark streaming
  • CSS3 中计算操作数的 LESS 转义中的空白保留

    我想用 LESS 表达以下 CSS a min height calc 2em 4px 因此 为了防止 LESS 尝试计算 我使用 LESS 编写了表达式转义语法 a min height calc 2em 4px 然而 LESS 的缩小引
  • 使用 linq to xml 遍历 xml 树中的每个元素

    我想遍历 xml 中的每个元素和属性并获取名称和值 而无需提前知道元素的名称 我什至有一本关于 linq to xml with C 的书 它只告诉我当我已经知道元素的名称时如何查询以获取元素的值 下面的代码只提供了最高级别的元素信息 我还
  • 将 Enumerable.Range 转换为字符串列表

    在 Linq 中 如何将 Enumerable Range 1 31 转换为字符串列表 var list Enumerable Range 1 31 Select n gt n ToString ToList
  • 使用 Python/PIL 从图像中删除背景颜色

    我一直在努力让它发挥作用 但确实遇到了麻烦 所以非常感谢您的帮助 使用下面的代码 我想将具有指定 RGB 值的特征更改为白色 并将图像中的所有其他特征更改为黑色 即基本上从图像中提取特征 不幸的是 尽管我可以将我想要的特征 extract
  • Java 中序列化对象大小与内存中对象大小

    有没有一种方法可以从 Java 中的序列化对象大小 粗略地 估计内存对象大小 内存中的大小通常在可序列化大小的一半到两倍之间 最极端的例子可能是超过 80 个字节的字节 序列化后在内存中可以是 16 个字节 您可以使用探查器来告诉您对象使用
  • 从客户端的不同文件加载 WCF 配置

    许多人在 WCF 中面临的一个常见问题是无法从不同的配置文件加载客户端配置 当开发人员想要部署一些二进制文件以及独立的配置文件 也可能位于资源文件或另一个配置文件中 以避免修改主配置文件时 这是一种常见的情况 我找到了两个参考资料 http
  • 自定义对话框全屏打开

    我正在开发一个 Android 应用程序 我有一个关于自定义对话框的问题 我这样做是为了打开一个自定义对话框 protected void showSetFriendEmailDialog Create the dialog final D
  • Swift 中的日期格式 TODAY TOMORROW YESTERDAY

    我想将日期显示为6 月 13 日星期六 如果日期是当天 则应显示Today像那样Tomorrow 昨天 我无法同时实现这两个目标 guard let date Date fromString 16 September 2020 format
  • Android 从哪里获取默认时区?

    Android 设备从哪里获取默认时区 示例 您启动一个全新的 Android 设备 并且存在带有 日期和时间 活动的设置向导 其中已经选择了默认时区 在我的情况下 http en wikipedia org wiki Central Eu
  • 重载解析中的约束是否受到不同类型限定符的影响?

    有以下简单代码 include
  • Plotly 热图未渲染所有 yaxis 标签

    我构建了一个带有热图的仪表板 但是我注意到 t 我的 y 轴中的一些标签没有显示 我只得到了有限的我不知道出了什么问题 这是我的仪表板 import dash import dash table import plotly graph ob
  • 获取特定 URL 和页面的 FB 点赞数

    这是两个问题合而为一的问题 是否可以获取网站内特定页面的点赞数 就像如果有一个没有特定目标网址的点赞按钮 点赞将被给予在window location href 可以在没有 API 密钥的情况下检索此号码吗 如果我只有网站的 URL 是否可
  • Magento:将捆绑中的简单产品添加到购物车中的单独行

    我的客户要求 每当用户添加产品时 他们销售的捆绑产品 服装上衣和下装 中的每个简单产品都应作为单独的行项目添加到购物车中 谁能指导我如何实现这一目标 我对 MVC 和 Zend Framework 相当熟悉 但我需要一些帮助来找到控制将捆绑