2012-07-31 35 views
11

Po potknięciu się o następujące klasy, patrząc na kod źródłowy magento: Mage_Core_Block_Template_Facade, nie mam absolutnie żadnego pojęcia, co robi ta klasa.Jaki jest cel Mage_Core_Block_Template_Facade

Oczywiście spojrzałem na to i zbadałem trochę, ale to po prostu nie jest dla mnie jasne.

Może ktoś wyjaśnić swój cel w życiu i kiedy może to być przydatne do korzystania

+0

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) –

+0

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 –

+0

@ DrewHunter Wystarczy wskazać Stephenowi w kierunku miejsca, gdzie można zacząć badania - nie było to warte prawdziwej odpowiedzi. –

Odpowiedz

42

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ć.