과 관련하여 "사용하여 블록을 추가 할 수 없습니다 <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
호출 되기 직전에 발생 하며 추가 핸들 이름을 밀어 넣거나 기존 핸들 이름을 제거 할 수 있습니다.