【问题标题】:Magento 1.7.0.2 - Call to member function getId() on a non-object in view.phtml (PHP Error)Magento 1.7.0.2 - 在 vi​​ew.phtml 中的非对象上调用成员函数 getId()(PHP 错误)
【发布时间】:2014-01-16 19:54:09
【问题描述】:

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

我不知道为什么这个错误会间歇性出现,或者是否有办法用其他东西完全替换代码但得到相同的最终结果。我真的很愿意,但希望能在这件事上提供任何帮助。

非常感谢!

【问题讨论】:

    标签: php magento


    【解决方案1】:

    注册表不是获取产品类别的可靠位置。

    以产品详情页为例,入口点是产品控制器的视图动作:app/code/core/Mage/Catalog/controllers/ProductController.php::viewAction()

    此操作从 url 参数(通常被 url 键“屏蔽”)中获取产品和类别 ID。在第 119 行检索到类别 ID:

    $categoryId = (int) $this->getRequest()->getParam('category', false);
    

    getParam 函数有 2 个参数。第一个是必需的,是我们要查找的 url 参数的名称。第二个是可选的并且是默认值(如果该 url 参数不存在则返回)。所以在这种情况下,我们正在寻找 'category' url 参数并返回它的值,如果它不存在,我们将返回 false。

    这些值被传递给product_view 助手的prepareAndRender 函数(第132 行)。该函数位于 app/code/core/Mage/Catalog/Helper/Product/View.php 中。从那里,它们被传递到 product 助手的 initProduct 函数,该函数位于 app/code/core/Mage/Catalog/Helper/Product.php 中,从第 282 行开始。

    这个initProduct 函数是我们最终尝试设置“category_id”注册表值的地方。如果我们能够从 url 中获取类别 id,则可以使用它来设置“current_category”注册表。如果我们不这样做,那么 magento 会做出最后的努力并查看客户查看的最后一个类别。如果当前产品是该类别的成员,那么我们使用它来设置'current_category'。

    如果我们在这两次尝试中都失败了,那么我们将跳过设置“current_category”注册表。

    简而言之,如果我们使用不包含类别的 url(example.com/red-sofa 而不是 example.com/sofas/red-sofa)访问产品详细信息页面,那么会有一个很好的可能不会设置“current_category”注册表项。

    由于一个产品可以有多个类别,我将获取产品型号并调用getCategoryIds 函数,该函数将返回所有产品类别的 ID 号数组。

    【讨论】:

      【解决方案2】:

      您在模板文件中工作的注册表有可能返回null,这里不需要调用注册表,请将您的代码更改为

      <?php
          $this->getCurrentCategory()->getId();
      ?>
      

      这是在模板文件中调用类别 ID 的正确方法。如果您在模型或控制器中工作,您将使用 Mage::getModel 或注册表。

      【讨论】:

        【解决方案3】:

        您可以通过以下方式从产品中获取类别id和其他数据:

        $productCategories = $_product->getCategoryIds(); 
        foreach ( $productCategories as $k => $_categoryId ){
        $_category = Mage::getModel('catalog/category')->load($_categoryId) 
         echo $_category->getName()
        }
        

        最好的问候!

        【讨论】:

          猜你喜欢
          • 2015-06-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-20
          • 2016-02-02
          相关资源
          最近更新 更多