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)

ถ้าคุณกระโดดเข้าไปในผู้ช่วยเหลือ (อยู่ที่แอพ / รหัส / 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_renderที่คุณสามารถใช้สำหรับเพิ่มการจัดการเค้าโครง XML ของคุณเองในหน้า CMS สร้างส่วนขยายของคุณเอง (ฉันจะสำรองรายละเอียดไว้ที่นี่) และกำหนดค่าตัวสังเกตเหตุการณ์ในของคุณ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()); ถ้ามีคนเปลี่ยน URL ของหน้า cms ​​ฟังก์ชันการจัดการจะไม่ โดยปกติจะมีฟิลด์สำหรับ 'รหัสหน้า' อยู่บนหน้า 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ให้ขอ ( คลิกเพื่อดูภาพขนาดเต็ม )

กราฟกำกับที่สร้างขึ้นด้วย Commerce Bug

เกี่ยวกับการตั้งค่าเทมเพลตหากคุณดูที่แหล่งที่มาสำหรับรายการแบบหล่นลง

<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);
    }  
    //...
}

ที่สำคัญกว่านั้นคือลำดับที่เพิ่มการจัดการเลย์เอาต์

จัดการ Tab of Commerce Bug

ที่คุณสามารถดูในภาพข้างต้น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นี้ถูกเรียกใช้และจะช่วยให้คุณเลื่อนชื่อหมายเลขอ้างอิงเพิ่มเติมหรือลบชื่อหมายเลขอ้างอิงที่มีอยู่


ขอบคุณอลันความคิดเห็นของคุณเกี่ยวกับการเพิ่มบล็อกลงในหน้า cms ​​ทำให้เข้าใจได้อย่างสมบูรณ์ ฉันมักจะตั้งค่าเทมเพลตสำหรับหน้าเว็บที่แตกต่างกันโดยใช้ xml handle ที่ Magento ให้ไว้ ความเข้าใจที่ดีขึ้นเล็กน้อยเกี่ยวกับหน้า cms ​​ของฉันทำให้ชัดเจนขึ้นว่าทำไมฉันมีปัญหาในการใช้การอ้างอิงสำหรับหน้า cms ฉันต้องแน่ใจว่าหมายเลขอ้างอิงเริ่มต้นใน page.xml ของฉันมีเค้าโครงที่ถูกต้องสำหรับหน้า cms ดูเหมือนว่าฉันคัดสรรที่จับนั้นเพราะฉันมักจะยกมือไปที่อื่น ถูกต้องหรือไม่ ฉันขอถามคุณได้อย่างไรว่าคุณสร้างกราฟและเครื่องมือที่คุณใช้เพื่อดูหมายเลขอ้างอิงสำหรับคำขอเฉพาะหรือไม่
Mark Weston

2
@ MarkWeston ไดอะแกรมและจัดการ UI บางอย่างจาก Commerce Bug ซึ่งเป็นเครื่องมือแก้ไขข้อบกพร่องเชิงพาณิชย์ที่ฉันสร้างและขาย (ดู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.