2

当店の商品のページを開くと、以下のエラーが表示されます。現在のテンプレートでは機能しませんが、別のプレーンテンプレートでは機能します。この問題は、magento1.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

_getDefaultValuesMagentoはオブジェクトのメソッドを呼び出そうとしてい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バージョンの新しいコピーをダウンロードしてファイルを置き換えることもできますが、これが失敗したアップグレードの場合、システムで他の問題が発生する可能性があるため、準備をしてください。単一のStackOverflowの質問よりも大きい修正。

デバッグステップ2:ローカルおよびコミュニティのコードプールを確認します。

Magentoでは、app/code/communityおよびapp/code/localコードプールを使用してクラスファイルを置き換えることができます。システムには、これらのプールの1つにあるこのクラスファイルのバージョンがある場合があります。でファイルを確認してください

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ファイルの追加機能を識別し、クラスの書き換えを使用するようにこれらをリファクタリングしてから、ファイルを削除する必要があります。繰り返しますが、これは単一スタックオーバーフローの回答よりも複雑なプロセスです。localcommunity

デバッグステップ3:コンパイルをオフにします。

Magentoが「コンパイル済み」モードで実行されている可能性もあり、クラスの「コンパイル済み」バージョンである可能性もあります。からコンパイルモードをオフにします

System -> Tools -> Compilation

またはコマンドラインから

$ php shell/compiler.php disable

クラスを再コンパイルします。

デバッグステップ4:optコードキャッシュをクリアします。

PHP optコードをキャッシュするためにAPCのようなシステムを実行している場合は、古いバージョンのクラスがoptコードキャッシュにある可能性があります。ここには多数のオプションがあるため、このキャッシュのクリアは読者の演習として残しておきます。

デバッグステップ5:リフレクションを使用してクラスファイルを識別します

この時点でまだルージュクラスを特定していない場合は、の下部に次のコードを追加します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

タイプのオブジェクトで存在しないメソッドを呼び出しているようです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 に答える