2012-07-31 8 views
11

Magento 소스 코드를 보면서 다음 클래스를 찾은 후 : Mage_Core_Block_Template_Facade,이 클래스의 기능을 전혀 알지 못합니다.Mage_Core_Block_Template_Facade의 목적은 무엇입니까

분명히 나는 ​​그것을 조사하고 조금 조사했지만 분명히 분명하지 않습니다. 이

+0

나는 그 모든 것을 몇 번 분석하려고 노력했지만, 그게 무엇인지 이해할 수는 없었습니다. 즉, 당신이 이해할 수있는이 주석 글타래에 http://www.pulsestorm.net/nofrills-layout-chapter-five에 대한 주석이 있습니다 (Masy 씨의 의견을 따르지 못했습니다. 하지만 그것은 당신에게 의미가있을 수도 있습니다) –

+0

그 코멘트가 무엇에 도착했는지 확실하지 않습니다. :) - 나는 내 생각으로 정면 블록에 대답했습니다. 아마 그것을 조금 더 잘 설명 할 수 있었을 것입니다. 그러나 바라건대 요점을 가져옵니다. –

+0

@DrewHunter 스티븐이 물건을 연구하기 시작할 장소를 가리키고 있습니다. 실제적인 대답은 가치가 없었습니다. –

답변

42

Mage_Core_Block_Template_Facade를 사용하는 것이 유용 할 수 있습니다 때

사람이 인생의 목적을 설명하고 있습니다, 사실은 이해하기 매우 간단합니다. 그것은 ..

  • 는 값이 블록에 설정
  • 이 블록
  • 설정되도록 레지스트리 객체 속성/값을 지정하는 레이아웃을 허용 할 수 있도록 허용 상기 두 값의 평등 허용 평가할 테이블

기본적으로 외관 블록을 다른 블록 (레이아웃과의 상호 작용 및 레지스트리 키/값과 블록 인스턴스 키/값 비교)이 레이아웃 xml과 다르게 만듭니다.

핵심 코드에 사용되는 블록의 한 예는 ...이

당신이 container1을컨테이너 2 블록을 볼 수 product/view.phtmlcatalog.xml에서 상대와 - 그들은 모두 동일하지만, 하나는 이제까지 최종 산출물에서 렌더링됩니다.

왜 둘 다 거기에 있습니까? Mage_Core_Block_Template_Facade가 어떻게 작동하는지 설명합니다.

코어는 제품 옵션 블록 위치가 product/view.phtml (레이아웃 내에 있지 않지만 템플리트 자체 내)의 위치를 ​​관리 영역에서 구성 할 수 있도록하는 방법으로 파사드 블록을 사용합니다. 제품을 편집하는 동안 디자인 탭을 보면 마지막 옵션 인 "제품 옵션 표시"에 주목해야합니다. 두 개의 드롭 다운 값은 각각 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> 

이가 식별자를 설정합니다 이 블록은 레지스트리 객체에 대해 평가됩니다. 옵션 컨테이너의 컨텍스트에서이 값은 앞에서 언급 한 관리 영역의 드롭 다운 값 중 하나와 일치해야합니다.

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

setDataByKeyFromRegistry 블록 "이봐, 우리가 레지스트리에서 제품 객체에서 살펴보고 options_container 키/속성의 값을 잡아해야 할 때"을 지시합니다. 이 특정 예에서는이 값이 container1 또는 container2가 될 것으로 예상합니다.

ifEquals

마지막 ifEquals가 관리 영역에서 선택되지 않은 상기 용기를 제거 할 unsetCallChild과 함께 불린다. 예를 들어이 container1를 사용

...

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

반환 값이 0이 다음 container1을가 설정 및 렌더링없는 것 인 경우 이것은 그 블록 인스턴스에 ifEquals 메소드를 호출한다.

관련 문제