Пользовательский шаблон для статических блоков на странице CMS?

8

Я искал в Интернете и не мог найти, как это сделать.

Я хочу добавить статический блок, который я создал ранее в admin, на cms-страницу. Это работает с использованием любой из этих строк:

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

Теперь я хочу использовать пользовательский шаблон, а именно:

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

Когда я помещаю это в cms-страницу таким образом, блок показывается, но тег "template" полностью игнорируется - cms/content.phtmlиспользуется.

ЧТО Я ПОПЫТАЛ,
я попытался расширить класс Mage_Block_Cms_Block и добавить setTemplate($this->getTemplate());к _toHtml()-функции. Эффект тот же, что и выше - cms/content.phtmlиспользуется.

Я пытался расширить класс Mage_Core_Block_Template; Конечно, я могу установить шаблон здесь, но у меня проблемы с получением статического блока. Я не могу найти, как получить блок по идентификатору блока.

ЧТО ЭТОТ ВОПРОС О / НЕ О
Я знаю, как сделать это с PHP.
Я знаю, как это сделать с XML-файлами.
Для этого вопроса крайне важно, чтобы с блоками можно было управлять.

Я использую Magento CE 1.7.0.0.

Спасибо за ваше время!

simonthesorcerer
источник

Ответы:

8

Вы не можете изменить шаблон для статического блока, потому что у статического блока нет шаблона. Посмотрите на метод: Mage_Cms_Block_Block::_toHtml(). Этот _toHtml()метод используется для визуализации любого объекта блока, а в случае блоков cms он отображает только содержимое блока.

Если вы хотите обернуть содержимое любого блока cms в какую-то разметку, вы можете попробовать это:

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

И в файле custom/block.phtmlсделать это:

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

Я надеюсь, что это то, что вам нужно.

Мариус
источник
1
Хорошее решение, никогда не думал об этом таким образом. Тем не менее, не будет ли создание виджета более подходящим? В любом случае +1
Сандер Мангел
Я предполагаю, что он может работать с виджетом, но это означает, что все блоки cms, отображаемые через виджет, будут иметь одинаковую разметку вокруг него. Таким образом, вы можете иметь разные шаблоны для разных статических блоков. Если вы хотите, чтобы все отображались одинаково, думаю, подход с использованием виджетов должен быть достаточным.
Мариус
3

Вы пробовали с cms/widget_block? Этот блок простирается от Mage_Core_Model_Template, так что может быть возможно сделать то, что вы пытаетесь сделать.

fmrng
источник