打开其中一个商品的页面时,我看到以下错误。在当前模板中它不起作用,在另一个普通模板中它起作用。问题可能是从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
答案 0 :(得分: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/community
和app/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
,那么您就找到了问题所在。修复此问题将再次变得棘手。如果文件放在此处,则表示先前的开发人员添加或更改了方法。您可以通过删除local
或community
文件来解决上述错误,但之后您将失去此自定义功能。您需要将正确的core
文件与local
/ community
文件合并,或者您需要确定local
/ {{1}中的额外功能文件和重构这些以使用类重写,然后才删除该文件。同样,这是一个比单个堆栈溢出答案更复杂的过程。
调试步骤3 :关闭编译。
Magento也可能以“编译”模式运行,并且是你的类的“编译”版本。从
关闭编辑模式community
或从
命令行System -> Tools -> Compilation
并重新编译你的课程。
调试步骤4 :清除opt代码缓存。
如果您正在运行像APC这样的系统来缓存PHP opt代码,那么该类的旧版本可能在opt代码缓存中。由于这里有很多选项,我将把这个缓存的清除作为读者的练习。
调试步骤5 :使用反射来识别类文件
如果您此时仍未识别出胭脂类,请将以下代码添加到$ php shell/compiler.php disable
的底部
index.php
这将实例化一个块类,并使用反射来告诉你它的定义文件在哪里。从那里,您可以找出为什么这是错误的定义文件,以及您需要做什么来删除它。
答案 1 :(得分:2)
您似乎在Mage_[...]_Radio
类型的对象上调用非现有方法。
班级Mage_Bundle_Block_Catalog_Product_View_Type_Bundle_Option_Radio
does not have任何名为_getDefaultValues
的公共方法。
经过一些研究后,我发现该类中的方法actually exists但其可见性受到保护,因此您可以从Mage_[...]_Radio
类继承访问它并将其公开访问或离开它受到保护:
class YourClass extends Mage_Bundle_Block_Catalog_Product_View_Type_Bundle_Option_Radio {
public function getDefaultValues() { return $this->_getDefaultValues(); }
}