Frage

Ich hatte ein paar Szenarien, in denen ich versucht habe, die CMS -Handles zu verwenden, um das Layout einer CMS -Seite zu aktualisieren. Zum Beispiel habe ich versucht, das Referenzierungsroot cms_index_index zu verwenden und die Seitenvorlage festzulegen. Dies schlug fehl und ich musste dieses Layout über das Administratorsystem direkt auf der Homepage CMS -Seite -Anzeigeeinstellungen aktualisieren.

Ich habe auch versucht, mit dem CMS_PAGE -Griff einen Block zur Verweise nach links hinzuzufügen. Auch dies schlug fehl und ich musste das Layout -Update über das Administratorsystem implementieren.

Ich habe gelesen, dass Sie CMS -Seiten keine Root -Vorlage zuweisen können. Ist das richtig und kann jemand erklären, warum?

Ich habe mich auch gefragt, ob es eine Möglichkeit gab, CMS -Handles zu ermöglichen, die Standardreferenzen wie links, rechts, Wurzel usw. zu verwenden. Ich scheine in der Lage zu sein, auf Dinge wie Kopf und Inhalt in Ordnung zu verweisen.

War es hilfreich?

Lösung

Warum das Ändern der Stammvorlage nicht funktioniert

Beide

Mage_Cms_IndexController::indexAction()

und

Mage_Cms_IndexController::viewAction()

die für die Anzeige der Standard -Homepage bzw. eine CMS -Seite verantwortlich sind. Rufen Sie einen Helfer an:

Mage::helper('cms/page')->renderPage($this, $pageId)

Wenn Sie in den Helfer springen (befindet renderPage() zur geschützten Methode _renderPage() Sie werden sehen, dass Magento zweimal auf eine Root -Vorlage (Magento CE 1.7.0.2) prüft:

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 Anrufe erfolgen nach Layout -Griffen wie "CMS_Page" und dergleichen, die verarbeitet werden, sodass Sie hier kein Glück haben.

Was Sie tun können, um die Stammvorlage zu ändern

Es gibt eine Veranstaltung cms_page_render Sie können zum Hinzufügen Ihres eigenen XML -Layout -Griffs auf CMS -Seiten verwenden. Erstellen Sie Ihre eigene Erweiterung (ich werde hier einige Details sparen) 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 schließlich Ihr neues Layout XML -Handle hinzu (zB 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>

Sie können diese Methode auch verwenden, um a hinzuzufügen cms_page_view_after Seitenspezifische Handles behandeln oder erstellen cms_page_render Pässt die $page Einwände gegen Ihren Beobachter.

Warum Sie der "verlassenen Referenz" keinen Block hinzufügen können

Sind Sie sicher, dass die von Ihnen verwendete Vorlage eine linke Spalte hat? Diese Frage mag albern klingen, aber die Standard -Layout "2 Spalten mit dem rechten Balken" bietet beispielsweise nur einen Inhalt und einen "rechten" Bereich. Ich kann die rechte Spalte mithilfe von Blöcken hinzufügen cms_page Ohne Probleme könnte dies das Problem sein.

Im Allgemeinen können Sie Referenzen nur leicht Blöcke hinzufügen und sie wiedergeben, wenn

  • Die ausgewählte Root -Vorlage verwendet den Block, auf den Sie sich verweisen (siehe app/design/frontend/base/default/template/page/*.phtml) und
  • Der Block, auf den Sie sich beide beziehen, ist vom Typ core/text_list, Anrufe $this->getChildhtml() Ohne Argumente oder etwas anderes, um alle Kinderblöcke wiederzugeben.

Ohne weitere Details kann ich Ihnen nicht sagen, warum Ihre Blöcke in der linken oder rechten Spalte nicht wiedergegeben werden.

Andere Tipps

In Bezug auf Ihre "kann kein Block mithilfe von Verwendung hinzufügen <reference name="left/> Sind Sie sicher, dass Ihre CMS -Seite einen Block mit dem Namen links hat? Wenn Sie beispielsweise die Standard -Startseite betrachten, die mit den Magento -Beispieldaten versendet wird erscheint einen Block namens links haben.

is that a left column?

Wenn Sie sich jedoch die Seite im Backend ansehen, können Sie feststellen, dass sie die Stammvorlage verwendet

`2 columns with right bar`    

und dann in seinem Inhaltsbereich wird die linke Spalte mit HTML -Markup hinzugefügt (wysiwyg nach Quellansicht umschalten).

<div class="col-left side-col">
<p class="home-callout"><a href="{{store direct_url="apparel/shoes/womens/anashria-womens-premier-leather-sandal.html"}}"><img src="{{skin url='images/ph_callout_left_top.gif'}}" alt="" border="0" /></a></p>
<p class="home-callout"><img src="{{skin url='images/ph_callout_left_rebel.jpg'}}" alt="" border="0" /></p>
{{block type="tag/popular" template="tag/popular.phtml"}}</div>

Diese angegebene Grafik macht deutlich, dass es keinen Block namens namens gibt left sich anschließen (Klicken Sie für Bild in voller Größe)

directed graph generated with Commerce Bug

In Bezug

<select id="page_root_template" name="root_template" class=" required-entry select">
    <option value="empty">Empty</option>
    <option value="one_column">1 column</option>
    <option value="two_columns_left">2 columns with left bar</option>
    <option value="two_columns_right" selected="selected">2 columns with right bar</option>
    <option value="three_columns">3 columns</option>
</select>

Sie können sehen, wenn Sie dieses Feld festlegen, der tatsächliche Wert wird so etwas wie one_column, two_columns_left, usw. Diese Werte entsprechen den gleichnamigen Layout -Griffen.

#File: app/design/frontend/default/modern/layout/page.xml
<page_one_column translate="label">
    <label>All One-Column Layout Pages</label>
    <reference name="root">
        <action method="setTemplate"><template>page/1column.phtml</template></action>
        <!-- Mark root page block that template is applied -->
        <action method="setIsHandle"><applied>1</applied></action>
        <action method="setLayoutCode"><name>one_column</name></action>
    </reference>
</page_one_column>
...
<page_two_columns_left translate="label">
    <label>All Two-Column Layout Pages (Left Column)</label>
    <reference name="root">
        <action method="setTemplate"><template>page/2columns-left.phtml</template></action>
        <!-- Mark root page block that template is applied -->
        <action method="setIsHandle"><applied>1</applied></action>
        <action method="setLayoutCode"><name>two_columns_left</name></action>
    </reference>
</page_two_columns_left>

Wenn Magento eine CMS -Seite rendert, verweist es auf die gespeicherten Werte und fügt der Seite den entsprechenden Layout -Handle hinzu. Während es tangential zur Frage ist, wird dieser Handle hier hinzugefügt

#File: app/code/core/Mage/Cms/Helper/Page.php
protected function _renderPage(Mage_Core_Controller_Varien_Action  $action, $pageId = null, $renderLayout = true)
{
    //...
    $action->addActionLayoutHandles();        
    if ($page->getRootTemplate()) {
        $handle = ($page->getCustomRootTemplate()
                    && $page->getCustomRootTemplate() != 'empty'
                    && $inRange) ? $page->getCustomRootTemplate() : $page->getRootTemplate();
        $action->getLayout()->helper('page/layout')->applyHandle($handle);
    }  
    //...
}

Noch wichtiger ist jedoch die bestellen Die Layoutgriffe werden in hinzugefügt

Handles Tab of Commerce Bug

Wie Sie im obigen Screenshot sehen können, die page_two_columns_right Handle wird hinzugefügt nach das cms_index_index handhaben. Dies bedeutet, wenn Sie Layout XML -Update -Code hinzufügen, um die Vorlage in der Vorlage zu ändern cms_index_index Ihr Code wird ausgeführt, aber dann der Layout -Update XML -Code in page_two_columns_right Wird danach rennen.

Ich habe immer vermutet, dass dies entworfen ist, um sicherzustellen, dass die in der Benutzeroberfläche festgelegte Vorlage festgelegt ist stets Korrekt. In der früheren Version von Magento die <action method="setIsHandle"><applied>1</applied></action> Methodenaufruf scheint aus den gleichen Gründen existiert zu haben.

Es gibt also keine Möglichkeit, das zu tun, was Sie mit dem XML -Code von Pure Layout verwenden möchten. Wenn Sie mit dem Erstellen von benutzerdefinierten Modulen und Beobachtercode vertraut sind, untersuchen Sie die cms_page_render Veranstaltung. Dies feuert direkt zuvor loadLayoutUpdates wird aufgerufen und kann einen zusätzlichen Griffnamen einschalten oder die vorhandenen Griffnamen entfernen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit magento.stackexchange
scroll top