Benutzerdefinierte Vorlage für statische Blöcke auf der CMS-Seite?

8

Ich habe im Internet gesucht und konnte nicht finden, wie das geht.

Ich möchte einen statischen Block, den ich zuvor in admin erstellt habe, zu einer cms-Seite hinzufügen. Dies funktioniert mit einer der folgenden Zeilen:

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

Jetzt möchte ich eine benutzerdefinierte Vorlage verwenden, dh:

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

Wenn ich es so in die cms-Seite lege, wird der Block angezeigt, aber der "template" -Tag wird vollständig ignoriert - cms/content.phtmlwird verwendet.

Was ich versucht
habe ich versucht , Klasse Mage_Block_Cms_Block zu erweitern und fügen Sie setTemplate($this->getTemplate());zu _toHtml()-function. Der Effekt ist der gleiche wie oben - cms/content.phtmlwird verwendet.

Ich habe versucht, die Klasse Mage_Core_Block_Template zu erweitern. Natürlich kann ich hier eine Vorlage festlegen, aber ich habe Probleme beim Abrufen des statischen Blocks. Ich kann nicht finden, wie ich den Block per Block-ID bekomme.

WAS IST DIESE FRAGE ÜBER / NICHT ÜBER?
Ich weiß, wie man das mit PHP macht.
Ich weiß, wie man das mit XML-Dateien macht.
Für diese Frage ist es entscheidend, dass die Blöcke im Backend verwaltet werden können.

Ich verwende Magento CE 1.7.0.0.

Vielen Dank für Ihre Zeit!

simonthesorcerer
quelle

Antworten:

8

Sie können die Vorlage für einen statischen Block nicht ändern, da der statische Block keine Vorlage enthält. Schauen Sie sich die Methode an : Mage_Cms_Block_Block::_toHtml(). Die _toHtml()Methode wird zum Rendern eines Blockobjekts verwendet und rendert bei cms-Blöcken nur den Inhalt des Blocks.

Wenn Sie den Inhalt eines CMS-Blocks in ein Markup einschließen möchten, können Sie Folgendes versuchen:

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

Und in der Datei custom/block.phtmltun Sie dies:

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

Ich hoffe, das haben Sie gebraucht.

Marius
quelle
1
Schöne Lösung, nie so gedacht. Wäre es nicht angemessener, ein Widget zu erstellen? Wie auch immer +1
Sander Mangel
Ich denke, dass es mit einem Widget funktionieren könnte, aber dies bedeutet, dass alle über das Widget gerenderten CMS-Blöcke das gleiche Markup haben würden. Auf diese Weise können Sie verschiedene Vorlagen für verschiedene statische Blöcke haben. Wenn Sie möchten, dass alle gleich gerendert werden, sollte der Widget-Ansatz ausreichen.
Marius
3

Hast du es mit versucht cms/widget_block? Dieser Block erstreckt sich von Mage_Core_Model_Template, sodass Sie möglicherweise das tun können, was Sie versuchen.

fmrng
quelle