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 页面尝试过:
这是产品对象:
我有一个自定义模块。在我的自定义模块的模型区域中,我正在尝试检索要在 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 页面尝试过:
这是产品对象: