Magento 1.7.0.2 - 在view.phtml中的非对象上调用成员函数getId()(PHP错误)

时间:2014-01-16 19:54:10

标签: php magento

在访问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; ?>

我不知道为什么这个错误会间歇性地发生,或者是否有办法完全用其他东西替换代码但得到相同的最终结果。我真的很高兴,但我会很感激任何和所有的帮助。

非常感谢!

3 个答案:

答案 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()
}

最诚挚的问候!