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.
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 đủ )
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_left
vv 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
Như bạn có thể nhìn thấy trong ảnh chụp màn hình trên, page_two_columns_right
xử lý được thêm vào sau khi các cms_index_index
tay 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_index
mã của bạn sẽ chạy, nhưng sau đó, mã xml cập nhật bố cục page_two_columns_right
sẽ 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_render
sự 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ó.