8

Magentoにコンテンツブロックを追加しようとしています。これは、メインコンテンツの下のすべての側に表示されるはずです。これをカスタム拡張機能でアーカイブしたいので、この拡張機能をコピーでき、コアデザインファイルに触れることなく機能します。私の拡張機能には、次のレイアウト更新が含まれています。

<default>
    <reference name="content">
        <block type="mymod/blockname" name="myblockname" after="-" template="mymod/block.phtml"/>
    </reference>
</default>

私の問題は、属性after="-"が機能していないことです。ブロックは常にコンテンツブロックの上部に表示されます。どうやらbeforeafter結果はありません。ブロックをつまりフッターに移動すると、属性beforeafterは正常に機能しています。

ブロック「コンテンツ」の下部にブロックを配置するにはどうすればよいですか

4

1 に答える 1

21

私が見る限り、問題は「デフォルト」のレイアウトハンドルでブロックを指定し、「コンテンツ」ブロックのほとんどのコンテンツは後で適用される他のレイアウトハンドルによって追加されることです。そのため、XML登録ファイル(Fabianによって言及されている)に追加された依存関係は役に立ちません。

ニーズに応じて、次の2つのオプションを検討してください。

1.本当にすべてのフロントエンドページにブロックを含めたい場合

XMLレイアウトファイル(local.xmlまたはカスタムファイル)に、新しいレイアウトハンドルを追加します

<?xml version="1.0" encoding="UTF-8"?>
<layout version="0.1.0">

    <!-- your other adjustments for default, category_product_view and so on go here -->

    <add_my_block>
        <reference name="content">
            <block type="mymod/blockname" name="myblockname" after="-" template="mymod/block.phtml"/>
        </reference>
    </add_my_block>
</layout>

次に、イベントオブザーバーを作成して、レイアウトハンドルをレイアウトに挿入します。

    <?php

    class YourCompany_YourExtension_Model_Observer
    {
        /**
         * Adds a block at the end of the content block.
         * 
         * Uses the event 'controller_action_layout_load_before'.
         * 
         * @param Varien_Event_Observer $observer
         * @return YourCompany_YourExtension_Model_Observer
         */
        public function addBlockAtEndOfMainContent(Varien_Event_Observer $observer)
        {
            $layout = $observer->getEvent()->getLayout()->getUpdate();
            $layout->addHandle('add_my_block');
            return $this;
        }
    }

次に、イベントオブザーバーをXML拡張構成ファイル(config.xml)に登録します。

<?xml version="1.0" encoding="UTF-8" ?>
<config>
    <modules>
        <YourCompany_YourExtension>
            <version>0.0.1</version>
        </YourCompany_YourExtension>
    </modules>

    <frontend>
        <events>
            <controller_action_layout_load_before>
                <observers>
                    <mymod_add_block_at_end_of_main_content>
                        <type>singleton</type>
                        <class>mymod/observer</class>
                        <method>addBlockAtEndOfMainContent</method>
                    </mymod_add_block_at_end_of_main_content>
                </observers>
            </controller_action_layout_load_before>
        </events>
        <!-- declaring your layout xml etc. -->
    </frontend>

    <global>
        <!-- declaring your block classes etc. -->
        <models>
            <mymod>
                <class>YourCompany_YourExtension_Model</class>
            </mymod>
        </models>
    </global>
</config>

これで、ブロックは他のブロックの下に配置されます。ホームページ、顧客ログインページ、カテゴリビューページでこれを正常にテストしました。いくつかのページでブロックを除外する必要がある場合は、その特定のページでブロックを除外する必要があるかどうかをイベントオブザーバーで確認できます。

2.一部のページにのみブロックを含めたい場合

以前と同じようにXMLレイアウトファイルにレイアウトハンドルを追加しますが、イベントオブザーバーを作成して登録する代わりに、一部の領域でカスタムレイアウトハンドルを使用するようにXMLレイアウトファイルに指示します。

<?xml version="1.0" encoding="UTF-8"?>
<layout version="0.1.0">

    <catalog_category_default>
        <update handle="add_my_block" />
    </catalog_category_default>

    <catalog_category_layered>
        <update handle="add_my_block" />
    </catalog_category_layered>

    <cms_page>
        <update handle="add_my_block" />
    </cms_page>

    <!-- and so on -->

    <add_my_block>
        <reference name="content">
            <block type="mymod/blockname" name="myblockname" after="-" template="mymod/block.phtml"/>
        </reference>
    </add_my_block>

</layout>
于 2012-07-22T09:17:55.220 に答える