CMS XML Menangani untuk Pembaruan Layout

13

Saya punya beberapa skenario di mana saya mencoba menggunakan pegangan cms untuk memperbarui tata letak halaman cms. Sebagai contoh saya mencoba menggunakan cms_index_index menangani referensi root dan mengatur template halaman. Ini gagal dan saya harus membuat pembaruan tata letak ini melalui sistem admin langsung pada pengaturan tampilan halaman homepage.

Saya juga mencoba untuk menambahkan blok ke referensi yang tersisa menggunakan pegangan cms_page. Sekali lagi ini gagal dan saya harus mengimplementasikan pembaruan tata letak melalui sistem admin.

Saya telah membaca bahwa Anda tidak dapat menetapkan templat root ke halaman cms. Apakah itu benar dan adakah yang bisa menjelaskan mengapa?

Saya juga bertanya-tanya apakah ada cara untuk mengaktifkan pegangan cms untuk menggunakan referensi standar seperti kiri, kanan, root dll? Saya sepertinya bisa merujuk hal-hal seperti kepala dan konten dengan baik.

Mark Weston
sumber

Jawaban:

20

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_renderyang 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_afterpegangan atau membuat pegangan khusus halaman saat cms_page_rendermeneruskan $pageobjek 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_pagetanpa 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.

Matthias Zeis
sumber
Hai Matthias. Terima kasih atas saran menambahkan pengamat acara, saya akan melihat dengan salah satu devs kami dan melihat apakah ini berhasil. Ini bisa menjadi jawabannya! @Alan juga membuat poin serupa tentang mengatur template default yang benar untuk halaman cms dan fakta pegangannya diganti. Terima kasih atas informasinya juga, saya pikir saya sudah menemukan jawabannya sekarang.
Mark Weston
Hai. Menguji ini dan berhasil. Juga mengujinya untuk menangani halaman tertentu dan itu berfungsi, tetapi itu bukan solusi terbaik karena saya perlu pengidentifikasi untuk halaman yang tidak akan diubah. Sebagai tes saya telah menggunakan pengidentifikasi halaman $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.
Mark Weston
14

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.

apakah itu kolom 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 leftuntuk dihubungkan ( klik untuk gambar berukuran penuh )

grafik terarah yang dihasilkan dengan Commerce Bug

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

Menangani Tab of Commerce Bug

Seperti yang Anda lihat dalam gambar di atas, page_two_columns_rightpegangan ditambahkan setelah itu cms_index_indexpegangan. Ini berarti jika Anda menambahkan kode pembaruan xml pembaruan untuk mengubah template di cms_index_indexkode Anda akan berjalan, tetapi kemudian pembaruan kode pembaruan xml di page_two_columns_rightakan 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_renderacara tersebut. Kebakaran ini tepat sebelum loadLayoutUpdatesdipanggil, dan akan membiarkan Anda memasukkan nama pegangan tambahan, atau menghapus nama pegangan yang ada.

Alan Storm
sumber
Terima kasih Alan, komentar Anda tentang menambahkan blok ke halaman cms masuk akal. Saya biasanya mengatur template untuk halaman yang berbeda menggunakan berbagai pegangan xml yang disediakan Magento. Pemahaman saya sedikit lebih baik tentang halaman cms telah membuatnya lebih jelas mengapa saya mengalami masalah menggunakan referensi untuk halaman cms. Saya perlu memastikan pegangan default di halaman saya. Xml memiliki tata letak yang benar untuk halaman cms. Sepertinya saya sudah mengabaikan pegangan itu, karena saya biasanya menaruhnya di tempat lain. Apakah itu benar? Bisakah saya bertanya bagaimana Anda menghasilkan grafik dan alat apa yang Anda gunakan untuk melihat pegangan untuk permintaan tertentu?
Mark Weston
2
@MarkWeston Diagram dan menangani beberapa UI dari Commerce Bug, alat debugging komersial yang saya buat dan jual. (lihat alanstorm.com/find_magento_block_name untuk detailnya) Saya tidak yakin saya mengerti pertanyaan Anda tentang pegangan, tetapi jika Anda mengatur templat di defaultpegangan, maka tata letak yang diatur di admin masih akan menang (yaitu page_two_columns_rightmasih 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.
Alan Storm
Cheers Alan. Saya melihat apa yang Anda maksud tentang memanggil penggunaan gagang untuk menetapkan templat yang bukan override - poin yang bagus. Terima kasih atas info tentang Commerce Bug.
Mark Weston