【问题标题】:Get simple products belonging to configurable product AFTER configurable product save在可配置产品保存后获取属于可配置产品的简单产品
【发布时间】:2011-07-05 12:46:12
【问题描述】:

在 magento 中,可以通过以下调用获取与可配置产品相​​关联的简单产品:

$childProducts = Mage::getModel('catalog/product_type_configurable')->getUsedProducts(null, $product);

我试图在保存可配置产品后调用此函数,以便我可以获得它使用的简单产品的新列表。所以我通过catalog_product_save_after 事件触发的方法进行上述调用。但是,在调用 $childProducts 之后,会在保存操作之前而不是之后存储与 $product 关联的简单产品。

保存操作后如何获取与$product关联的简单产品?

提前致谢,欢迎提出任何建议。

【问题讨论】:

    标签: magento


    【解决方案1】:

    Magento 的 OOP 系统非常好,这种优点有时会给尚未深入了解其结构的人带来问题。

    如果您密切关注“Mage_Catalog_Model_Product_Type_Configurable”类中的“getUsedProducts()”方法,您会看到提供了一些“if”逻辑,以及其属性的用法(如“@987654324 @"、"_configurableAttributes")。这些阻碍了您获得实际结果,但错误不在于 Magento,而是因为缺少 Magento 文档。

    让我澄清一下这个方法的前几行:-

    Varien_Profiler::start('CONFIGURABLE:'.__METHOD__);
    if (!$this->getProduct($product)->hasData($this->_usedProducts)) {
        if (is_null($requiredAttributeIds) and is_null($this->getProduct($product)->getData($this->_configurableAttributes))) {
            // If used products load before attributes, we will load attributes.
            $this->getConfigurableAttributes($product);
            // After attributes loading products loaded too.
            Varien_Profiler::stop('CONFIGURABLE:'.__METHOD__);
            return $this->getProduct($product)->getData($this->_usedProducts);
        }
        ....
    

    此方法有 2 个参数 - “$requiredAttributeIds”(可配置的属性 ID)和“$product”(可配置的产品对象)。

    调用此方法时,您为参数“$requiredAttributeIds”传递了“null”,但您提供了正确的可配置产品对象“$product”。

    该类有一个属性“_usedProducts”(用于维护子简单产品的数据),为每个可配置产品对象设置。如果该值之前已设置,则 Magento 将向您返回已经可用的值。这是您在可配置产品更新之前获得子产品的主要原因。

    因此,您可以做的是清除整个缓存存储,同时刷新所有缓存进程。可能那时你的结果会起作用,因为 Magento 内部将所有这些使用过的产品数据存储在缓存中。

    希望对你有帮助。

    【讨论】:

    • 感谢您的详细回答,我认为这至少让我走上了正轨。我尝试清除缓存(即删除 var/cache 中的所有内容),但我仍然遇到同样的问题。奇怪的是,如果我再次保存可配置产品,我可以看到与之关联的正确简单产品。所以我必须保存两次才能获得保存一次后想要的效果。我还尝试按照您的建议查找 Mage_Catalog_Model_Product_Type_Configurable 类,但未能在 app/code/core/Mage/Catalog/Model/Product/Type/Configurable 中找到它。你是怎么找到的?
    • 您使用的是哪个 Magento 版本?
    • 我正在使用 Magento CE 1.5.1.0。我设法找到了文件(app/code/core/Mage/Catalog/Model/Product/Type/Configurable.php)。你是对的,缓存确实是问题所在。然而,仅仅清除缓存是不够的。在调用getUsedProducts() 之前,我必须明确取消设置_cache_instance_products 属性。我使用Mage::getModel('catalog/product_type_configurable')-> getProduct($product)->unsetData('_cache_instance_products'); 做到了这一点
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-30
    • 1970-01-01
    • 2013-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多