JBretonの素晴らしい答えについてコメントするつもりでしたが、このスレッドにたどり着いた私の特定のユースケースは少し異なります。(また、私は非常に潜んでいて、コメントするのに十分な評判がありません。)
PHPコードでレイアウトを変更するための受け入れられた回答やその他の提案は、さまざまなイベントを観察しようとしてもうまくいきませんでした。そのため、JBreton側にsteal / support/example回答を投稿すると思いました。私のユースケースは、特定の条件に基づいてプログラムでcheckout_cart_indexレイアウトからブロック(コアおよびカスタムモジュールブロック)を削除することでした。カスタムレイアウトハンドルを使用する方法は、Magentoがテーマ内の標準レイアウトXMLファイルから処理する新しいハンドルを単に「アクティブ化」するため、ADDINGブロックでも機能します。
JBretonの方法は、私が試したすべての方法の中で最高です。現在および将来のニーズに関しては、より理にかなっています。特に、デザイナーとテンプレートビルダーが、PHPコードでうなずく必要のある同じ人物ではない場合。テンプレートの人々はXMLを知っており、とにかくMagentoのレイアウトXMLシステムに精通している必要があります。したがって、カスタムハンドルを使用して特定のプログラム条件でレイアウトを変更することは、PHPで文字列を介してXMLを追加するよりも優れた方法です。
もう一度...これは私が自分で思いついた解決策ではありません...私は上記のJBretonの答えからこれを盗み、私のドッペルゲンガーが追加の出発点として彼らの状況で使用できるサンプルコードを提供しています。すべてのモジュールコードがここに含まれているわけではないことに注意してください(特に、app / modules XMLファイル、モデルクラスなど)。
私のモジュールの設定ファイル:
app/code/local/Blahblah/GroupCode/etc/config.xml
<config>
... other config XML too ...
<frontend>
<events>
<controller_action_layout_load_before>
<observers>
<blahblah_groupcode_checkout_cart_index>
<type>singleton</type>
<class>Blahblah_Groupcode_Model_Ghost</class>
<method>checkout_cart_prepare</method>
</blahblah_groupcode_checkout_cart_index>
</observers>
</controller_action_layout_load_before>
</events>
</frontend>
</config>
クラス内のオブザーバーのメソッド:
app/code/local/Blahblah/GroupCode/Model/Observer.php
<?php
public function checkout_cart_prepare(Varien_Event_Observer $observer)
{
// this is the only action this function cares to work on
$fullActionName = 'checkout_cart_index';
... some boring prerequiste code ...
// find out if checkout is permitted
$checkoutPermitted = $this->_ghost_checkoutPermitted();
if(!$checkoutPermitted)
{
// add a custom handle used in our layout update xml file
Mage::app()->getLayout()->getUpdate()->addHandle($fullActionName . '_disable_checkout');
}
return $this;
}
テーマファイルに含まれるレイアウト更新:
app/design/PACKAGE/THEME/etc/theme.xml
<?xml version="1.0"?>
<theme>
<parent>...</parent>
<layout>
<updates>
<!-- Adding references to updates in separate layout XML files. -->
<blahblah_checkout_cart_index>
<file>blahblah--checkout_cart_index.xml</file>
</blahblah_checkout_cart_index>
... other update references too ...
</updates>
</layout>
</theme>
レイアウト更新定義ファイル:
app/design/PACKAGE/THEME/layout/blahblah--checkout_cart_index.xml
<layouts>
<checkout_cart_index_disable_checkout>
<reference name="content">
<block type="core/template" name="checkout.disabled" as="checkout.disabled" before="-" template="checkout/disabled-message.phtml" />
<remove name="checkout.cart.top_methods" />
<remove name="checkout.cart.methods" />
</reference>
</checkout_cart_index_disable_checkout>
... other layout updates too ...
</layouts>
(はい、私のモジュールには、チェックアウトプロセスイベントを監視して、誰かが手動のURLパスを忍び込まないようにする他のコードがあります。また、チェックアウトを本当に「無効にする」ために他のチェックが行われています。オブザーバーを介してプログラムでレイアウトを変更する方法の私の例。)