Modelo personalizado para blocos estáticos na página CMS?

8

Pesquisei na web e não consegui encontrar como fazer isso.

Quero adicionar um bloco estático que eu criei no admin antes a uma página do cms. Isso funciona usando uma destas linhas:

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

Agora eu quero usar um modelo personalizado, ou seja:

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

Quando o coloco na página cms assim, o bloco é mostrado, mas o "template" -tag é completamente ignorado - cms/content.phtmlé usado.

O que
tentei Tentei estender a classe Mage_Block_Cms_Block e adicionar setTemplate($this->getTemplate());à _toHtml()função O efeito é o mesmo que acima - cms/content.phtmlé usado.

Eu tentei estender a classe Mage_Core_Block_Template; é claro que posso definir um modelo aqui, mas tenho problemas para obter o bloco estático. Não consigo encontrar como obter o bloco pela identificação do bloco.

O QUE É ESTA PERGUNTA / NÃO SOBRE
Eu sei como fazer isso com PHP.
Eu sei como fazer isso com arquivos XML.
É crucial para essa pergunta que os blocos possam ser gerenciados no back-end.

Eu corro o Magento CE 1.7.0.0.

Obrigado pelo seu tempo!

simonthesorcerer
fonte

Respostas:

8

Você não pode alterar o modelo para um bloco estático porque o bloco estático não possui um modelo. Dê uma olhada no método: Mage_Cms_Block_Block::_toHtml(). O _toHtml()método é usado para renderizar qualquer objeto de bloco e, no caso dos blocos cms, apenas renderiza o conteúdo do bloco.

Se você deseja agrupar o conteúdo de qualquer bloco cms em alguma marcação, tente o seguinte:

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

E no arquivo, custom/block.phtmlfaça o seguinte:

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

Espero que seja isso que você precisava.

Marius
fonte
11
Ótima solução, nunca pensei nisso dessa maneira. Ainda assim, a criação de um widget não seria mais apropriada? De qualquer forma +1
Sander Mangel
Eu acho que poderia funcionar com um widget, mas isso significa que todos os blocos cms renderizados via widget teriam a mesma marcação em torno dele. Dessa forma, você pode ter modelos diferentes para diferentes blocos estáticos. Se você deseja que todos sejam renderizados da mesma forma, acho que a abordagem de widget deve ser suficiente.
Marius
3

Você já tentou cms/widget_block? Esse bloco se estende de Mage_Core_Model_Template, portanto, pode ser possível fazer o que você está tentando fazer.

fmrng
fonte