在访问Magento网站上的产品详情页面时,我间歇性地收到以下错误...
Call to member function getId() on a non-object in view.phtml (line 70)
此错误引用的代码可以在下面找到...
<?php
$current_category = Mage::registry('current_category');
$current_id = $current_category->getId();
?>
我在其中使用代码的原因是显示特定于这些类别中的产品的内容。下面是一个例子......
<?php if(($current_category) && ($current_id == 717)):?>
// Code Here
<?php endif; ?>
我不知道为什么这个错误会间歇性地发生,或者是否有办法完全用其他东西替换代码但得到相同的最终结果。我真的很高兴,但我会很感激任何和所有的帮助。
非常感谢!
答案 0 :(得分:1)
注册表不是获取产品类别的可靠位置。
对于产品详细信息页面,入口点是产品控制器的查看操作:app/code/core/Mage/Catalog/controllers/ProductController.php::viewAction()
此操作从url参数中获取产品和类别ID(通常由url键“屏蔽”)。在第119行检索类别ID:
$categoryId = (int) $this->getRequest()->getParam('category', false);
getParam
函数有2个参数。第一个是必需的,是我们正在寻找的url参数的名称。第二个是可选的,是默认值(如果该url参数不存在则返回什么)。所以在这种情况下,我们正在寻找'category'url参数并返回它的值,如果它不存在,我们返回false。
这些值传递给prepareAndRender
助手的product_view
函数(第132行)。此函数位于app / code / core / Mage / Catalog / Helper / Product / View.php中。从那里,它们被传递到initProduct
助手的product
函数,该函数位于app / code / core / Mage / Catalog / Helper / Product.php,从第282行开始。
这个initProduct
函数是我们最终尝试设置'category_id'注册表值的地方。如果我们能够从url获取类别ID,则会获得设置'current_category'注册表的内容。如果我们没有,那么magento会做出最后的努力,并查看客户所看到的最后一个类别。如果当前产品是该类别的成员,那么我们使用它来设置'current_category'。
如果我们在这两次尝试都失败了,那么我们会跳过设置'current_category'注册表。
缺点是如果我们访问一个产品详细信息页面,其中包含一个不包含该类别的网址(example.com/red-sofa而不是example.com/sofas/red-sofa),那就非常好了 由于产品可以有多个类别,我会获得产品型号并调用getCategoryIds
函数,该函数将返回所有产品类别的ID编号数组。
答案 1 :(得分:0)
您在模板文件中工作,注册表有可能返回null,此处不需要调用注册表,将代码更改为
<?php
$this->getCurrentCategory()->getId();
?>
这是在模板文件中调用类别ID的正确方法。如果您在模型或控制器中工作,您将使用Mage :: getModel或注册表。
答案 2 :(得分:0)
您可以从产品的下一个方式获取类别ID和其他数据:
$productCategories = $_product->getCategoryIds();
foreach ( $productCategories as $k => $_categoryId ){
$_category = Mage::getModel('catalog/category')->load($_categoryId)
echo $_category->getName()
}
最诚挚的问候!