Warum funktioniert das Ändern der Stammvorlage nicht?
Beide
Mage_Cms_IndexController::indexAction()
und
Mage_Cms_IndexController::viewAction()
die für die Anzeige der Standardhomepage und einer CMS-Seite zuständig sind, rufen jeweils einen Helfer auf:
Mage::helper('cms/page')->renderPage($this, $pageId)
Wenn Sie in den Helfer springen (unter app / code / core / Mage / Cms / Helper / Page.php) und renderPage()
der geschützten Methode folgen , werden _renderPage()
Sie feststellen, dass Magento zweimal nach einer Stammvorlage sucht (Magento CE 1.7). 0,2):
if ($page->getRootTemplate()) {
$handle = ($page->getCustomRootTemplate()
&& $page->getCustomRootTemplate() != 'empty'
&& $inRange) ? $page->getCustomRootTemplate() : $page->getRootTemplate();
$action->getLayout()->helper('page/layout')->applyHandle($handle);
}
und
if ($page->getRootTemplate()) {
$action->getLayout()->helper('page/layout')
->applyTemplate($page->getRootTemplate());
}
Beide Aufrufe werden ausgeführt, nachdem Layout-Handles wie "cms_page" und dergleichen verarbeitet wurden. Sie haben hier also Pech.
Was Sie tun können, um die Stammvorlage zu ändern
Es gibt ein Ereignis, mit cms_page_render
dem Sie Ihr eigenes XML-Layout-Handle auf CMS-Seiten hinzufügen können. Erstellen Sie Ihre eigene Erweiterung (ich werde hier einige Details ersparen) und konfigurieren Sie den Ereignisbeobachter in Ihrem config.xml
:
<?xml version="1.0"?>
<config>
<modules>
<Emzee_Cms>
<version>0.0.1</version>
</Emzee_Cms>
</modules>
<global>
<events>
<cms_page_render>
<observers>
<emzee_cms_page_render>
<class>emzee_cms/observer</class>
<method>cms_page_render</method>
</emzee_cms_page_render>
</observers>
</cms_page_render>
</events>
<models>
<emzee_cms>
<class>Emzee_Cms_Model</class>
</emzee_cms>
</models>
</global>
</config>
Fügen Sie Ihren Ereignisbeobachter hinzu:
<?php
class Emzee_Cms_Model_Observer
{
public function cms_page_render(Varien_Event_Observer $observer)
{
$action = $observer->getEvent()->getControllerAction();
$actionName = strtolower($action->getFullActionName());
$action->getLayout()->getUpdate()
->addHandle($actionName . '_after');
return $this;
}
}
Fügen Sie abschließend Ihr neues Layout-XML-Handle hinzu (z. B. in Ihrem local.xml
):
<?xml version="1.0"?>
<layout version="0.1.0">
<cms_index_index_after>
<reference name="root">
<action method="setTemplate"><template>page/1column.phtml</template></action>
</reference>
</cms_index_index_after>
</layout>
Mit dieser Methode können Sie auch ein cms_page_view_after
Handle hinzufügen oder seitenspezifische Handles erstellen, während cms_page_render
das $page
Objekt an Ihren Beobachter übergeben wird.
Warum Sie der Referenz links keinen Block hinzufügen können
Sind Sie sicher, dass die von Ihnen verwendete Vorlage eine linke Spalte enthält? Diese Frage mag albern klingen, aber das Standardlayout "2 Spalten mit rechter Leiste" bietet zum Beispiel nur einen "Inhalt" und einen "rechten" Bereich. Ich kann cms_page
ohne Probleme Blöcke zur rechten Spalte hinzufügen, so dass dies das Problem sein könnte.
Im Allgemeinen können Sie Referenzen nur ganz einfach Blöcke hinzufügen und sie dann wiedergeben
- Die ausgewählte Stammvorlage verwendet den Block, auf den Sie verweisen (siehe
app/design/frontend/base/default/template/page/*.phtml
) und
- Der Block, auf den Sie verweisen, ist entweder vom Typ
core/text_list
, ruft $this->getChildhtml()
ohne Argumente auf oder gibt etwas anderes aus, um alle untergeordneten Blöcke wiederzugeben.
Ohne weitere Details kann ich Ihnen nicht sagen, warum Ihre Blöcke in der linken oder rechten Spalte nicht wiedergegeben werden.
$cmsPageId = '_' . str_replace('-', '_', $observer->getEvent()->getPage()->getIdentifier());
Wenn jemand die URL der CMS-Seite geändert hat, funktioniert das Handle nicht. Idealerweise gibt es auf der CMS-Seite im Admin-System ein Feld für "Seitenschlüssel". Dann können die Seiten-URL, der Name usw. geändert und der Schlüssel beibehalten werden.<reference name="left
Sind Sie sicher, dass Ihre CMS-Seite über /> keinen Block hinzufügen kann ? Wenn Sie beispielsweise die Standardhomepage betrachten, die mit den Magento-Beispieldaten geliefert wird, scheint sie einen Block mit dem Namen zu haben links.Wenn Sie sich jedoch die Seite im Backend ansehen, sehen Sie, dass sie für die Verwendung der Stammvorlage konfiguriert ist
Anschließend wird in seinem Inhaltsbereich die linke Spalte mithilfe von HTML-Markup hinzugefügt (WYSIWYG in die Quellansicht umschalten).
Diese gerichtete Grafik macht deutlich, dass es keinen Block gibt, in den
left
man sich einklinken kann ( Klicken für ein Bild in voller Größe )Zum Einstellen einer Vorlage, wenn Sie sich die Quelle für das Dropdown-Menü "Layout" ansehen
Sie können sehen, wenn Sie dieses Feld einstellen, dass der tatsächliche Wert, der gespeichert wird, in etwa so
one_column
isttwo_columns_left
, usw. Diese Werte entsprechen Layout-Ziehpunkten mit demselben Namen.Wenn Magento eine CMS-Seite rendert, verweist es auf die gespeicherten Werte und fügt der Seite das entsprechende Layout-Handle hinzu. Während es tangential zur Frage ist, wird dieses Handle hier hinzugefügt
Noch wichtiger ist jedoch die Reihenfolge, in der die Layout-Handles hinzugefügt werden
Wie Sie im obigen Screenshot sehen können, wird das
page_two_columns_right
Handle nach demcms_index_index
Handle eingefügt . Dies bedeutet, dass, wenn Sie Layout-XML-Aktualisierungscode hinzufügen, um die Vorlage incms_index_index
Ihrem Code zu ändern, dieser ausgeführt wird. Anschließend wird jedoch der XML-Code für die Layout-Aktualisierungpage_two_columns_right
ausgeführt.Ich habe immer vermutet, dass dies beabsichtigt ist, um sicherzustellen, dass die in der Benutzeroberfläche festgelegte Vorlage immer korrekt ist. In der Vorgängerversion von Magento
<action method="setIsHandle"><applied>1</applied></action>
schien der Methodenaufruf aus den gleichen Gründen vorhanden zu sein.Es gibt also keine Möglichkeit, mit reinem Layout-XML-Code das zu tun, was Sie wollen. Wenn Sie mit dem Erstellen von benutzerdefinierten Modulen und Beobachtercode vertraut sind, schauen Sie sich das
cms_page_render
Ereignis an. Dies wird unmittelbar vor demloadLayoutUpdates
Aufruf ausgelöst und ermöglicht es Ihnen, einen zusätzlichen Handle-Namen einzufügen oder die vorhandenen Handle-Namen zu entfernen.quelle
default
Handle festlegen, wird das im Administrator festgelegte Layoutpage_two_columns_right
weiterhin funktionieren später). Auch Re: Terminologie - Sie überschreiben keine Handles, Ihre Handles existieren immer mit den anderen - es ist nur die Reihenfolge, in der sie ausgeführt werden, die das Endergebnis beeinflusst.