Mengenai "Anda tidak dapat menambahkan blok menggunakan <reference name="left
/>, apakah Anda yakin halaman CMS Anda memiliki blok bernama kiri? Misalnya, jika Anda mempertimbangkan halaman beranda default yang dikirimkan dengan data sampel Magento, tampaknya memiliki blok bernama kiri.
Namun, jika Anda melihat halaman di backend, Anda dapat melihatnya diatur untuk menggunakan templat root
`2 columns with right bar`
dan kemudian di area isinya, kolom kiri ditambahkan menggunakan markup HTML (beralih WYSIWYG ke tampilan sumber)
<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>
Grafik terarah ini memperjelas tidak ada blok yang disebut left
untuk dihubungkan ( klik untuk gambar berukuran penuh )
Mengenai pengaturan template, jika Anda melihat sumber untuk drop-down "Layout"
<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>
Anda dapat melihat ketika Anda menetapkan bidang ini, nilai aktual diselamatkan adalah sesuatu seperti one_column
, two_columns_left
, dll Nilai-nilai ini corespond menangani tata letak dengan nama yang sama.
#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>
Saat Magento merender halaman CMS, itu mereferensikan nilai yang disimpan, dan menambahkan pegangan tata letak yang sesuai ke halaman. Meskipun ini bersinggungan dengan pertanyaan, pegangan itu ditambahkan di sini
#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);
}
//...
}
Lebih penting lagi adalah urutan tata letak pegangan ditambahkan
Seperti yang Anda lihat dalam gambar di atas, page_two_columns_right
pegangan ditambahkan setelah itu cms_index_index
pegangan. Ini berarti jika Anda menambahkan kode pembaruan xml pembaruan untuk mengubah template di cms_index_index
kode Anda akan berjalan, tetapi kemudian pembaruan kode pembaruan xml di page_two_columns_right
akan berjalan setelahnya.
Saya selalu curiga ini dengan desain untuk memastikan template yang diatur dalam antarmuka pengguna selalu benar. Dalam versi Magento sebelumnya <action method="setIsHandle"><applied>1</applied></action>
pemanggilan metode tampaknya ada karena alasan yang sama.
Jadi, tidak ada cara untuk melakukan apa yang Anda inginkan menggunakan kode xml tata letak murni. Jika Anda merasa nyaman dengan membuat modul khusus dan kode pengamat, lihatlah cms_page_render
acara tersebut. Kebakaran ini tepat sebelum loadLayoutUpdates
dipanggil, dan akan membiarkan Anda memasukkan nama pegangan tambahan, atau menghapus nama pegangan yang ada.