Magento Mage::registry('current_product') 在模型中不工作

Magento Mage::registry('current_product') not working in Models

我有一个自定义模块。在我的自定义模块的模型区域中,我正在尝试检索要在 Public 函数中使用的当前产品的 SKU。

我测试了当前代码,但我在前端收到 NULL 值。

public function sku(){
        $product = Mage::helper('catalog/product')->getProduct();
        $model = Mage::getModel('catalog/product')->getCollection()
                ->addAttributeToSelect('SKU')
                ->addAttributeToFilter('entity_id', $product)
                ->getFirstItem();
        $SKU_id = $model->getSKU();
        var_dump($SKU_id);
}

我也尝试使用以下代码,但结果相同:

public function sku(){
        $product = Mage::registry('current_product');
        $model = Mage::getModel('catalog/product')->getCollection()
                ->addAttributeToSelect('SKU')
                ->addAttributeToFilter('entity_id', $product)
                ->getFirstItem();
        $SKU_id = $model->getSKU();
        var_dump($SKU_id);
}

我在网上查了一下,似乎 mage:registry('current_product') 可以在块和控制器中检索,但不能在模型中检索。另一方面 mage:registry('current_product') 是一个全局变量。我不知道如何检索 magento 模型中当前产品的属性。

提前致谢。

更新-------------------------------------------- --------------------------

以 magento 核心代码为例,如果我想检索 Mage_Tax_Model_Calculation http://docs.magentocommerce.com/Mage_Tax/Mage_Tax_Model_Calculation.html 中的 ('current_product')sku。该文件中的可用信息可能吗?

这取决于从哪里调用它。 current_product 从 Mage_Catalog_Helper_Product::initProduct() 注入注册表。因此,如果您的代码在该方法之前或在未调用该方法的请求(似乎只有产品页面)上被调用,则该产品将不会存储在该注册表项中。

因此,为了获得当前产品,您需要通过上面提到的产品助手加载它,或者直接将产品对象注入方法。

我同意凯文施罗德的观点。您应该确定之前的一些代码已经设置了当前产品,或者助手正在返回一些实际产品。

在上面的代码示例中,我认为您需要为 'entity_id' 传递一个整数 ID,因此:

->addAttributeToFilter('entity_id', $product->getId())

我认为你应该 select 'sku' 而不是 'SKU' 所以:

->addAttributeToSelect('sku')

这些类型的打字错误一直困扰着我。

您是否直接尝试了 $product->getData('sku')?有时会加载 sku 属性,但这取决于 and/or 之前在各种设置上发生的情况。正如凯文所说,您应该发现 why/when/if 当您的代码运行时没有当前产品,并且可能会放入一些条件来捕获这种情况。

正如其他人所指出的,这取决于您试图在注册表中访问产品的位置。我想你正在 "Product View Page" 上尝试所有这些,如果你想在产品注册之前获得它,你可以在你的模型中使用它:

//Product ID is available from the Request object. $productId = Mage::app()->getRequest()->getParam('id'); $product = Mage::getModel('catalog/product')->load($productId); $sku = $product->getSku();

当您谈到税收计算时,您很可能需要报价单(购物车)中的产品。试试这个:

Mage::getSingleton('checkout/session')->getQuote()->getAllItems()

如果没有 - 让我们知道您想收到哪种产品?更具体些。

upd.1

我可以通过 Mage::registry('current_product') 访问产品。我从 catalog/product/view 页面尝试过:

这是产品对象: