레이아웃 XML에서 여러 레이아웃 핸들 타겟팅


22

다음과 같이 노드 /custommodule/customer/info에서 2columns-left.phtml템플릿을 로드하는 경로에 사용자 정의 컨트롤러에 액세스했습니다 root.

<custommodule_customer_info>
    <reference name="root">
        <action method="setTemplate"><template>page/2columns-left.phtml</template></action>
    </reference>
</custommodule_customer_info>

내가하고 싶은 것은 로그인하지 않은 고객을 위해 루트 템플릿을 업데이트하는 것입니다.

<customer_logged_out>
    <custommodule_customer_info>
        <reference name="root">
            <action method="setTemplate"><template>page/1column.phtml</template></action>
        </reference>
    </custommodule_customer_info>
</customer_logged_out>

이러한 방식으로 여러 레이아웃 핸들을 타겟팅 할 수는 없지만 의도는 명확해야합니다. 고객이 로그인하지 않은 상태에서이 레이아웃 핸들의 루트 템플릿을 업데이트합니다.

다음과 같이 컨트롤러 핸들을 대상으로 할 수 있다고 생각했습니다.

<customer_logged_out>
    <reference name="custommodule_customer_info">
        <reference name="root">
            <action method="setTemplate"><template>page/1column.phtml</template></action>
        </reference>
    </reference>
</customer_logged_out>

이것은 실제로 템플릿으로 루트 템플릿을 업데이트 1column.phtml하지만 내 reference노드 에서 대상으로 지정된 페이지 대신 모든 페이지로 표시됩니다 .

이 레이아웃 업데이트에 대한 몇 가지 순열을 시도했지만 아무것도 작동하지 않는 것 같습니다. 레이아웃 핸들을 사용하면서 동시에이 하나의 레이아웃 핸들을 대상으로 지정할 수 customer_logged_out있습니까?

-편집-분명히, 이것은 실제로 타사 모듈입니다.

답변:


18

자신의 컨트롤러를 사용하기 때문에 기본 핸들 만 사용할 필요는 없습니다. 로그인 상태에 따라 infoAction 메소드에 추가 할 수 있습니다

 $this->getLayout()->getUpdate()->addHandle('mymodule_customer_info_logged_in');

또는

 $this->getLayout()->getUpdate()->addHandle('mymodule_customer_info_logged_out');

그런 다음 layout.xml 파일에서

<mymodule_customer_info_logged_in>

<mymodule_customer_info_logged_out>

-아래 편집 후 추가-

컨트롤러를 편집하지 않으려는 경우 (타사 확장 프로그램이므로) controller_action_layout_load_before 만 관찰하는 별도의 확장 프로그램을 만듭니다.

    $update = $observer->getEvent()->getLayout()->getUpdate();
    $handles = $update->getHandles();

    if (in_array('custommodule_customer_info', $handles)) {

        //code to add the custom handles based on login
    }

멋진. 이것은 이상적이지는 않지만 비교적 깨끗한 솔루션입니다. 아래의 다른 의견에서 언급했듯이 타사 모듈을 수정할 필요는 없지만 선택의 여지가없는 것 같습니다. 부끄러운 데, customer_logged_in/out손잡이 너무 강력 수는 있지만,이 한계 때문에 짐을지게됩니다.
pspahn

14

Alan Storm은 다음과 같은 비슷한 질문에 답변했습니다.

/programming//a/5601579/1157493

헬퍼를 사용하여 사용자 정의 로그인 여부를 확인하는 논리를 수행 할 수 있습니다.

<action method="setTemplate">
    <template helper="mymodule/myhelper/switchTemplateIf"/>
</action>

그것은 호출 Mage::helper('mymodule/myhelper')->switchTemplateIf(); 템플릿을 전환하거나 이런 식으로 계속 결정할 수 도우미에서.

나는 그것이 return그 기능에 템플릿을 설정한다고 생각합니다 .

다음과 같이 보일 것입니다.

public function switchTemplateIf() {
    if (Mage::helper('customer')->isLoggedIn()) {
        return 'page/1column.phtml';
    } else {
        return 'page/2column-right.phtml';
    }
}

테스트되지 않은


나는이 생각도 가지고 있었지만 모듈의 추가 클래스에 의존하지 않고 모듈의 레이아웃 XML에만 의존하여 이것을 수행하기를 바랐다. XML에서는 필요하지 않은 경우 추가 모듈 리소스를 만들지 마십시오. "
pspahn

@pspahn 물론 목표는 Magento가 제공하는 XML 레이아웃 시스템을 사용하여 시도하는 것입니다. 불행히도 그것은 한계가 있으며 이것이 그 중 하나라고 생각합니다. 여전히 추가 모듈 리소스에도 불구하고 이것이 완벽하게 실행 가능한 솔루션이라고 생각합니다.
Rick Kuipers

@pspahn Fooman에는 좋은 대안 솔루션이 있습니다. 코딩이 덜 필요합니다!
Rick Kuipers

이 경우 실제로 타사 모듈을 다루고 있습니다. 오히려 모듈을 편집 할 필요가 없으며 (업데이트가 중단 될 수 있기 때문에) 별도의 모듈의 도우미 클래스 (모듈과 모듈을 엉덩이에 묶기 때문에)에 배치하지 않을 것입니다.
pspahn

6

최근에 이런 종류의 기능이 필요했고 기존 레이아웃 핸들의 다양한 조합에 대해 점점 더 많은 레이아웃 핸들을 추가하는 것이 어려워 졌으므로 레이아웃 XML에서 직접 여러 레이아웃 핸들을 대상으로하는 기능을 추가하는 마 젠토 확장을 만들었습니다.

확장에 대한 링크는 다음과 같습니다. https://github.com/mridul89/MultipleHandles.git

당신은 이것을 이렇게 사용할 것입니다-

<customer_logged_out ifhandle="custommodule_customer_info">
    <reference name="root">
        <action method="setTemplate"><template>page/1column.phtml</template></action>
    </reference>
</customer_logged_out>

customer_logged_out레이아웃 핸들이있는 경우 magento에이 특정 레이아웃 핸들 만 사용하도록 지시합니다 custommodule_customer_info.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.