2

打开我们商店商品之一的页面时,我看到以下错误。在当前模板中它不起作用,在另一个普通模板中它起作用。该问题可能是由从 magento 1.4 升级到 1.7 引起的。

谁能解释这意味着什么以及发生了什么?我怎样才能解决这个问题?

a:5:{i:0;s:109:"Invalid method Mage_Bundle_Block_Catalog_Product_View_Type_Bundle_Option_Radio::_getDefaultValues(Array ( ) )";i:1;s:7069:"#0 /www/htdocs/app/design/frontend/base/default/template/bundle/catalog/product/view/type/bundle/option/radio.phtml(33): Varien_Object->__call('_getDefaultValu...', Array)

下面是完整的错误报告。该产品是捆绑包的一部分。

a:5:{i:0;s:109:"方法无效 Mage_Bundle_Block_Catalog_Product_View_Type_Bundle_Option_Radio::_getDefaultValues(Array
(
)
)";i:1;s:7069:"#0 /www/htdocs/app/design/frontend/base/default/template/bundle/catalog/product/view/type/bundle/option/radio.phtml(33 ): Varien_Object->__call('_getDefaultValu...', Array)

#1 /www/htdocs/app/design/frontend/base/default/template/bundle/catalog/product/view/type/bundle/option/radio.phtml(33): Mage_Bundle_Block_Catalog_Product_View_Type_Bundle_Option_Radio->_getDefaultValues()
#2 /www/htdocs/app/code/core/Mage/Core/Block/Template.php(241): include('/www/ht...')
#3 /www/htdocs/app/code/core/Mage/Core/Block/Template.php(272): Mage_Core_Block_Template->fetchView('frontend/base/d...')
#4 /www/htdocs/app/code/core/Mage/Core/Block/Template.php(286): Mage_Core_Block_Template->renderView()
#5 /www/htdocs/app/code/core/Mage/Catalog/Block/Product/Price.php(154): Mage_Core_Block_Template->_toHtml()
#6 /www/htdocs/app/code/core/Mage/Bundle/Block/Catalog/Product/Price.php(97): Mage_Catalog_Block_Product_Price->_toHtml()
#7 /www/htdocs/app/code/core/Mage/Core/Block/Abstract.php(863): Mage_Bundle_Block_Catalog_Product_Price->_toHtml()
#8 /www/htdocs/app/code/core/Mage/Bundle/Block/Catalog/Product/View/Type/Bundle.php(216): Mage_Core_Block_Abstract->toHtml()
#9 /www/htdocs/app/design/frontend/base/default/template/bundle/catalog/product/view/type/bundle/options.phtml(37): Mage_Bundle_Block_Catalog_Product_View_Type_Bundle->getOptionHtml(Object(Mage_Bundle_Model_Option))
#10 /www/htdocs/app/code/core/Mage/Core/Block/Template.php(241): include('/www/ht...')
#11 /www/htdocs/app/code/core/Mage/Core/Block/Template.php(272): Mage_Core_Block_Template->fetchView('frontend/base/d...')
#12 /www/htdocs/app/code/core/Mage/Core/Block/Template.php(286): Mage_Core_Block_Template->renderView()
#13 /www/htdocs/app/code/core/Mage/Core/Block/Abstract.php(863): Mage_Core_Block_Template->_toHtml()
#14 /www/htdocs/app/code/core/Mage/Core/Block/Abstract.php(582): Mage_Core_Block_Abstract->toHtml()
#15 /www/htdocs/app/code/core/Mage/Core/Block/Abstract.php(522): Mage_Core_Block_Abstract->_getChildHtml('product.info.bu...', true)
#16 /www/htdocs/app/design/frontend/base/default/template/catalog/product/view/options/wrapper.phtml(28): Mage_Core_Block_Abstract->getChildHtml('', true, true)
#17 /www/htdocs/app/code/core/Mage/Core/Block/Template.php(241): include('/www/ht...')
#18 /www/htdocs/app/code/core/Mage/Core/Block/Template.php(272): Mage_Core_Block_Template->fetchView('frontend/base/d...')
#19 /www/htdocs/app/code/core/Mage/Core/Block/Template.php(286): Mage_Core_Block_Template->renderView()
#20 /www/htdocs/app/code/core/Mage/Core/Block/Abstract.php(863): Mage_Core_Block_Template->_toHtml()
#21 /www/htdocs/app/code/core/Mage/Core/Block/Abstract.php(582): Mage_Core_Block_Abstract->toHtml()
#22 /www/htdocs/app/code/core/Mage/Core/Block/Abstract.php(522): Mage_Core_Block_Abstract->_getChildHtml('product.info.op...', true)
#23 /www/htdocs/app/code/core/Mage/Core/Block/Abstract.php(546): Mage_Core_Block_Abstract->getChildHtml('', true, true)
#24 /www/htdocs/app/design/frontend/default/shoestore/template/catalog/product/view.phtml(101): Mage_Core_Block_Abstract->getChildChildHtml('container2', '', true, true)
#25 /www/htdocs/app/code/core/Mage/Core/Block/Template.php(241): include('/www/ht...')
#26 /www/htdocs/app/code/core/Mage/Core/Block/Template.php(272): Mage_Core_Block_Template->fetchView('frontend/defaul...')
#27 /www/htdocs/app/code/core/Mage/Core/Block/Template.php(286): Mage_Core_Block_Template->renderView()
#28 /www/htdocs/app/code/core/Mage/Core/Block/Abstract.php(863): Mage_Core_Block_Template->_toHtml()
#29 /www/htdocs/app/code/core/Mage/Core/Block/Text/List.php(43): Mage_Core_Block_Abstract->toHtml()
#30 /www/htdocs/app/code/core/Mage/Core/Block/Abstract.php(863): Mage_Core_Block_Text_List->_toHtml()
#31 /www/htdocs/app/code/core/Mage/Core/Block/Abstract.php(582): Mage_Core_Block_Abstract->toHtml()
#32 /www/htdocs/app/code/core/Mage/Core/Block/Abstract.php(526): Mage_Core_Block_Abstract->_getChildHtml('content', true)
#32 /www/htdocs/app/code/core/Mage/Core/Block/Abstract.php(526): Mage_Core_Block_Abstract->_getChildHtml('content', true)
#33 /www/htdocs/app/design/frontend/base/default/template/page/2columns-right.phtml(48): Mage_Core_Block_Abstract->getChildHtml('content')
#34 /www/htdocs/app/code/core/Mage/Core/Block/Template.php(241): include('/www/ht...')
#35 /www/htdocs/app/code/core/Mage/Core/Block/Template.php(272): Mage_Core_Block_Template->fetchView('frontend/base/d...')
#36 /www/htdocs/app/code/core/Mage/Core/Block/Template.php(286): Mage_Core_Block_Template->renderView()
#37 /www/htdocs/app/code/core/Mage/Core/Block/Abstract.php(863): Mage_Core_Block_Template->_toHtml()
#38 /www/htdocs/app/code/core/Mage/Core/Model/Layout.php(555): Mage_Core_Block_Abstract->toHtml()
#39 /www/htdocs/app/code/core/Mage/Core/Controller/Varien/Action.php(390): Mage_Core_Model_Layout->getOutput()
#40 /www/htdocs/app/code/core/Mage/Cms/Helper/Page.php(137): Mage_Core_Controller_Varien_Action->renderLayout()
#41 /www/htdocs/app/code/core/Mage/Cms/Helper/Page.php(52): Mage_Cms_Helper_Page->_renderPage(Object(Mage_Cms_IndexController), 'no-route')
#42 /www/htdocs/app/code/core/Mage/Cms/controllers/IndexController.php(75): Mage_Cms_Helper_Page->renderPage(Object(Mage_Cms_IndexController), 'no-route')
#43 /www/htdocs/app/code/core/Mage/Core/Controller/Varien/Action.php(419): Mage_Cms_IndexController->noRouteAction()
#44 /www/htdocs/app/code/core/Mage/Core/Controller/Varien/Router/Standard.php(250): Mage_Core_Controller_Varien_Action->dispatch('noRoute')
#45 /www/htdocs/app/code/core/Mage/Core/Controller/Varien/Front.php(176): Mage_Core_Controller_Varien_Router_Standard->match(Object(Mage_Core_Controller_Request_Http))
#46 /www/htdocs/app/code/core/Mage/Core/Model/App.php(354): Mage_Core_Controller_Varien_Front->dispatch()
#47 /www/htdocs/app/Mage.php(683): Mage_Core_Model_App->run(Array)
#48 /www/htdocs/index.php(119): Mage::run('', 'store')
#49 {main}";s:3:"url";s:26:"/nike-bw-black.html";s:11:"script_name";s:10:"/index.php";s :4:"皮肤";s:7:"默认";}

phtml文件的代码:http: //pastebin.com/6CGq3nSR

4

2 回答 2

7

听起来您的系统中运行的不同版本的 Magento 的代码不匹配。您也可能拥有旧类的编译版本,或社区/本地代码池覆盖。这会很长,所以我会尝试用粗体字调出具体的调试提示

正如其他答案已经表明的那样,PHP 正在告诉您确切的问题。

Mage_Bundle_Block_Catalog_Product_View_Type_Bundle_Option_Radio::_getDefaultValues

Magento 正在尝试在您的对象上调用该_getDefaultValues方法。Mage_Bundle_Block_Catalog_Product_View_Type_Bundle_Option_Radio但是,在您的系统中,此对象没有此方法。如果我查看 Magento 1.7.0.1 的全新安装,则此类定义在

#File: app/code/core/Mage/Bundle/Block/Catalog/Product/View/Type/Bundle/Option/Radio.php
class Mage_Bundle_Block_Catalog_Product_View_Type_Bundle_Option_Radio
    extends Mage_Bundle_Block_Catalog_Product_View_Type_Bundle_Option
{
    /**
     * Set template
     *
     * @return void
     */
    protected function _construct()
    {
        $this->setTemplate('bundle/catalog/product/view/type/bundle/option/radio.phtml');
    }
}

在它的父类Mage_Bundle_Block_Catalog_Product_View_Type_Bundle_Option中,我们可以找到_getDefaultValues

#File: app/code/core/Mage/Bundle/Block/Catalog/Product/View/Type/Bundle/Option.php
class Mage_Bundle_Block_Catalog_Product_View_Type_Bundle_Option extends Mage_Bundle_Block_Catalog_Product_Price
{
    protected function _getDefaultValues()
    {
        //...
    }
}    

受保护的方法可以从块的模板中调用,因此这意味着这不是Magento 发布版本的错误,而是您的系统的问题。

调试步骤 1:首先要检查的是您的文件版本

app/code/core/Mage/Bundle/Block/Catalog/Product/View/Type/Bundle/Option.php

这个文件有_getDefaultValues方法吗?如果不是,或者如果它private不是protected,那么问题是您的phtml模板版本来自 Magento 的一个版本,但您的核心类文件来自另一个版本,或者已被修改。您可以尝试下载您正在运行的 Magento 版本的新副本并替换该文件 - 但如果这是一次拙劣的升级,您的系统可能会出现其他问题,因此请做好准备。修复比单个 Stack Overflow 问题更大的问题。

调试步骤 2:检查您的本地和社区代码池。

Magento 允许您使用app/code/communityapp/code/local代码池替换类文件。您的系统可能在这些池之一中具有此类文件的一个版本。检查中的文件

app/code/community/Mage/Bundle/Block/Catalog/Product/View/Type/Bundle/Option.php
app/code/local/Mage/Bundle/Block/Catalog/Product/View/Type/Bundle/Option.php

如果有文件,请检查_getDefaultValues方法。如果它不存在,或者它private不是protected,那么您已经找到了问题。再次解决这个问题会很棘手。如果文件放在这里,则意味着以前的开发人员添加或更改了方法。您可以通过删除localorcommunity文件来修复上述错误,但是您将失去此自定义功能。您需要将正确的core文件与您的local/community文件合并,或者您需要识别local/community文件中的额外功能并重构这些以使用类重写,然后才删除该文件。同样,这是一个比单个堆栈溢出答案更复杂的过程。

调试步骤 3:关闭编译。

Magento 也有可能在“编译”模式下运行,并且你的类的“编译”版本。关闭编译模式

System -> Tools -> Compilation

或从命令行使用

$ php shell/compiler.php disable

并重新编译你的类。

调试步骤 4:清除 opt 代码缓存。

如果您正在运行像 APC 这样的系统来缓存 PHP 选项代码,则可能是该类的旧版本位于选项代码缓存中。由于这里有很多选项,我将把清除缓存作为练习留给读者。

调试步骤5:使用反射识别类文件

如果此时还没有识别出 rouge 类,在底部添加如下代码index.php

$o = Mage::getSingleton('core/layout')->createBlock('bundle/catalog_product_view_type_bundle_option_radio');
$r = new ReflectionClass($o);
echo '<h1>';
var_dump(get_class($o));
var_dump($r->getFilename());
echo '</h1>';

这将实例化一个块类并使用反射告诉你它的定义文件在哪里。从那里,您可以找出为什么这是错误的定义文件,以及您需要做些什么来删除它。

于 2013-04-04T19:19:31.163 回答
2

您似乎正在对 type 的对象调用不存在的方法Mage_[...]_Radio

该类Mage_Bundle_Block_Catalog_Product_View_Type_Bundle_Option_Radio 没有任何名为的公共方法_getDefaultValues


经过一些研究,我发现该方法实际上存在于该类中,但它的可见性受到保护,因此要访问它,您从Mage_[...]_Radio该类继承并使其公开可访问或使其受到保护:

class YourClass extends Mage_Bundle_Block_Catalog_Product_View_Type_Bundle_Option_Radio {
    public function getDefaultValues() { return $this->_getDefaultValues(); }
}
于 2013-03-29T09:10:21.017 回答