レイアウトXMLで複数のレイアウトハンドルをターゲットにする


22

次のように、ノードにテンプレートを/custommodule/customer/infoロードするパスでアクセスされるカスタムコントローラーがあります。2columns-left.phtmlroot

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

私がやりたいのは、ログインしていない顧客のルートテンプレートを更新することです。

<customer_logged_out>
    <custommodule_customer_info>
        <reference name="root">
            <action method="setTemplate"><template>page/1column.phtml</template></action>
        </reference>
    </custommodule_customer_info>
</customer_logged_out>

この方法で複数のレイアウトハンドルをターゲットにできないことは理解していますが、意図は明確でなければなりません。顧客がログインしていないときに、このレイアウトハンドルのルートテンプレートを更新します。

私はコントローラーのハンドルを次のものでターゲットにできると思っていました。

<customer_logged_out>
    <reference name="custommodule_customer_info">
        <reference name="root">
            <action method="setTemplate"><template>page/1column.phtml</template></action>
        </reference>
    </reference>
</customer_logged_out>

これは実際にテンプレートでルートテンプレートを更新1column.phtmlしますが、referenceノードでターゲットになっているページだけでなく、すべてのページに見えるもので更新しています。

このレイアウト更新のいくつかの順列を試しましたが、どれも機能していないようです。レイアウトハンドルを使用しながら、この1つのレイアウトハンドルをターゲットにするにはどうすればよいcustomer_logged_outですか?

-編集-明確にするために、これは実際にはサードパーティのモジュールです。

回答:


18

独自のコントローラーを使用しているため、デフォルトのハンドルのみを使用する必要はありません。ログイン状態に基づいて、infoActionメソッドに追加できます

 $this->getLayout()->getUpdate()->addHandle('mymodule_customer_info_logged_in');

または

 $this->getLayout()->getUpdate()->addHandle('mymodule_customer_info_logged_out');

次に、layout.xmlファイルで使用します

<mymodule_customer_info_logged_in>

そして

<mymodule_customer_info_logged_out>

-以下の編集後の追加-

コントローラを編集したくない(サ​​ードパーティの拡張機能であるため)ので、controller_action_layout_load_beforeのみを監視する別の拡張機能を作成します

    $update = $observer->getEvent()->getLayout()->getUpdate();
    $handles = $update->getHandles();

    if (in_array('custommodule_customer_info', $handles)) {

        //code to add the custom handles based on login
    }

おしゃれ。これは理想的ではありませんが、比較的クリーンなソリューションです。以下の他のコメントで述べたように、サードパーティのモジュールを変更する必要はありませんが、ここでは選択肢があまりないようです。残念なことに、customer_logged_in/outハンドル非常に強力である可能性があります、この制限のために見えます。
pspahn

14

アラン・ストームは次のような何かに答えました:

/programming//a/5601579/1157493

ヘルパーを使用して、カスタムがログインしているかどうかを確認するロジックを実行できます。

<action method="setTemplate">
    <template helper="mymodule/myhelper/switchTemplateIf"/>
</action>

このMage::helper('mymodule/myhelper')->switchTemplateIf(); ヘルパーでは、テンプレートを切り替えるか、このように保持するかを決定できます。

私はそれreturnがその機能であなたが何にでもテンプレートを設定すると信じています。

次のようになります。

public function switchTemplateIf() {
    if (Mage::helper('customer')->isLoggedIn()) {
        return 'page/1column.phtml';
    } else {
        return 'page/2column-right.phtml';
    }
}

未テスト


私もこれを考えていましたが、モジュール内の追加のクラスに依存せずにこれを実行するには、モジュールのレイアウトXMLのみに依存することを望んでいました。 XMLでは、必要ない場合は追加のモジュールリソースを作成しないでください」。
pspahn

@pspahnもちろん、目標は、Magentoが提供するXMLレイアウトシステムでそれを試してみることです。残念ながら、これには制限があり、これはその1つだと思います。私はまだ余分なモジュールリソースにもかかわらず、これは完全に実行可能なソリューションだと思いますが。
リックカイパーズ

@pspahn Foomanには、私よりもお勧めする代替ソリューションがあります。コーディングが少なくて済みます!
リックカイパーズ

この場合、実際にはサードパーティのモジュールを扱っています。モジュールを編集する必要はなく(更新によって破損する可能性があるため)、別のモジュールのヘルパークラスに配置する必要はありません(モジュールとモジュールをヒップで結び付けるため)。
pspahn

6

最近この種の機能が必要になり、既存のレイアウトハンドルのさまざまな組み合わせすべてにレイアウトハンドルを追加することが難しくなったため、Magento拡張機能を作成して、レイアウトxmlから複数のレイアウトハンドルを直接ターゲットとする機能を追加しました。

これが拡張機能へのリンクです -https://github.com/mridul89/MultipleHandles.git

次のように使用します

<customer_logged_out ifhandle="custommodule_customer_info">
    <reference name="root">
        <action method="setTemplate"><template>page/1column.phtml</template></action>
    </reference>
</customer_logged_out>

これはcustomer_logged_outcustommodule_customer_infoレイアウトハンドルも存在する場合にのみ、この特定のレイアウトハンドルを使用するようにmagentoに指示します。

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