Mage_Core_Block_Template_Facade, jest całkiem proste do zrozumienia. To ..
- Pozwala wartość należy ustawić w bloku
- Pozwala układ, aby podać atrybut/wartość z obiektu do rejestru być ustawiony na bloku
- Pozwala równość dwóch wartości powyżej do oceny:
Zasadniczo to właśnie sprawia, że Blok elewacyjny różni się od innych bloków - interakcja z rejestrem i porównywanie klucza/wartości rejestru z kluczem/wartością instancji bloku - wszystko z układu xml.
Jest tylko jeden przykład bloku wykorzystywane w kodzie rdzenia ...
Patrząc w catalog.xml i product/view.phtml widać container1 i container2 bloki - obie są identyczne, ale tylko jeden jest kiedykolwiek renderowane w ostatecznym wyniku.
Więc dlaczego oni tam są? To wyjaśni, jak działa Mage_Core_Block_Template_Facade.
Rdzeń wykorzystuje blok elewacji jako metodę pozwalającą na konfigurację opcji pozycji produktu w zakresie product/view.phtml (nie w obrębie układu, ale w obrębie samego szablonu) w obszarze administracyjnym. Jeśli zajrzysz na kartę projektu podczas edycji produktu, powinieneś zauważyć ostatnią opcję: "Wyświetl opcje produktu w" - dwie wartości rozwijane korelują każdą z bloków container1 i container2, które można zobaczyć w catalog.xml i view.phtml . W szczególności, patrząc w product/view.phtml powinieneś zobaczyć container1 i container2 umieszczone w różnych div.
Układ decyduje, który z tych bloków ma być wyświetlany na podstawie wartości ustawionej w "Wyświetl opcje produktu w" przy użyciu bloku elewacji.
Oto jak to działa ...
Sprawdź catalog.xml i widać:
<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>
To ustawia identyfikator ten blok, który zostanie wyceniony względem obiektu rejestru. W kontekście kontenerów opcji ta wartość będzie musiała być zgodna z jedną z wartości rozwijanych w poprzednim obszarze administracyjnym.
setDataByKeyFromRegistry
<action method="setDataByKeyFromRegistry"><key>options_container</key><key_in_registry>product</key_in_registry></action>
Informuje blok „hej, kiedy trzeba spojrzeć na obiekt w rejestrze produktów i chwycić wartość klucza options_container/atrybut”. Zbliżone do: Mage::registry('product')->getData('options_container');
Oczekiwalibyśmy, że ta wartość będzie kontener1 lub kontener2 w tym konkretnym przykładzie.
ifEquals
Wreszcie ifEquals nazywa się w połączeniu z unsetCallChild aby wyjąć pojemnik nie wybrany w obszarze administracyjnym.
pomocą container1 jako przykład ...
<action method="unsetCallChild"><child>container1</child><call>ifEquals</call><if>0</if><key>alias_in_layout</key><key>options_container</key></action>
wymaga to sposób ifEquals w tym przypadku bloku, jeżeli wartość jest równa 0, to będzie container1 być wyłączony i nie może stać.
Próbowałem przeanalizować to wszystko kilka razy i nigdy nie byłem w stanie zrozumieć, o co tu chodzi. To powiedziawszy, jest pewien komentarz na ten temat w tym wątku komentarzy: http://www.pulsestorm.net/nofrills-layout-chapter-five, który może mieć dla ciebie sens (nie mogłem dokładnie śledzić tego, o czym mówił pan Masy, ale może to ci pomóc) –
Nie jestem pewien, co się stało z tym komentarzem :) - Odpowiedziałem z moimi przemyśleniami na temat bloku elewacji. Prawdopodobnie wyjaśniłoby to trochę lepiej, ale mam nadzieję, że trafi na punkt –
@ DrewHunter Wystarczy wskazać Stephenowi w kierunku miejsca, gdzie można zacząć badania - nie było to warte prawdziwej odpowiedzi. –