カスタムブロック「無効なブロックタイプ」


7

カスタムブロックがあり、2つの別々のブロックに分割しようとしています。

これが私のフォルダ構造です(app / code / local / MyNamespace / CustomerDashboard上):

ここに画像の説明を入力してください

このモジュールの機能を2つの小さな部分に分割したいので、ファイルMyMenu.phpをブロックフォルダーとMyMenuController.phpコントローラーに追加しました。

次に、コードをコピー/貼り付けしDeliverydetails.phpMyMenu.php、機能DeliverydetailsController.phpするMyMenuController.phpかどうかを確認しました。

私は自分のlocal.xmlに入って、モジュールとテンプレートへの参照を追加しました:

<reference name="left">
        <block type="customerdashboard/mymenu" name="customerdashboard.mymenu" template="customer/form/my-menu.phtml"/>
    </reference>

コンテンツが表示されるはずのページにアクセスすると、モジュールが表示されるはずの場所に何もありませんが、exceptions.logを確認したところ、次のことがわかりました。

exception 'Mage_Core_Exception' with message 'Invalid block type: MyNamespace_CustomerDashboard_Block_Mymenu' in /var/www/html/mysite/public_html/app/Mage.php:595
Stack trace:
#0 /var/www/html/mysite/public_html/app/code/core/Mage/Core/Model/Layout.php(495): Mage::throwException('Invalid block type...')
#1 /var/www/html/mysite/public_html/app/code/core/Mage/Core/Model/Layout.php(437): Mage_Core_Model_Layout->_getBlockInstance('customerdashboa...', Array)
#2 /var/www/html/mysite/public_html/app/code/core/Mage/Core/Model/Layout.php(472): Mage_Core_Model_Layout->createBlock('customerdashboa...', 'customerdashboa...')
#3 /var/www/html/mysite/public_html/app/code/core/Mage/Core/Model/Layout.php(239): Mage_Core_Model_Layout->addBlock('customerdashboa...', 'customerdashboa...')
#4 /var/www/html/mysite/public_html/app/code/core/Mage/Core/Model/Layout.php(205): Mage_Core_Model_Layout->_generateBlock(Object(Mage_Core_Model_Layout_Element), Object(Mage_Core_Model_Layout_Element))
#5 /var/www/html/mysite/public_html/app/code/core/Mage/Core/Model/Layout.php(210): Mage_Core_Model_Layout->generateBlocks(Object(Mage_Core_Model_Layout_Element))
#6 /var/www/html/mysite/public_html/app/code/core/Mage/Core/Controller/Varien/Action.php(344): Mage_Core_Model_Layout->generateBlocks()
#7 /var/www/html/mysite/public_html/app/code/core/Mage/Core/Controller/Varien/Action.php(269): Mage_Core_Controller_Varien_Action->generateLayoutBlocks()
#8 /var/www/html/mysite/public_html/app/code/core/Mage/Customer/controllers/AccountController.php(107): Mage_Core_Controller_Varien_Action->loadLayout()
#9 /var/www/html/mysite/public_html/app/code/core/Mage/Core/Controller/Varien/Action.php(418): Mage_Customer_AccountController->indexAction()
#10 /var/www/html/mysite/public_html/app/code/core/Mage/Core/Controller/Varien/Router/Standard.php(250): Mage_Core_Controller_Varien_Action->dispatch('index')
#11 /var/www/html/mysite/public_html/app/code/core/Mage/Core/Controller/Varien/Front.php(172): Mage_Core_Controller_Varien_Router_Standard->match(Object(Mage_Core_Controller_Request_Http))
#12 /var/www/html/mysite/public_html/app/code/core/Mage/Core/Model/App.php(354): Mage_Core_Controller_Varien_Front->dispatch()
#13 /var/www/html/mysite/public_html/app/Mage.php(684): Mage_Core_Model_App->run(Array)
#14 /var/www/html/mysite/public_html/index.php(93): Mage::run('', 'store')
#15 {main}

私はすでに述べた2つのファイルを除いて、config.xmlや他の何にも触れませんでした(そして、この特定のブロックで不要な機能を削除するためだけに)これは私のconfig.xmlです。

<?xml version="1.0"?>
<config>
    <modules>
        <MyNamespace_CustomerDashboard>
                <version>0.1.1</version>
        </MyNamespace_CustomerDashboard>
    </modules>   

    <global>
        <helpers>
            <customerdashboard>
                <class>MyNamespace_CustomerDashboard_Helper</class>
            </customerdashboard>
        </helpers>
        <blocks>
            <customerdashboard>
                <class>MyNamespace_CustomerDashboard_Block</class>
            </customerdashboard>
        </blocks>
        <sales>
            <order>
                <states>
                    <invoiced translate="label">
                        <label>Invoiced</label>
                        <statuses>
                            <invoced default="1"/>
                        </statuses>
                        <visible_on_front>1</visible_on_front>
                    </invoiced>
                </states>
            </order>
        </sales>
    </global>

    <frontend>
        <routers>
            <customerdashboard>
                <use>standard</use>
                <args>
                    <module>MyNamespace_CustomerDashboard</module>
                    <frontName>customerdashboard</frontName>
                </args>
            </customerdashboard>
        </routers>  
    </frontend>     

</config>

StackExchangeでこの問題に関する他のスレッドを読みましたが、何が問題であるかを知る手掛かりがありませんでした。

では、ブロックをレンダリングできず、exceptions.logでそのエラーが発生するのはなぜですか。また、私はMagento newbです。

回答:


8

magentoによると、file/folder後の名前Block,Model,Helper folderstart with Uppercaseのみである必要がありcontain one uppercase for each folder and filesます。

magentoファイル名によるとのMymenu代わりにMyMenuです。

クラス名は MyNamespace_CustomerDashboard_Block_Mymenu


まあ、私はそれを知らなかった、それが重要だとは思わなかったことを認めなければなりません!よく見つかりました。ブロックは間違いなくそこにあります。いいえコンテンツがけれどもレンダリングしませんが、theblockが..です(:(ので、担当者のまだあなたをupvoteすることはできません)
Zed_Blade

また、...と同じクラス名を確認する必要があります。Mymenu
Amit Bera

私のスタイルとメジェントのスタイルの違いについて話したら、私はそれをしました。コントローラーとブロックの両方。私は他に何が問題であるかを調べています
Zed_Blade

回答の更新を確認してください
アミットベラ

非常に便利な答えが素晴らしい:)
スネス・カルハラ2017年

2

あなたのエラーは言う、それはブロックを見つけることができませんMyNamespace_CustomerDashboard_Block_Mymenu。このヒントに従って、ブロッククラスはにあるはずapp\code\local\MyNamespace\CustomerDashboard\Block\Mymenu.phpです。どうぞご了承くださいMyMenu.php。あるはずですMymenu.php。また、クラス名がであることを確認する必要がありますMyNamespace_CustomerDashboard_Block_Mymenu

または

local.xml更新を変更するだけでこのエラーを回避できます。このようになります。

<reference name="left">
    <block type="customerdashboard/myMenu" name="customerdashboard.mymenu" template="customer/form/my-menu.phtml"/>
</reference>

現在使用しているタイプを確認してください。のcustomerdashboard/myMenu代わりですcustomerdashboard/mymenu。これで、このタイプはブロッククラスを参照しMyNamespace_CustomerDashboard_Block_MyMenuます。このようにして、ブロックがMagentoによって認識され、問題が解決します

注:キャッシュをクリアすることを忘れないでください。


0

場合によっては(Magento 1.9)、ブロックPHPファイルで構成関数を使用するのを忘れた場合、それを配置すると問題が修正されます。

 protected function _construct()
    {
        parent::_construct();
    }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.