[英]How to Overriding Mage_Catalog_Block_Product_View_Options_Type_Select.php in Magento
[英]Magento: Invalid method Mage_Bundle_Block_Catalog_Product_View_Type_Bundle_Option_Radio
打開我們的某個商品的頁面時,我看到以下錯誤。 在當前模板中,它不起作用,在另一個普通模板中。 問題可能是從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
聽起來你的系統中運行的不同版本的Magento代碼不匹配。 您也可以擁有舊類的編譯版本,或社區/本地代碼池覆蓋。 這將是很長的,所以我將嘗試用粗體文本調出特定的調試技巧
正如其他答案已經闡明的那樣,PHP正在告訴你確切的問題。
Mage_Bundle_Block_Catalog_Product_View_Type_Bundle_Option_Radio :: _ getDefaultValues
Magento試圖在Mage_Bundle_Block_Catalog_Product_View_Type_Bundle_Option_Radio
對象上調用_getDefaultValues
方法。 但是,在您的系統中,此對象沒有此方法。 如果我看一下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
code pool替換類文件。 您的系統可能具有此類池中的一個版本。 檢查文件
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
/ community
文件中的額外功能,並重構這些以使用類重寫,然后才刪除該文件。 同樣,這是一個比單個堆棧溢出答案更復雜的過程。
調試步驟3 :關閉編譯。
Magento也可能以“編譯”模式運行,並且是你的類的“編譯”版本。 關閉編譯模式
System -> Tools -> Compilation
或者從命令行開始
$ php shell/compiler.php disable
並重新編譯你的類。
調試步驟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>';
這將實例化一個塊類,並使用反射來告訴您它的定義文件在哪里。 從那里,您可以找出為什么這是錯誤的定義文件,以及您需要做什么來刪除它。
您似乎在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(); }
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.