レイアウトXMLで条件付きでブロックを表示/非表示


32

MagentoのレイアウトXMLに条件付きで(管理パネルの設定に応じて)ブロックを追加する方法は?

configがアクションに対して真であるかどうかを確認できます。以下の例でsample/config/show_toplinksは、管理パネル(System-> Configuration)の設定がtrueの場合、テンプレートファイルlinks.phtmlがトップリンクのレンダリングに使用されます。sample/config/show_toplinksfalseの場合、デフォルトのテンプレートが使用されます。

<reference name="top.links">
    <action method="setTemplate" ifconfig="sample/config/show_toplinks">
        <template>page/template/links.phtml</template>
    </action>
</reference>

この回避策はWebのどこかにありました。次のように、空のテンプレートをトップリンクのデフォルトテンプレートとして設定できます。

<reference name="top.links">
    <action method="setTemplate" ifconfig="sample/config/show_toplinks">
        <template>page/template/links.phtml</template>
    </action>

    <!-- OR set completely empty template -->
    <action method="setTemplate">
        <template>page/template/empty_template_for_links.phtml</template>
    </action>
</reference>

この場合、sample/config/show_toplinkstrueの場合、テンプレートlinks.phtmlが使用され、トップリンクが表示されます。しかし、場合sample/config/show_toplinksはfalse、その後、empty_template_for_links.phtmlテンプレートが使用され、それが任意のHTMLを返さないとトップリンクが表示されませんので、そのテンプレートは、完全に空です。

  1. 管理パネルの構成に応じて、条件付きでブロックを表示または非表示にする他の方法はありますか?
  2. この回避策は安全ですか?
  3. これにより、予期しないエラーが発生する可能性がありますか?

編集:

すべての回答に基づいて、Rick Kuipersのソリューションが私の場合に最も便利に見えると思います。しかし、別の関連する質問があります:

    <block type="core/template" name="my_block" template="my/block.phtml" />
    <!-- ...add more blocks here -->

    <reference name="footer">
        <action method="append" ifconfig="sample/config/show_toplinks">
            <block>my_block</block>
        </action>
        <!-- ...append more blocks here -->
    </reference>

このように(appendメソッドとを使用してifconfig)追加するブロックが多数ある場合、50とましょう 。パフォーマンスに影響しますか?一部のブロックのみが実際に表示されます(これは、システム->構成でのユーザーの設定に依存します)が、条件付きでブロックを追加する前に、それらすべてのブロックを追加する必要があります<reference name="footer">...</reference>

Magentoは、このように追加されたすべてのブロックを即座に処理しますか?

    <block type="core/template" name="my_block" template="my/block.phtml" />

またはブロックは、テンプレートに最終的に表示する必要がある場合にのみ処理されますか?それで、Magentoは表示する必要があるのは一部のブロックだけであるにもかかわらず、私の50ブロックすべてを処理する必要がありますか?

回答:


28

ベンチマークの答えではなく、オプションを追加したいと思います。

私のアプローチは、追加アクションを使用することです:

    <block type="core/template" name="my_block" template="my/block.phtml" />
    <reference name="head">
        <action method="append" ifconfig="myblock/general/enabled"><block>my_block</block></action>
    </reference>

1
これは特定の場合に適用できます(そして私の最初の考えでした)が、この場合、問題のブロック(top.links)はデフォルトでコアから呼び出されます。
ベンマーク

@benmarksああ、モジュール化するという意味ですか?この場合、あなたのアプローチが最良のアプローチになります。
リックカイパーズ

1
@RickKuipers 1.この「追加」メソッドがどのように機能するかを明確にできますか?my_block「ヘッド」内で移動しますか、それとも「ブロック」の別のコピーを「ヘッド」内に追加し<reference name="head">ますか?2.「append」や「unsetChild」などのすべてのレイアウトメソッドを見つけることができるPHPファイルはどれですか?
zitix

1
@zitixブロックの定義が<reference name="root">(または他の非core/text_listブロック)にある場合、によって呼び出されない限り、自動的に表示されませんgetChildHtml()。ブロックは移動されず、コピーになるため、複数回追加できます。<action>ブロック内のメソッドを呼び出します。ですから、私たちが話しているブロックに依存します。でいくつかの標準的なものを見つけることができますMage_Core_Block_Abstract。ただし、ブロックが所有するメソッドは、を使用して呼び出すことができます<action>
リックカイパーズ

@RickKuipersそして、この方法はパフォーマンスにどのように影響しますか?(質問を編集しました)<block type="core/template" name="my_block" template="my/block.phtml" />最終的に表示されない場合でも、ブロックを追加する必要があります。
zitix

15

_templateプロパティを使用して出力を非表示にすることは、新しいアプローチです。構成オプションの値を逆にして、Yes = 0(おそらくカスタムソースモデル)にunsetChildし、親のheadブロックを呼び出します。

<reference name="head">
    <action method="unsetChild" ifconfig="sample/config/show_toplinks">
       <child>topLinks</child>
    </action>
</reference>

1
ありがとう、これは非常に良いですが、System-> Configのすべての設定フィールドを反転する必要があります。変更する必要があります:のTop Links: [enable/disable]ようなものにHide Top Links: [Yes/No]
zitix

1
システム構成のソースモデルは非常に簡単であり、このパスは、オブザーバーを介してカスタムレイアウト更新ハンドルを追加するよりもはるかに簡単です。
ベンマーク

12

ご質問について:

  1. 私の方法はあなたのものを拡張するだけです

  2. なぜそうならないのか分かりません

  3. 繰り返しますが、例外を引き起こさないメソッドの背後でコードはかなり安全です(getStoreConfigたとえば、偽の値を返すだけなので、条件付きハンドルは追加されません)が、空のテンプレートファイルが存在しない場合は例外が発生します。自己終了タグを使用して空の値を渡します(例<template />

これを開発している場合、構成をチェックし、条件付きでレイアウトにハンドルを追加するオブザーバーを含めるようにソリューションを拡張します。次に、あなたのレイアウトファイルには、異なるhandles-内部の両方のアクションを設定することができますdefaultし、show_toplinks

<config>
  <global>
    <!-- stuff -->
    <events>
      <controller_action_layout_load_before>
        <observers>
          <my_module_add_handle>
            <class>my_module/Observer</class>
            <method>addHandle</method>
          </my_module_add_handle>
        </observers>
      </controller_action_layout_load_before>
    </events>
    <!-- other stuff -->
  </global>
</config>

そして、あなたのObserverモデルで...

public function addHandle(Varien_Event_Observer $observer)
{
    if (Mage::getStoreConfig('sample/config/toplinks') {
        $observer->getEvent()->getLayout()->getUpdate()
            ->addHandle('show_toplinks');
    }
}

Aaaand最終的にあなたのレイアウト:

<default>
  <reference name="top.links">
     <!-- yup -->
  </reference>
</default>

<show_toplinks>
  <reference name="top.links">
     <!-- another yup -->
  </reference>
</show_toplinks>

ありがとう、私はこれを知りませんでした、私は確かに将来この方法を使うでしょう。しかし、私が今やらなければならないことは、追加のコードが多すぎることです。
-zitix
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.