Mẫu tùy chỉnh cho các khối tĩnh trong trang CMS?


8

Tôi đã tìm kiếm trên web và không thể tìm thấy làm thế nào để làm điều này.

Tôi muốn thêm một khối tĩnh mà tôi đã tạo trong quản trị viên trước đó vào một trang cms. Điều này hoạt động bằng cách sử dụng một trong hai dòng này:

{{block type="cms/block" block_id="my_block_id"}}
{{block type="cms/block" block_id="my_block_id" template="cms/content.phtml"}}

Bây giờ tôi muốn sử dụng một mẫu tùy chỉnh, tức là:

{{block type="cms/block" block_id="my_block_id" template="modulename/custom-template.phtml"}}

Khi tôi đặt nó vào trang cms như thế này, khối được hiển thị, nhưng -tag "mẫu" hoàn toàn bị bỏ qua - cms/content.phtmlđược sử dụng.

GÌ Tôi cố gắng
tôi đã cố gắng để mở rộng lớp Mage_Block_Cms_Block và thêm setTemplate($this->getTemplate());vào _toHtml()-function. Hiệu quả tương tự như trên - cms/content.phtmlđược sử dụng.

Tôi đã cố gắng mở rộng lớp Mage_Core_Block_Template; tất nhiên tôi có thể đặt mẫu ở đây, nhưng tôi gặp vấn đề khi lấy khối tĩnh. Tôi không thể tìm thấy cách lấy khối theo id.

CÂU HỎI NÀY LÀ GÌ / KHÔNG GIỚI THIỆU
Tôi biết cách làm điều này với PHP.
Tôi biết làm thế nào để làm điều này với các tệp XML.
Điều quan trọng đối với câu hỏi này là các khối có thể được quản lý trong phần phụ trợ.

Tôi chạy Magento CE 1.7.0.0.

Cảm ơn bạn đã dành thời gian!

Câu trả lời:


8

Bạn không thể thay đổi mẫu cho khối tĩnh vì khối tĩnh không có mẫu. Hãy xem phương pháp : Mage_Cms_Block_Block::_toHtml(). Các _toHtml()phương pháp được sử dụng để làm cho bất kỳ đối tượng khối, và trong trường hợp của các khối cms nó chỉ làm cho nội dung của khối.

Nếu bạn muốn bọc nội dung của bất kỳ khối cms nào trong một số đánh dấu, bạn có thể thử điều này:

{{block type="core/template" template="custom/block.phtml" block_id="some_block_id"}}

Và trong tập tin custom/block.phtmllàm điều này:

<?php
$block = Mage::app()->getLayout()->createBlock('cms/block')->setBlockId($this->getBlockId()); //retrieve the cms block with the id set on this layout block
$html = $block->toHtml();//in this var you have the content of the cms block 
?>
<?php if ($html) : //this is needed to avoid additional markup if the cms block is empty?>
<div class="some-class">
    <div class="some-other-class">
        <?php echo $html;//actuall cms block?>
    </div>
</div>
<?php endif;?>

Tôi hy vọng đây là những gì bạn cần.


1
Giải pháp tốt đẹp, không bao giờ nghĩ về nó theo cách này. Tuy nhiên, sẽ không tạo ra một widget phù hợp hơn? Dù sao +1
Sander Mangel

Tôi đoán rằng nó có thể hoạt động với một widget, nhưng điều này có nghĩa là tất cả các khối cm được hiển thị thông qua widget sẽ có cùng một đánh dấu xung quanh nó. Bằng cách này bạn có thể có các mẫu khác nhau cho các khối tĩnh khác nhau. Nếu bạn muốn tất cả được hiển thị giống nhau, tôi đoán cách tiếp cận widget là đủ.
Marius

3

Bạn đã thử với cms/widget_block? Khối này mở rộng từ Mage_Core_Model_Template, vì vậy có thể làm những gì bạn đang cố gắng làm.

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.