Mengapa mengubah templat root tidak berfungsi
Kedua
Mage_Cms_IndexController::indexAction()
dan
Mage_Cms_IndexController::viewAction()
yang bertanggung jawab untuk menampilkan beranda default dan halaman CMS masing-masing memanggil penolong:
Mage::helper('cms/page')->renderPage($this, $pageId)
Jika Anda melompat ke helper (terletak di app / code / core / Mage / Cms / Helper / Page.php) dan mengikuti renderPage()
metode yang dilindungi _renderPage()
Anda akan melihat bahwa Magento memeriksa dua kali untuk templat root (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);
}
dan
if ($page->getRootTemplate()) {
$action->getLayout()->helper('page/layout')
->applyTemplate($page->getRootTemplate());
}
Kedua panggilan terjadi setelah tata letak menangani seperti "cms_page" dan sejenisnya diproses, sehingga Anda kurang beruntung di sini.
Apa yang dapat Anda lakukan untuk mengubah templat root
Ada acara cms_page_render
yang dapat Anda gunakan untuk menambahkan pegangan tata letak XML Anda sendiri di halaman CMS. Buat ekstensi Anda sendiri (saya akan berikan detail di sini) dan konfigurasikan pengamat acara di 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>
Tambahkan pengamat acara Anda:
<?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;
}
}
Terakhir, tambahkan tata letak XML baru Anda (misalnya di Anda 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>
Anda dapat menggunakan metode ini juga untuk menambahkan cms_page_view_after
pegangan atau membuat pegangan khusus halaman saat cms_page_render
meneruskan $page
objek ke pengamat Anda.
Mengapa Anda tidak dapat menambahkan blok ke 'referensi kiri'
Apakah Anda yakin bahwa template yang Anda gunakan memiliki kolom kiri? Pertanyaan ini mungkin terdengar konyol tetapi tata letak "2 kolom dengan bilah kanan" default misalnya hanya menawarkan area 'konten' dan 'kanan'. Saya dapat menambahkan blok ke kolom kanan menggunakan cms_page
tanpa masalah sehingga ini bisa menjadi masalah.
Secara umum, Anda hanya dapat dengan mudah menambahkan blok ke referensi dan mengulanginya jika
- templat root yang dipilih menggunakan blok yang Anda referensikan (lihat
app/design/frontend/base/default/template/page/*.phtml
) dan
- blok yang Anda referensikan adalah tipe
core/text_list
, panggilan $this->getChildhtml()
tanpa argumen atau melakukan hal lain untuk menggemakan semua blok anak.
Tanpa perincian lebih lanjut, saya tidak bisa memberi tahu Anda mengapa blok Anda tidak digaungkan di kolom kiri atau kanan.
$cmsPageId = '_' . str_replace('-', '_', $observer->getEvent()->getPage()->getIdentifier());
Jika seseorang mengubah URL halaman cms, fungsi handle tidak akan. Idealnya, bidang untuk 'kunci halaman' akan ada pada halaman CMS di sistem admin, lalu url halaman, nama dll dapat diubah dan kunci dapat tetap sama.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
dan kemudian di area isinya, kolom kiri ditambahkan menggunakan markup HTML (beralih WYSIWYG ke tampilan sumber)
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"
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.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
Lebih penting lagi adalah urutan tata letak pegangan ditambahkan
Seperti yang Anda lihat dalam gambar di atas,
page_two_columns_right
pegangan ditambahkan setelah itucms_index_index
pegangan. Ini berarti jika Anda menambahkan kode pembaruan xml pembaruan untuk mengubah template dicms_index_index
kode Anda akan berjalan, tetapi kemudian pembaruan kode pembaruan xml dipage_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 sebelumloadLayoutUpdates
dipanggil, dan akan membiarkan Anda memasukkan nama pegangan tambahan, atau menghapus nama pegangan yang ada.sumber
default
pegangan, maka tata letak yang diatur di admin masih akan menang (yaitupage_two_columns_right
masih akan berjalan kemudian). Juga, Re: terminologi - Anda tidak mengesampingkan gagang, gagang Anda selalu hidup berdampingan dengan yang lain - itu hanya urutan yang dijalankan pada efek hasil akhirnya.