Magento:无效方法Mage_Bundle_Block_Catalog_Product_View_Type_Bundle_Option_Radio

SPR*_*BRN 2 php magento magento-1.4 magento-1.7

打开我们的某个商品的页面时,我看到以下错误.在当前模板中,它不起作用,在另一个普通模板中.问题可能是从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:"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)

#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:"skin";s:7:"default";}

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

Ala*_*orm 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');
    }
}
Run Code Online (Sandbox Code Playgroud)

在它的父类中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()
    {
        //...
    }
}    
Run Code Online (Sandbox Code Playgroud)

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

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

app/code/core/Mage/Bundle/Block/Catalog/Product/View/Type/Bundle/Option.php
Run Code Online (Sandbox Code Playgroud)

这个文件有_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
Run Code Online (Sandbox Code Playgroud)

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

调试步骤3:关闭编译.

Magento也可能以"编译"模式运行,并且是你的类的"编译"版本.关闭编译模式

System -> Tools -> Compilation
Run Code Online (Sandbox Code Playgroud)

或者从命令行开始

$ php shell/compiler.php disable
Run Code Online (Sandbox Code Playgroud)

并重新编译你的类.

调试步骤4:清除选择代码缓存.

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

调试步骤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>';
Run Code Online (Sandbox Code Playgroud)

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