레이아웃 업데이트를위한 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.