레이아웃 XML에서 조건부로 블록 표시 / 숨기기


32

Magento의 레이아웃 XML에서 (관리자 패널의 구성에 따라) 조건부로 블록을 추가하는 방법은 무엇입니까?

동작에서 설정이 참인지 확인할 수 있습니다. 아래 예 sample/config/show_toplinks에서 (시스템-> 구성에서) 관리자 패널의 구성이 true이면 템플릿 파일 links.phtml이 상위 링크를 렌더링하는 데 사용됩니다. 경우 sample/config/show_toplinks입니다 거짓 , 다음 기본 템플릿이 사용됩니다.

<reference name="top.links">
    <action method="setTemplate" ifconfig="sample/config/show_toplinks">
        <template>page/template/links.phtml</template>
    </action>
</reference>

웹 어딘가 에서이 해결 방법을 찾았습니다. 빈 템플릿을 다음과 같이 Top Links의 기본 템플릿으로 설정할 수 있습니다.

<reference name="top.links">
    <action method="setTemplate" ifconfig="sample/config/show_toplinks">
        <template>page/template/links.phtml</template>
    </action>

    <!-- OR set completely empty template -->
    <action method="setTemplate">
        <template>page/template/empty_template_for_links.phtml</template>
    </action>
</reference>

이 경우에, sample/config/show_toplinks이다 사실 , 그 템플릿이 links.phtml사용되며 최고 링크가 표시됩니다. 하지만 경우 sample/config/show_toplinks입니다 거짓 , 다음 empty_template_for_links.phtml템플릿이 사용됩니다 그것은 어떤 HTML을 반환하지 않고 상위 링크가 표시되지 않도록 해당 템플릿은 완전히 비어 있습니다.

  1. 관리자 패널의 구성에 따라 블록을 조건부로 표시하거나 숨길 수있는 다른 방법이 있습니까?
  2. 이 해결 방법은 안전합니까?
  3. 예기치 않은 오류가 발생할 수 있습니까?

편집하다:

모든 답변을 바탕으로 Rick Kuipers의 솔루션이 내 경우에 가장 편리하다고 생각합니다. 그러나 다른 관련 질문이 있습니다.

    <block type="core/template" name="my_block" template="my/block.phtml" />
    <!-- ...add more blocks here -->

    <reference name="footer">
        <action method="append" ifconfig="sample/config/show_toplinks">
            <block>my_block</block>
        </action>
        <!-- ...append more blocks here -->
    </reference>

이렇게 추가 할 블록이 많으면 ( append방법 및 사용 ifconfig) 50이라고 말하면 성능에 영향을 줍 니까? 일부 블록 만 실제로 표시되지만 (시스템-> 구성의 사용자 설정에 따라 다름) 조건부로 블록을 추가하기 전에 모든 블록을 추가해야합니다 <reference name="footer">...</reference>.

Magento는 이와 같이 추가 된 모든 블록을 즉시 처리합니까?

    <block type="core/template" name="my_block" template="my/block.phtml" />

또는 블록이 템플릿에 최종적으로 표시되어야하는 경우에만 처리됩니까? Magento는 일부 블록 만 표시해야한다는 사실에도 불구하고 내 50 개 블록을 모두 처리해야합니까?

답변:


28

Benmarks의 답변이 아닌 옵션을 추가하고 싶습니다.

내 접근 방식은 추가 작업을 사용하는 것입니다.

    <block type="core/template" name="my_block" template="my/block.phtml" />
    <reference name="head">
        <action method="append" ifconfig="myblock/general/enabled"><block>my_block</block></action>
    </reference>

1
이것은 특정 경우에 적용될 수 있지만 초기 생각이었습니다.이 경우 해당 블록 ( top.links )이 기본적으로 코어에서 호출됩니다.
benmarks

@benmarks 아 모듈화를 위해 의미합니까? 그렇다면이 경우 가장 좋은 방법이 될 것입니다.
Rick Kuipers

1
@RickKuipers 1.이 "추가"방법이 어떻게 작동하는지 명확히 할 수 있습니까? my_block"head"내부 로 이동 하거나 "head"내부에 해당 블록의 다른 사본을 추가하고 첫 번째 사본이 여전히 다른 곳에 표시됩니다 (블록이 이미 이전에 추가되었으므로 <reference name="head">)? 2. "append"또는 "unsetChild"와 같은 레이아웃 방법을 찾을 수있는 PHP 파일은 무엇입니까?
zitix

1
@zitix 블록의 정의가 <reference name="root">(또는 다른 비 core/text_list블록)에 있으면에 의해 호출되지 않는 한 자동으로 표시되지 않습니다 getChildHtml(). 블록을 이동하지 않고 사본이되므로 여러 번 추가 할 수 있습니다. <action>블록에서 메소드를 호출합니다. 우리가 말하는 블록에 따라 다릅니다. 에서 몇 가지 표준을 찾을 수 있습니다 Mage_Core_Block_Abstract. 그러나 블록이 소유 한 모든 메소드를 사용하여 호출 할 수 있습니다 <action>.
Rick Kuipers 2014 년

@RickKuipers 그리고이 방법은 성능에 어떤 영향을 줍니까? (내 질문을 편집했습니다) 블록이 <block type="core/template" name="my_block" template="my/block.phtml" />표시되지 않더라도 추가해야합니다 .
zitix

15

_template속성을 사용하여 출력을 숨기는 것은 새로운 접근법입니다. 예 = 0 (아마도 사용자 정의 소스 모델)이되도록 구성 옵션의 값을 반대로 바꾸고 unsetChild부모 헤드 블록을 호출 하는 것이 좋습니다 .

<reference name="head">
    <action method="unsetChild" ifconfig="sample/config/show_toplinks">
       <child>topLinks</child>
    </action>
</reference>

1
감사합니다. 이것은 매우 좋지만 시스템-> 구성의 모든 구성 필드를 뒤집어 야합니다. 나는 Top Links: [enable/disable]다음과 같이 변경해야합니다 Hide Top Links: [Yes/No].
zitix

1
시스템 구성의 소스 모델은 매우 쉽고,이 경로는 관찰자를 통해 사용자 정의 레이아웃 업데이트 핸들을 추가하는 것보다 훨씬 덜 복잡합니다.
benmarks

12

당신의 질문에 관해서 :

  1. 내 방법은 단지 너에게 확장

  2. 왜 그렇지 않을지 알 수 없습니다

  3. 다시 말하지만, 코드는 예외를 발생시키지 않는 메소드 뒤에 매우 안전합니다 ( getStoreConfig하나는 거짓 값을 반환하므로 조건부 핸들이 추가되지 않습니다). 빈 템플릿 파일이 존재하지 않으면 예외가 발생합니다. (예 : 빈 값을 전달하는 자동 폐쇄 태그를 사용 <template />)

이것을 개발하고 있다면 구성을 확인하고 조건에 따라 레이아웃에 핸들을 추가하는 관찰자를 포함하도록 솔루션을 확장합니다. 그런 다음 레이아웃 파일에 서로 다른 handles- 내부 모두 작업을 설정할 수 있습니다 defaultshow_toplinks

<config>
  <global>
    <!-- stuff -->
    <events>
      <controller_action_layout_load_before>
        <observers>
          <my_module_add_handle>
            <class>my_module/Observer</class>
            <method>addHandle</method>
          </my_module_add_handle>
        </observers>
      </controller_action_layout_load_before>
    </events>
    <!-- other stuff -->
  </global>
</config>

그리고 당신의 Observer모델에서 ...

public function addHandle(Varien_Event_Observer $observer)
{
    if (Mage::getStoreConfig('sample/config/toplinks') {
        $observer->getEvent()->getLayout()->getUpdate()
            ->addHandle('show_toplinks');
    }
}

마지막으로 레이아웃에서 Aaaand :

<default>
  <reference name="top.links">
     <!-- yup -->
  </reference>
</default>

<show_toplinks>
  <reference name="top.links">
     <!-- another yup -->
  </reference>
</show_toplinks>

고마워요, 나는 이것을 몰랐습니다. 미래 에이 방법을 사용할 것입니다. 그러나 지금해야 할 일에는 너무 많은 추가 코드가 필요합니다.
zitix
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.