레이아웃 업데이트를위한 CMS XML 핸들


13

cms 핸들을 사용하여 cms 페이지의 레이아웃을 업데이트하려고 시도한 몇 가지 시나리오가 있습니다. 예를 들어 루트를 참조하고 페이지 템플릿을 설정하는 cms_index_index 핸들을 사용하려고했습니다. 이것은 실패했고 홈페이지 cms 페이지 표시 설정에서 직접 관리자 시스템을 통해이 레이아웃을 업데이트해야했습니다.

또한 cms_page 핸들을 사용하여 왼쪽을 참조 할 블록을 추가하려고했습니다. 다시 이것은 실패했고 관리자 시스템을 통해 레이아웃 업데이트를 구현해야했습니다.

cms 페이지에 루트 템플릿을 할당 할 수 없다는 것을 읽었습니다. 맞습니까? 누군가가 이유를 설명 할 수 있습니까?

또한 cms 핸들을 사용하여 왼쪽, 오른쪽, 루트 등과 같은 표준 참조를 사용할 수있는 방법이 있는지 궁금했습니다. 나는 머리와 내용과 같은 것들을 잘 참조 할 수있는 것 같습니다.

답변:


20

루트 템플릿을 변경해도 작동하지 않는 이유

양자 모두

Mage_Cms_IndexController::indexAction()

Mage_Cms_IndexController::viewAction()

기본 홈페이지와 CMS 페이지를 각각 표시하는 것은 헬퍼를 호출합니다.

Mage::helper('cms/page')->renderPage($this, $pageId)

헬퍼 (app / code / core / Mage / Cms / Helper / Page.php에 위치) renderPage()로 이동하여 보호 된 방법 _renderPage()을 따르면 Magento가 루트 템플릿 (Magento CE 1.7)을 두 번 확인하고 있음을 알 수 있습니다. 0.2) :

if ($page->getRootTemplate()) {
    $handle = ($page->getCustomRootTemplate()
                && $page->getCustomRootTemplate() != 'empty'
                && $inRange) ? $page->getCustomRootTemplate() : $page->getRootTemplate();
    $action->getLayout()->helper('page/layout')->applyHandle($handle);     
}

if ($page->getRootTemplate()) {
    $action->getLayout()->helper('page/layout')
        ->applyTemplate($page->getRootTemplate());
}

두 호출 모두 "cms_page"와 같은 레이아웃 핸들이 처리 된 후에 발생하므로 운이 나쁘다.

루트 템플릿을 변경하기 위해 수행 할 수있는 작업

cms_page_renderCMS 페이지에 고유 한 XML 레이아웃 핸들을 추가하는 데 사용할 수 있는 이벤트 가 있습니다. 자신 만의 확장 프로그램을 만들고 (여기에 자세한 내용은 아끼지 않겠습니다) 다음에서 이벤트 관찰자를 구성하십시오 config.xml.

<?xml version="1.0"?>
<config>
    <modules>
        <Emzee_Cms>
            <version>0.0.1</version>
        </Emzee_Cms>
    </modules>

    <global>
        <events>
            <cms_page_render>
                <observers>
                    <emzee_cms_page_render>
                        <class>emzee_cms/observer</class>
                        <method>cms_page_render</method>
                    </emzee_cms_page_render>
                </observers>
            </cms_page_render>
        </events>
        <models>
            <emzee_cms>
                <class>Emzee_Cms_Model</class>
            </emzee_cms>
        </models>
    </global>
</config>

이벤트 관찰자를 추가하십시오.

<?php

class Emzee_Cms_Model_Observer
{
    public function cms_page_render(Varien_Event_Observer $observer)
    {
        $action = $observer->getEvent()->getControllerAction();

        $actionName = strtolower($action->getFullActionName());
        $action->getLayout()->getUpdate()
            ->addHandle($actionName . '_after');
        return $this;
    }
}

마지막으로 새로운 레이아웃 XML 핸들을 추가하십시오 (예 :) local.xml.

<?xml version="1.0"?>
<layout version="0.1.0">
    <cms_index_index_after>
        <reference name="root">
            <action method="setTemplate"><template>page/1column.phtml</template></action>
        </reference>
    </cms_index_index_after>
</layout>

이 방법을 사용 하여 개체를 관찰자에게 전달할 때 cms_page_view_after핸들 을 추가 하거나 페이지 특정 핸들을 만들 수 있습니다.cms_page_render$page

'참조 왼쪽'에 블록을 추가 할 수없는 이유

사용중인 템플릿에 왼쪽 열이 있습니까? 이 질문은 어리석게 들릴 수도 있지만 기본 "오른쪽 막대가있는 2 열"레이아웃은 '콘텐츠'와 '오른쪽'영역 만 제공합니다. cms_page문제없이 사용하여 오른쪽 열에 블록을 추가 할 수 있으므로 문제가 될 수 있습니다.

일반적으로, 참조에 블록을 쉽게 추가하고

  • 선택한 루트 템플릿은 참조하는 블록을 사용합니다 (참조 app/design/frontend/base/default/template/page/*.phtml).
  • 당신이 중 하나를 참조하고있는 블록 타입이다 core/text_list, 호출 $this->getChildhtml()인수없이 또는 모든 자식 블록을 반향하는 다른 작업을 수행.

더 자세한 정보가 없으면 왼쪽 또는 오른쪽 열에 블록이 에코되지 않는 이유를 알 수 없습니다.


안녕 마티아스. 이벤트 옵저버 추가를 제안 해 주셔서 감사합니다. 개발자 중 한 명과 함께 살펴보고 이것이 제대로 작동하는지 확인하겠습니다. 이것이 답이 될 수 있습니다! @Alan은 cms 페이지에 올바른 기본 템플릿을 설정하고 핸들이 무시된다는 사실에 대해서도 비슷한 지적을했습니다. 정보 주셔서 감사합니다, 나는 지금 알아 낸 것 같아요.
Mark Weston

안녕하세요. 이것을 테스트하면 작동합니다. 또한 페이지 특정 핸들에 대해 테스트했지만 작동하지만 변경되지 않는 페이지의 식별자가 필요하므로 가장 좋은 해결책은 아닙니다. 테스트로 페이지 식별자를 사용했습니다. $cmsPageId = '_' . str_replace('-', '_', $observer->getEvent()->getPage()->getIdentifier()); 누군가가 cms 페이지의 URL을 변경하면 핸들이 작동하지 않습니다. 관리 시스템의 CMS 페이지에 '페이지 키'필드가있는 것이 이상적이며, 페이지 URL, 이름 등을 변경하고 키를 동일하게 유지할 수 있습니다.
Mark Weston

14

과 관련하여 "사용하여 블록을 추가 할 수 없습니다 <reference name="left/>, 당신이 당신의 CMS 페이지를 기본 홈 페이지를 고려할 경우 젠토 샘플 데이터와 함께 제공, 것을 예를 들어 왼쪽라는 이름의 블록?이 확실 나타납니다 블록라는 것으로를 왼쪽.

왼쪽 열입니까?

그러나 백엔드에서 페이지를 보면 루트 템플릿을 사용하도록 설정되어 있음을 알 수 있습니다

`2 columns with right bar`    

그런 다음 컨텐츠 영역에서 왼쪽 열이 HTML 마크 업을 사용하여 추가됩니다 (WYSIWYG를 소스보기로 전환)

<div class="col-left side-col">
<p class="home-callout"><a href="{{store direct_url="apparel/shoes/womens/anashria-womens-premier-leather-sandal.html"}}"><img src="{{skin url='images/ph_callout_left_top.gif'}}" alt="" border="0" /></a></p>
<p class="home-callout"><img src="{{skin url='images/ph_callout_left_rebel.jpg'}}" alt="" border="0" /></p>
{{block type="tag/popular" template="tag/popular.phtml"}}</div>

이 방향 그래프를 사용하면 이름이 지정된 블록이 없습니다 left( 전체 크기의 이미지를 보려면 클릭 )

커머스 버그로 생성 된 유향 그래프

템플릿 설정과 관련하여 '레이아웃'드롭 ​​다운의 소스를 보면

<select id="page_root_template" name="root_template" class=" required-entry select">
    <option value="empty">Empty</option>
    <option value="one_column">1 column</option>
    <option value="two_columns_left">2 columns with left bar</option>
    <option value="two_columns_right" selected="selected">2 columns with right bar</option>
    <option value="three_columns">3 columns</option>
</select>

이 필드를 설정하는 때 볼 수 있습니다, 저장하기 실제 값은 같은 것입니다 one_column, two_columns_left같은 이름의 레이아웃 핸들에이 값은 corespond 등.

#File: app/design/frontend/default/modern/layout/page.xml
<page_one_column translate="label">
    <label>All One-Column Layout Pages</label>
    <reference name="root">
        <action method="setTemplate"><template>page/1column.phtml</template></action>
        <!-- Mark root page block that template is applied -->
        <action method="setIsHandle"><applied>1</applied></action>
        <action method="setLayoutCode"><name>one_column</name></action>
    </reference>
</page_one_column>
...
<page_two_columns_left translate="label">
    <label>All Two-Column Layout Pages (Left Column)</label>
    <reference name="root">
        <action method="setTemplate"><template>page/2columns-left.phtml</template></action>
        <!-- Mark root page block that template is applied -->
        <action method="setIsHandle"><applied>1</applied></action>
        <action method="setLayoutCode"><name>two_columns_left</name></action>
    </reference>
</page_two_columns_left>

Magento는 CMS 페이지를 렌더링 할 때 저장된 값을 참조하고 해당 레이아웃 핸들을 페이지에 추가합니다. 질문에 접하는 동안 여기에 해당 핸들이 추가됩니다

#File: app/code/core/Mage/Cms/Helper/Page.php
protected function _renderPage(Mage_Core_Controller_Varien_Action  $action, $pageId = null, $renderLayout = true)
{
    //...
    $action->addActionLayoutHandles();        
    if ($page->getRootTemplate()) {
        $handle = ($page->getCustomRootTemplate()
                    && $page->getCustomRootTemplate() != 'empty'
                    && $inRange) ? $page->getCustomRootTemplate() : $page->getRootTemplate();
        $action->getLayout()->helper('page/layout')->applyHandle($handle);
    }  
    //...
}

더 중요한 것은 레이아웃 핸들이 추가되는 순서 입니다.

상거래 탭 버그 처리

위의 스크린 샷에서 볼 수 있듯이, page_two_columns_right핸들이 추가 된 cms_index_index 핸들입니다. 즉, 레이아웃 xml 업데이트 코드를 추가 cms_index_index하여 코드 에서 템플릿을 변경 하면 레이아웃 업데이트 xml 코드 page_two_columns_right가 실행됩니다.

나는 이것이 사용자 인터페이스에 설정된 템플릿이 항상 올바른지 확인하기 위해 의도적으로 설계된 것이라고 생각했습니다 . 이전 버전의 Magento <action method="setIsHandle"><applied>1</applied></action>에서는 동일한 이유로 메서드 호출이 존재 한 것으로 보입니다.

따라서 순수한 레이아웃 XML 코드를 사용하여 원하는 것을 수행 할 수있는 방법이 없습니다. 사용자 정의 모듈 및 관찰자 코드를 작성하는 데 익숙하다면 cms_page_render이벤트 를 살펴보십시오 . 이것은 loadLayoutUpdates호출 되기 직전에 발생 하며 추가 핸들 이름을 밀어 넣거나 기존 핸들 이름을 제거 할 수 있습니다.


감사합니다 Alan, cms 페이지에 블록을 추가하는 것에 대한 귀하의 의견은 완벽합니다. 나는 보통 Magento가 제공하는 다양한 XML 핸들을 사용하여 다른 페이지에 대한 템플릿을 설정합니다. cms 페이지를 조금 더 잘 이해하면 cms 페이지에 대한 참조 사용에 문제가있는 이유가 더 명확 해졌습니다. 내 page.xml의 기본 핸들에 cms 페이지의 올바른 레이아웃이 있는지 확인해야합니다. 나는 보통 그 핸들을 다른 곳에서 덮어 씌우기 때문에 그 핸들 위에 광택이있는 것 같습니다. 그 맞습니까? 그래프를 생성 한 방법과 특정 요청에 대한 핸들을 보는 데 사용하는 도구를 물어볼 수 있습니까?
Mark Weston

2
@MarkWeston 내가 만든 상용 디버깅 도구 인 Commerce Bug의 다이어그램과 일부 UI를 처리합니다. (자세한 내용은 alanstorm.com/find_magento_block_name 참조) 핸들에 대한 귀하의 질문을 잘 모르겠지만 핸들에 템플릿을 default설정하면 관리자가 설정 한 레이아웃이 여전히 이깁니다 (즉, page_two_columns_right여전히 실행됩니다) 나중). 또한 Re : 용어-핸들을 재정의하지 않고 핸들이 항상 다른 핸들과 공존합니다. 실행 순서는 최종 결과에 영향을줍니다.
Alan Storm

건배 앨런. 템플릿을 재정의하지 않도록 설정하기 위해 핸들을 사용하는 것에 대해 당신이 의미하는 바를 알았습니다. Commerce Bug에 대한 정보를 주셔서 감사합니다.
Mark Weston
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.