12

Magento のソース コードを見ているときに、次のクラスに出くわした後: Mage_Core_Block_Template_Facade、このクラスが何をするのかまったくわかりません。

明らかに私はそれを見て少し調査しましたが、それは私には明らかではありません.

人生におけるその目的と、いつ使用するのが役立つかを誰か説明できますか

4

1 に答える 1

46

Mage_Core_Block_Template_Facadeは、実際には非常に簡単に理解できます。これ..

  • ブロックに値を設定できるようにします
  • ブロックに設定するレジストリ オブジェクトの属性/値を指定するレイアウトを許可します。
  • 上記の 2 つの値が等しいかどうかを評価できるようにします

基本的に、これが Facade ブロックを他のブロックと異なるものにしています - レジストリとの相互作用、およびレジストリ キー/値とブロック インスタンスのキー/値の比較 - すべてレイアウト xml から。

コアコードで使用されているブロックの例は 1 つだけです...

catalog.xmlproduct/view.phtmlを見ると、 container1ブロックとcontainer2ブロックが表示されます。どちらも同じですが、最終出力でレンダリングされるのは 1 つだけです。

では、なぜ彼らは両方ともそこにいるのですか?これは、Mage_Core_Block_Template_Facade がどのように機能するかを説明します。

コアはファサード ブロックを使用して、product/view.phtml内 (レイアウト内ではなく、テンプレート自体内) の製品オプション ブロックの位置を管理領域から構成できるようにします。製品の編集中にデザイン タブを見ると、最後のオプションである「製品オプションを表示する」に気付くはずです。2 つのドロップダウン値は、catalog.xml と view.phtml で確認できる container1 と container2 ブロックにそれぞれ関連付けられています。 . 具体的には、product/view.phtmlを見ると、container1 と container2 が異なる div に配置されていることがわかります。

レイアウトは、ファサード ブロックを使用して [製品オプションを表示] で設定された値に基づいて、これらのブロックのどれを表示するかを決定します。

これがどのように機能するかです...


catalog.xml を確認すると、次のように表示されます。

<block type="core/template_facade" name="product.info.container1" as="container1">
    <action method="setDataByKey"><key>alias_in_layout</key><value>container1</value></action>
    <action method="setDataByKeyFromRegistry"><key>options_container</key><key_in_registry>product</key_in_registry></action>
    <action method="append"><block>product.info.options.wrapper</block></action>
    <action method="append"><block>product.info.options.wrapper.bottom</block></action>
</block>
<block type="core/template_facade" name="product.info.container2" as="container2">
    <action method="setDataByKey"><key>alias_in_layout</key><value>container2</value></action>
    <action method="setDataByKeyFromRegistry"><key>options_container</key><key_in_registry>product</key_in_registry></action>
    <action method="append"><block>product.info.options.wrapper</block></action>
    <action method="append"><block>product.info.options.wrapper.bottom</block></action>
</block>
<action method="unsetCallChild"><child>container1</child><call>ifEquals</call><if>0</if><key>alias_in_layout</key><key>options_container</key></action>
<action method="unsetCallChild"><child>container2</child><call>ifEquals</call><if>0</if><key>alias_in_layout</key><key>options_container</key></action>

setDataByKey

<action method="setDataByKey"><key>alias_in_layout</key><value>container1</value></action>

これにより、レジストリ オブジェクトに対して評価されるこのブロックの識別子が設定されます。オプション コンテナーのコンテキストでは、この値は、前述の管理領域のドロップダウン値の 1 つと一致する必要があります。

setDataByKeyFromRegistry

<action method="setDataByKeyFromRegistry"><key>options_container</key><key_in_registry>product</key_in_registry></action>

ブロックに「ねえ、レジストリの製品オブジェクトを見て、options_container キー/属性の値を取得する必要があるとき」と伝えます。に似ています:Mage::registry('product')->getData('options_container');

この特定の例では、この値は container1 または container2 であると予想されます。

ifEquals

最後に、管理領域で選択されていないコンテナを削除するために、unsetCallChild と組み合わせて ifEquals が呼び出されます。

例としてcontainer1を使用...

<action method="unsetCallChild"><child>container1</child><call>ifEquals</call><if>0</if><key>alias_in_layout</key><key>options_container</key></action>

これは、そのブロック インスタンスで ifEquals メソッドを呼び出します。戻り値が 0 の場合、container1 は設定解除され、レンダリングされません。

于 2012-07-31T22:33:50.997 に答える