¿Plantilla personalizada para bloques estáticos en la página CMS?

8

Busqué en la web y no pude encontrar cómo hacerlo.

Quiero agregar un bloque estático que he creado en admin antes a una página cms. Esto funciona usando cualquiera de estas líneas:

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

Ahora quiero usar una plantilla personalizada, es decir:

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

Cuando lo pongo en la página cms de esta manera, se muestra el bloque, pero cms/content.phtmlse usa la etiqueta "plantilla" que se ignora por completo .

LO QUE INTENTÉ
Intenté extender la clase Mage_Block_Cms_Block y agregar setTemplate($this->getTemplate());a _toHtml()-function. El efecto es el mismo que el anterior: cms/content.phtmlse utiliza.

Traté de extender la clase Mage_Core_Block_Template; Por supuesto, puedo configurar una plantilla aquí, pero tengo problemas para obtener el bloque estático. No puedo encontrar cómo obtener el bloque por id de bloque.

DE QUÉ SE TRATA ESTA PREGUNTA / NO SOBRE
Yo sé cómo hacer esto con PHP.
Sé cómo hacer esto con archivos XML.
Es crucial para esta pregunta que los bloques se puedan administrar en el backend.

Ejecuto Magento CE 1.7.0.0.

¡Gracias por tu tiempo!

simonthesorcerer
fuente

Respuestas:

8

No puede cambiar la plantilla para un bloque estático porque el bloque estático no tiene una plantilla. Echar un vistazo al método: Mage_Cms_Block_Block::_toHtml(). El _toHtml()método se utiliza para representar cualquier objeto de bloque y, en el caso de los bloques de cms, solo representa el contenido del bloque.

Si desea ajustar el contenido de cualquier bloque de cms en algún marcado, puede intentar esto:

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

Y en el archivo custom/block.phtmlhaz esto:

<?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 esto sea lo que necesitabas.

Marius
fuente
1
Buena solución, nunca lo pensé de esta manera. Aún así, ¿no sería más apropiado crear un widget? De todos modos +1
Sander Mangel
Supongo que podría funcionar con un widget, pero esto significa que todos los bloques cms representados a través de un widget tendrían el mismo marcado a su alrededor. De esta manera, puede tener diferentes plantillas para diferentes bloques estáticos. Si desea que todo se represente igual, supongo que el enfoque del widget debería ser suficiente.
Marius
3

¿Has probado con cms/widget_block? Este bloque se extiende desde Mage_Core_Model_Template, por lo que podría ser posible hacer lo que está tratando de hacer.

fmrng
fuente