2

すべてのページで使用したい汎用テンプレートファイルがあります。同僚がlocal.xmlまたはpage.xmlレイアウトファイルに単一のパラメーターを追加して、データベース値に関係なくすべてのページが特定のレイアウトファイルを使用するように強制するのを目撃しました。彼はそれ以来会社を辞めたので、私は彼にどうやってそれをしたのか尋ねることができません。local.xmlを使用してMagento1.5でデフォルトのレイアウトを設定する方法で提案されているように答えを試しましたか?しかし、それはうまくいきませんでした。

Magento(1.7)に必要なテンプレート/レイアウトのみをロードさせるにはどうすればよいですか?

4

3 に答える 3

3

残念ですが、すべてのページレイアウトでテンプレートが使用されるようにするために使用できるオプションは1つだけではありません。また、各ページレイアウトハンドルにカスタムテンプレートを設定するレイアウトハンドルを適用することもできます。

したがって、local.xmlには次のようなものが含まれているはずです。

<your_custom_handle>
     <action method="setTemplate" block="root"><template>your/template.phtml</template></action>
</your_custom_handle>

<page_empty>
     <update handle="your_custom_handle" />
</page_empty>

<page_one_column>
     <update handle="your_custom_handle" />
</page_one_column>

<page_two_columns_left>
     <update handle="your_custom_handle" />
</page_two_columns_left>

<page_two_columns_right>
     <update handle="your_custom_handle" />
</page_two_columns_right>

<page_three_columns>
     <update handle="your_custom_handle" />
</page_three_columns>

レイアウト更新の最初の部分は、テンプレートをルートブロックに設定する独自のハンドルを作成します。他のすべては、カスタムハンドルをさまざまなページレイアウトに含めています。

楽しみ!

于 2012-07-27T15:07:58.383 に答える
1

Ivansの回答の代わりに、イベントオブザーバーを使用してテンプレートを設定することもできます。詳細な説明については、この回答を参照してください。使用できるコードは次のとおりです。

app / design / frontend / yourpackage / yourtheme / layout / 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 -->

    <set_root_template>
        <reference name="root">
             <action method="setTemplate"><template>your/template.phtml</template></action>
        </reference>
    </set_root_template>
</layout>

app / code / yourpool / Company / Extension / Model / Observer.php

    <?php

    class Company_Extension_Model_Observer
    {
        /**
         * Sets the template file for the root block.
         * 
         * Uses the event 'controller_action_layout_load_before'.
         * 
         * @param Varien_Event_Observer $observer
         * @return YourCompany_YourExtension_Model_Observer
         */
        public function setRootTemplate(Varien_Event_Observer $observer)
        {
            $layout = $observer->getEvent()->getLayout()->getUpdate();
            $layout->addHandle('set_root_template');
            return $this;
        }
    }

app / code / yourpool / Company / Extension / etc / config.xml

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

    <frontend>
        <events>
            <controller_action_layout_load_before>
                <observers>
                    <company_extension_set_root_template>
                        <type>singleton</type>
                        <class>company_extension/observer</class>
                        <method>setRootTemplate</method>
                    </company_extension_set_root_template>
                </observers>
            </controller_action_layout_load_before>
        </events>
        <!-- declaring your layout xml etc. -->
    </frontend>

    <global>
        <!-- declaring your block classes etc. -->
        <models>
            <company_extension>
                <class>Company_Extension_Model</class>
            </company_extension>
        </models>
    </global>
</config>

app / etc / modules / Company_Extension.xml

<?xml version="1.0" encoding="UTF-8"?>
<config>
    <modules>
        <Company_Extension>
            <active>true</active>
            <codePool>local</codePool>
        </Company_Extension>
    </modules>
</config>
于 2012-08-08T16:46:49.110 に答える
0

そして別の選択肢として。(ただし、本質的には@MatthiasZeisと同じです)。私はそれを行うためのモジュールも提供しています)

同じ問題があり、オブザーバーイベントを使用してカスタムハンドルをmagentoに挿入するという同じアイデアを思いつきました。

したがって、私のコードは<GLOBAL_OVERRIDE>、と呼ばれる「最後にロード」ハンドルを挿入します。これにより、レイアウトディレクティブを介してルートテンプレートを設定できます。

最後に読み込まれるため、テンプレートを変更するために以前に設定されたレイアウトディレクティブは、次のディレクティブに置き換えられます。<GLOBAL_OVERRIDE>

<GLOBAL_OVERRIDE>
        <reference name="root">
            <action method="setTemplate"><template>page/2columns-left.phtml</template></action>
        </reference>
    </GLOBAL_OVERRIDE>

これを使用して、別のハンドルをグローバルに削除したり、サイト全体で子ブロックの設定を解除したりすることも簡単にできます。

コードをgithubに配置しました:

https://github.com/ProxiBlue/GlobalHandle

于 2014-02-13T09:47:57.790 に答える