【问题标题】:Magento: Adding a bundled product that is associated to a bundle to a cart returns an error because of getSelectionByIds()Magento:将与捆绑相关的捆绑产品添加到购物车会返回错误,因为 getSelectionByIds()
【发布时间】:2025-12-01 08:45:01
【问题描述】:

我在为 Magento 构建的某个自定义扩展方面需要帮助。我做了一个扩展,允许捆绑产品类型与“父”捆绑产品相关联。

因此,可以将其想象为我在销售捆绑产品“键盘和鼠标”,它与台式计算机捆绑在一起。

我让它在管理员上工作,我让它显示在产品视图上。但是,当我尝试将此“台式电脑”添加到我的购物车时遇到问题。我能够将其追溯到 /app/code/core/Mage/Bundle/Model/Product/Type.php 下名为 *_prepareProduct()* 的函数。

下面是我发现问题的代码的 sn-p。如您所见,我已经转储了 selectionIds 并返回了我从产品视图页面中选择的选项的数组。第二个转储是 selections->getItems (我不知道这个函数在哪里,它不会让我关注它)。但是,当我从仅包含简单产品的捆绑产品(即包含键盘和鼠标的捆绑产品)中查看此 DUMP 时,它将为 selections->getItems(...)输出数据/对象>。当我从包含捆绑产品的捆绑产品(即具有包含键盘和鼠标和其他东西的捆绑产品的台式计算机)中转储它时,它不会返回 selections->getItems(...)。

            // If product has not been configured yet then $selections array should be empty
        if (!empty($selectionIds)) {
            $selections = $this->getSelectionsByIds($selectionIds, $product);

            var_dump($selectionIds);
            var_dump($selections->getItems());    
            // Check if added selections are still on sale
            foreach ($selections->getItems() as $key => $selection) {

谁能帮我理解“getSelectionsByIds”以及如何覆盖它,这样当我将商品添加到购物车和/或帮助我理解 getItems 以及如何覆盖它时,它不会为捆绑产品返回空对象也?我知道如何覆盖 getSelectionsById 但我不明白是什么导致函数什么都不返回。

谢谢

【问题讨论】:

    标签: magento bundle


    【解决方案1】:

    getSelectionsById() 正在返回一个 Magento 集合,它是一个用于包含其他模型(都属于同一类)的模型。把它想象成一个增强的阵列。你可以在这里阅读更多关于它们的信息:Using Collections in Magento

    由于一些 PHP 技巧,Magento 集合在许多情况下可以被视为一个数组。例如,以下代码有效:

    $productCollection = Mage::getModel('catalog/product')->getCollection();
    foreach ($productCollection as $product) {
        // do stuff
    }
    

    尽管如此,从集合中获取实际的 PHP 数组有时还是很有用的。为此,您使用getItems()。这是一种可用于任何 Magento 集合的方法(特别是任何继承自 Varien_Data_Collection 的对象)。你不应该有任何理由覆盖它。它只是返回集合对象在内部存储和使用的普通 ol' PHP 数组。如您所见,没什么特别的:

    /**
     * Retrieve collection items
     *
     * @return array
     */
    public function getItems()
    {
        $this->load();
        return $this->_items;
    }
    

    因此,如果 getItems() 为您的集合返回 null 或一个空数组,这意味着该集合不包含任何对象。这通常是因为应用于集合的查询返回了一个空结果集,尽管我不确定这是否适用于您的情况。

    很难具体说明为什么您的代码无法返回包含您提供的信息的填充集合。如果您能更详细地了解您是如何实现新产品类型的——您创建了哪些类、如何扩展核心捆绑包类型等,将会很有帮助。

    【讨论】:

    • 谢谢!感谢您向我解释这一点!
    最近更新 更多