2009-11-26 92 views
1

我在开发的Magento商店中遇到了一个奇怪的错误,尽管我在线查询,但似乎没有人见过这个确切的相同情况下的错误。勒梅的脚印。Magento致命错误:在非对象上调用成员函数getSku()

错误消息的全文是这样的:

致命错误:呼叫到/路径中的非对象成员函数getSku()/上/服务器/应用程序/代码/核心/在线221上的法师/目录/型号/产品/选项/类型/ Select.php。

现在,其他人已收到此错误消息 - 它已被解决,并且应该在1.3.1路线图(http://www.magentocommerce.com/roadmap/release/1.3.1)中得到修复。但是,这些其他错误消息的情况是他们尝试向购物车中添加项目的地方 - 如果该项目具有自定义选项,则会循环显示此错误消息。

我的情况是,我有一个简单的项目 - 没有捆绑或配置 - 没有任何自定义选项。我可以毫无困难地将它添加到购物车中。但是,如果我运行整个结帐程序,在下订单时,错误消息出现在白色屏幕上。浏览器中的网址显示我正在结帐成功页面。

而且,订单看起来完美无缺,获得了Magento和Authorize.net的注册。

我试过调试错误,只要我可以去,但这一个让我难住。

仅供参考,我在Magento 1.3.2.4中。当我第一次收到错误时,我重新安装了所有核心文件,并仍然能够复制错误。

我将继续测试,但如果任何人有任何明智的想法,为什么发生这种情况,我很乐意听到你的想法。我非常接近发射,这件事可以把kibosh放在整个事情上。

回答

4

我以前有过这个错误,也没有得到任何关于如何解决它的命中。所以,我不得不修改核心文件来修复错误信息。问题是Mage_Catalog_Model_Product_Option::getValueById()可以返回空值,但是Catalog/Model/Product/Option/Type/Select.php不检查这种可能性。

这里是为我工作的解决方案:

打开app/code/core/Mage/Catalog/Model/Product/Option/Type/Select.php

更改行121:

$result = $option->getValueById($optionValue)->getSku(); 

要:

$o= $option->getValueById($optionValue); 
$result = is_object($o) ? $o->getSku() : null; 

我永远恨改变的核心文件,但当有一个bug时,我可以做的事情不多了!

+0

要给你的解决方案去。我会让你知道它是否有效!无论如何,谢谢你! – f8xmulder 2009-11-26 04:16:48

+2

如果这样做,请记住,不要更改核心文件,您可以将此文件复制到“本地”('app/code/local/Mage/Catalog/Model/Product/Option/Type/Select.php'),以便升级不杀它。 – philfreo 2009-11-26 17:28:06

+0

嗯,我实现了你的解决方案,但我一直无法测试它,因为我在Checkout成功时开始接收重定向循环。这可能与SSL切换有关,也可能没有任何关系。 我有这个书签,所以只要我能回来,让你知道事情是怎么回事。 – f8xmulder 2009-11-27 17:46:29

0

得到同样的问题。追踪它并在管理员中编辑订单时发现它发生在我身上,并且该订单至少包含一个产品,其中包含自订单发出后已删除的单个选项。

固定的,那么这三个文件,以便编辑这样的命令时,该产品被简单地删除 - 在“本地”范围内工作的所有修改,所以核心文件保持不变:

1。应用程序/代码/本地/法师/目录/型号/产品/选项/类型/ Select.php:221

(搜索)

$result = $option->getValueById($optionValue)->getSku(); 

(前置)

/* hotfix for - PHP Fatal error: Call to a member function getSku() on a non-object - occurs on admin order edit if a product option has been removed */ 
if (is_null($option->getValueById($optionValue))) { 
    throw new Exception('missing product option'); 
} 

2 。应用程序/代码/本地/法师/销售/型号/ Quote.php:695

(搜索)

$item = $this->_addCatalogProduct($candidate, $candidate->getCartQty()); 

(替换)

/* hotfix for - PHP Fatal error: Call to a member function getSku() on a non-object - occurs on admin order edit if a product option has been removed */ 
try { 
    $item = $this->_addCatalogProduct($candidate, $candidate->getCartQty()); 
} catch (Exception $e) { 
    if ($e->getMessage()=='missing product option') { return null; } 
     throw new Exception($e->getMessage()); 
} 

3.应用程序/代码/本地/法师/ Adminhtml /型号/销售/订单/ Create.php:288

(搜索)

if (is_string($item)) { 
    return $item; 
} 

(替换)

if (is_string($item)) { 
    return $item; 
/* hotfix for - PHP Fatal error: Call to a member function getSku() on a non-object - occurs on admin order edit if a product option has been removed */ 
} elseif (is_null($item)) { 
    return $this; 
} 
2

我遵循pygorex1发布的步骤,但也取代Select.php文件中的第191-195行,因为我仍然收到有关getPrice()的另一个类似错误。我有Magento版本。 1.3.2.4。从线191-195

原始代码:

$result = $this->_getChargableOptionPrice(
$option->getValueById($optionValue)->getPrice(), 
$option->getValueById($optionValue)->getPriceType() == 'percent', 
$basePrice 
); 

这里是我创建,以取代线191-195代码:

$z= $option->getValueById($optionValue); 
$result = is_object($z) ? $z ->getPrice() : null; 

$zz = $option->getValueById($optionValue); 
$result = is_object($zz) ? $zz ->getPriceType() == 'percent' : $basePrice; 

仅供参考 - 我不是一个PHP程序员。我只是想弄清楚如何重写代码来根据pygorex1的代码来解决这个问题。所以,我很有可能没有正确写下它。然而,它确实解决了我的问题(我很自豪:)

0

那么,我有我的客户端相同的错误,Magento在一台服务器上工作正常,但没有在另一台,所以我虽然它必须新安装(迁移后)有问题。我没有玩代码,只是修复了数据库,并开始正常工作。

相关问题