Magento致命错误:在非对象上调用成员函数getSku()

时间:2009-11-26 02:56:44

标签: php magento shopping-cart checkout fatal-error

我在Magento商店发现了一个奇怪的错误,尽管我在网上查询,但在同样的情况下似乎没有人见过这个确切的错误。 Lemme'splain。

错误消息的全文如下:

致命错误:在/ path / on / server / app / code / core / Mage / Catalog / Model / Product / Option /上的非对象上调用成员函数getSku()在221行输入/ Select.php。

现在,其他人已收到此错误消息 - 已在1.3.1路线图(http://www.magentocommerce.com/roadmap/release/1.3.1)中解决了该问题。但是,这些其他错误消息的情况是他们尝试将项目添加到购物车的位置 - 如果该项目具有自定义选项,则会循环显示此错误消息。

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

并且,订单似乎完美无缺,由Magento和Authorize.net注册。

我尽可能地尝试调试错误,但是这个让我感到难过。

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

我将继续测试,但如果有人对于为什么会发生这种情况有任何明智的想法,我很乐意听到你的想法。我已经离发射很近了,这件事可以让整个事情发生变化。

4 个答案:

答案 0 :(得分: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;

我总是讨厌更改核心文件,但是当出现错误时,我无能为力!

答案 1 :(得分:2)

我遵循pygorex1发布的步骤,但也替换了Select.php文件中的第191-195行,因为我仍然收到关于getPrice()的另一个类似错误。我有Magento ver。 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的代码修复此问题。所以,我很有可能没有正确地写它。但是,它确实解决了我的问题(我为此感到自豪:)

答案 2 :(得分: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;
}

答案 3 :(得分:0)

好吧,我的客户端遇到了同样的错误,Magento在一台服务器上正常工作但在另一台服务器上运行不正常,所以我认为新安装(迁移后)一定有问题。我没有玩代码,只是修复了数据库,它开始正常工作。