Modèle personnalisé pour les blocs statiques dans la page CMS?

8

J'ai recherché le Web et n'ai pas pu trouver comment faire ceci.

Je veux ajouter un bloc statique que j'ai déjà créé dans admin à une page cms. Cela fonctionne en utilisant l'une de ces lignes:

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

Maintenant, je veux utiliser un modèle personnalisé, c'est-à-dire:

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

Quand je le mets dans la page cms comme ceci, le bloc est affiché, mais le "template" -tag est complètement ignoré - cms/content.phtmlest utilisé.

CE QUE
J'AI ESSAYÉ J'ai essayé d'étendre la classe Mage_Block_Cms_Block et de l'ajouter setTemplate($this->getTemplate());à _toHtml()-function. L'effet est le même que ci-dessus - cms/content.phtmlest utilisé.

J'ai essayé d'étendre la classe Mage_Core_Block_Template; bien sûr, je peux définir un modèle ici, mais j'ai des problèmes pour obtenir le bloc statique. Je ne trouve pas comment obtenir le bloc par block-id.

QU'EST-CE QUE CETTE QUESTION EST / PAS SUR
Je sais comment faire avec PHP.
Je sais comment faire cela avec des fichiers XML.
Il est crucial pour cette question que les blocs puissent être gérés dans le backend.

J'exécute Magento CE 1.7.0.0.

Merci pour votre temps!

simonthesorcerer
la source

Réponses:

8

Vous ne pouvez pas modifier le modèle d'un bloc statique car le bloc statique n'a pas de modèle. Jetez un oeil à la méthode: Mage_Cms_Block_Block::_toHtml(). La _toHtml()méthode est utilisée pour rendre n'importe quel objet de bloc, et dans le cas des blocs cms, elle ne rend que le contenu du bloc.

Si vous souhaitez encapsuler le contenu d'un bloc cms dans un balisage, vous pouvez essayer ceci:

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

Et dans le fichier, custom/block.phtmlfaites ceci:

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

J'espère que c'est ce dont vous aviez besoin.

Marius
la source
1
Belle solution, jamais pensé de cette façon. Pourtant, la création d'un widget ne serait-elle pas plus appropriée? Quoi qu'il en soit +1
Sander Mangel
Je suppose que cela pourrait fonctionner avec un widget, mais cela signifie que tous les blocs cms rendus via le widget auraient le même balisage autour. De cette façon, vous pouvez avoir différents modèles pour différents blocs statiques. Si vous voulez que tout soit rendu de la même façon, je suppose que l'approche du widget devrait suffire.
Marius
3

Avez-vous essayé avec cms/widget_block? Ce bloc s'étend de Mage_Core_Model_Template, il peut donc être possible de faire ce que vous essayez de faire.

fmrng
la source