CMS XML Xử lý cập nhật bố cục


13

Tôi đã có một vài tình huống trong đó tôi đã cố gắng sử dụng tay cầm cms để cập nhật bố cục của trang cms. Ví dụ: tôi đã cố gắng sử dụng cms_index_index xử lý gốc tham chiếu và đặt mẫu trang. Điều này không thành công và tôi đã phải thực hiện cập nhật bố cục này thông qua hệ thống quản trị trực tiếp trên cài đặt hiển thị trang cms của trang chủ.

Tôi cũng đã cố gắng thêm một khối để tham chiếu bên trái bằng cách sử dụng tay cầm cms_page. Một lần nữa điều này thất bại và tôi đã phải thực hiện cập nhật bố cục thông qua hệ thống quản trị.

Tôi đã đọc rằng bạn không thể chỉ định một mẫu gốc cho các trang cms. Điều đó có đúng không và có ai có thể giải thích tại sao không?

Tôi cũng tự hỏi liệu có cách nào để kích hoạt tay cầm cms để sử dụng các tham chiếu tiêu chuẩn như trái, phải, root, v.v.? Tôi dường như có thể tham khảo những thứ như đầu và nội dung tốt.

Câu trả lời:


20

Tại sao thay đổi mẫu gốc không hoạt động

Cả hai

Mage_Cms_IndexController::indexAction()

Mage_Cms_IndexController::viewAction()

chịu trách nhiệm hiển thị trang chủ mặc định và trang CMS tương ứng gọi một người trợ giúp:

Mage::helper('cms/page')->renderPage($this, $pageId)

Nếu bạn nhảy vào trình trợ giúp (nằm ở app / code / core / Mage / Cms / Helper / Page.php) và làm theo renderPage()phương pháp được bảo vệ, _renderPage()bạn sẽ thấy Magento đang kiểm tra hai lần cho một mẫu gốc (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());
}

Cả hai cuộc gọi xảy ra sau khi xử lý bố cục như "cms_page" và tương tự được xử lý, vì vậy bạn không gặp may ở đây.

Bạn có thể làm gì để thay đổi mẫu gốc

Có một sự kiện cms_page_rendermà bạn có thể sử dụng để thêm xử lý bố cục XML của riêng mình trên các trang CMS. Tạo tiện ích mở rộng của riêng bạn (Tôi sẽ tiết kiệm một số chi tiết tại đây) và định cấu hình trình quan sát sự kiện trong 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>

Thêm người quan sát sự kiện của bạn:

<?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;
    }
}

Cuối cùng, thêm tay cầm XML bố trí mới của bạn (ví dụ: trong của bạn 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>

Bạn cũng có thể sử dụng phương pháp này để thêm một cms_page_view_afterđiều khiển hoặc tạo các điều khiển cụ thể của trang khi cms_page_renderchuyển $pageđối tượng đến người quan sát của bạn.

Tại sao bạn không thể thêm một khối vào 'tham chiếu bên trái'

Bạn có chắc chắn rằng mẫu bạn đang sử dụng có một cột bên trái? Câu hỏi này nghe có vẻ ngớ ngẩn, nhưng bố cục "2 cột với thanh bên phải" mặc định chỉ cung cấp một khu vực 'nội dung' và 'bên phải'. Tôi có thể thêm các khối vào cột bên phải bằng cách sử dụng cms_pagemà không gặp vấn đề gì vì vậy đây có thể là vấn đề.

Nói chung, bạn chỉ có thể dễ dàng thêm các khối vào tham chiếu và lặp lại chúng nếu

  • mẫu gốc được chọn sử dụng khối bạn đang tham khảo (xem app/design/frontend/base/default/template/page/*.phtml) và
  • khối bạn đang tham chiếu là loại core/text_list, gọi $this->getChildhtml()mà không có đối số hoặc làm gì khác để lặp lại tất cả các khối con.

Nếu không có thêm thông tin chi tiết, tôi không thể cho bạn biết lý do tại sao các khối của bạn không lặp lại ở cột bên trái hoặc bên phải.


Xin chào Matthias. Cảm ơn lời đề nghị thêm người quan sát sự kiện, tôi sẽ xem xét một trong những nhà phát triển của chúng tôi và xem điều này có hiệu quả không. Đây có thể là câu trả lời! @Alan cũng đưa ra quan điểm tương tự về việc đặt mẫu mặc định chính xác cho các trang cms và thực tế các thẻ điều khiển bị ghi đè. Cảm ơn về thông tin là tốt, tôi nghĩ rằng tôi đã tìm ra bây giờ.
Mark Weston

Chào. Đã thử nghiệm điều này và nó hoạt động. Cũng đã thử nghiệm nó cho các xử lý cụ thể của trang và nó hoạt động, nhưng đó không phải là giải pháp tốt nhất vì tôi cần một mã định danh cho các trang không bị thay đổi. Như một thử nghiệm tôi đã sử dụng định danh trang $cmsPageId = '_' . str_replace('-', '_', $observer->getEvent()->getPage()->getIdentifier()); Nếu ai đó thay đổi URL của trang cms, chức năng xử lý sẽ không hoạt động. Lý tưởng nhất là một trường cho 'khóa trang' sẽ tồn tại trên trang CMS trong hệ thống quản trị, sau đó url trang, tên vv có thể được thay đổi và khóa có thể được giữ nguyên.
Mark Weston

14

Về "bạn không thể thêm một khối bằng <reference name="left/>, bạn có chắc rằng trang CMS của bạn có một khối được đặt tên trái không? Ví dụ: nếu bạn xem xét trang chủ mặc định gửi kèm dữ liệu mẫu Magento, nó dường như có một khối được đặt tên trái.

đó là một cột bên trái?

Tuy nhiên, nếu bạn nhìn vào trang trong phần phụ trợ, bạn có thể thấy nó được đặt để sử dụng mẫu gốc

`2 columns with right bar`    

và sau đó trong khu vực nội dung của nó, cột bên trái được thêm bằng cách sử dụng đánh dấu HTML (chuyển WYSIWYG sang chế độ xem nguồn)

<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>

Biểu đồ có hướng này cho thấy rõ không có khối nào được đặt tên left( nhấp vào hình ảnh có kích thước đầy đủ )

đồ thị có hướng được tạo bằng Bug thương mại

Về việc đặt mẫu, nếu bạn nhìn vào nguồn cho trình đơn "Bố cục" thả xuống

<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>

Bạn có thể nhìn thấy khi bạn đang thiết lĩnh vực này, giá trị thực tế việc tiết kiệm được là một cái gì đó giống như one_column, two_columns_leftvv Những giá trị corespond để xử lý bố trí cùng tên.

#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>

Khi Magento hiển thị trang CMS, nó tham chiếu các giá trị đã lưu và thêm xử lý bố cục thích hợp vào trang. Trong khi nó tiếp tuyến với câu hỏi, xử lý đó được thêm vào đây

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

Quan trọng hơn là thứ tự các tay cầm bố trí được thêm vào

Thẻ xử lý lỗi thương mại

Như bạn có thể nhìn thấy trong ảnh chụp màn hình trên, page_two_columns_rightxử lý được thêm vào sau khi các cms_index_indextay cầm. Điều này có nghĩa là nếu bạn thêm mã cập nhật bố trí xml để thay đổi mẫu trong cms_index_indexmã của bạn sẽ chạy, nhưng sau đó, mã xml cập nhật bố cục page_two_columns_rightsẽ chạy sau nó.

Tôi luôn nghi ngờ điều này là do thiết kế để đảm bảo mẫu được đặt trong giao diện người dùng luôn chính xác. Trong phiên bản trước của Magento, <action method="setIsHandle"><applied>1</applied></action>cuộc gọi phương thức dường như đã tồn tại vì những lý do tương tự.

Vì vậy, không có cách nào để làm những gì bạn muốn bằng cách sử dụng mã xml bố cục thuần túy. Nếu bạn cảm thấy thoải mái với việc tạo các mô-đun tùy chỉnh và mã người quan sát, thì hãy xem xét cms_page_rendersự kiện. Điều này kích hoạt ngay trước khi loadLayoutUpdatesđược gọi và sẽ cho phép bạn trượt một tên xử lý bổ sung vào hoặc xóa tên xử lý hiện có.


Cảm ơn Alan, ý kiến ​​của bạn về việc thêm các khối vào trang cms hoàn toàn có ý nghĩa. Tôi thường đặt mẫu cho các trang khác nhau bằng các tay cầm xml khác nhau mà Magento cung cấp. Sự hiểu biết tốt hơn một chút của tôi về các trang cms đã làm rõ hơn lý do tại sao tôi gặp vấn đề khi sử dụng tài liệu tham khảo cho các trang cms. Tôi cần đảm bảo rằng trình xử lý mặc định trong tệp XML của tôi có bố cục chính xác cho các trang cms. Có vẻ như tôi đã che đậy điều khiển đó, bởi vì tôi thường đánh giá cao nó ở nơi khác. Đúng không? Tôi có thể hỏi cách bạn tạo biểu đồ và công cụ nào bạn đang sử dụng để xem tay cầm cho một yêu cầu cụ thể không?
Mark Weston

2
@MarkWeston Các sơ đồ và xử lý UI một số từ Commerce Bug, một công cụ gỡ lỗi thương mại tôi đã tạo và bán. (xem alanstorm.com/find_magento_block_name để biết chi tiết) Tôi không chắc chắn tôi hiểu câu hỏi của bạn về xử lý, nhưng nếu bạn đang thiết lập một mẫu trong defaultxử lý, sau đó tập bố trí trong quản trị sẽ vẫn giành chiến thắng (tức là page_two_columns_rightsẽ vẫn chạy một lát sau). Ngoài ra, Re: thuật ngữ - bạn không ghi đè các điều khiển, các điều khiển của bạn luôn cùng tồn tại với các điều khoản khác - đó chỉ là thứ tự chúng chạy trong hiệu ứng kết quả cuối cùng.
Alan Storm

Chúc mừng Alan. Tôi hiểu ý của bạn về việc gọi sử dụng tay cầm để đặt mẫu không phải là ghi đè - điểm tốt. Cảm ơn thông tin về Bug thương mại.
Mark Weston
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.