Domanda

Ho avuto un paio di scenari in cui ho cercato di usare il CMS maniglie per aggiornare il layout di una pagina del cms. Per esempio Stavo cercando di utilizzare la radice riferimento maniglia cms_index_index e l'impostazione del modello di pagina. Questo fallito e ho dovuto fare questo aggiornamento il layout attraverso il sistema di amministrazione direttamente sulle impostazioni di visualizzazione pagina homepage di cm.

Inoltre ho provato ad aggiungere un blocco di riferimento sinistra utilizzando la maniglia cms_page. Anche in questo caso non è riuscito e ho dovuto implementare l'aggiornamento di layout tramite il sistema di amministrazione.

Ho letto che non è possibile assegnare un modello di root per le pagine CMS. È che corretto e qualcuno può spiegare perché?

Ho anche chiesto se ci fosse un modo per consentire cm maniglie per utilizzare i riferimenti standard come a sinistra, a destra, radice, ecc? Mi sembra di essere in grado di cose di riferimento come la testa e il contenuto più che bene.

È stato utile?

Soluzione

Perché cambiare il modello di root non opera

Entrambi

Mage_Cms_IndexController::indexAction()

e

Mage_Cms_IndexController::viewAction()

che sono responsabili per la visualizzazione l'homepage di default e una pagina CMS, rispettivamente, chiamare un aiutante:

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

Se si salta in helper (trova in app / code / core / Mage / Cms / Helper / page.php) e seguire renderPage() al metodo _renderPage() protetta vedrai che Magento sta controllando due volte per un Modello di radice (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);     
}

e

if ($page->getRootTemplate()) {
    $action->getLayout()->helper('page/layout')
        ->applyTemplate($page->getRootTemplate());
}

Entrambe le chiamate avvengono dopo le maniglie di layout come "cms_page" e simili sono trattati, in modo che siano fuori di fortuna qui.

Cosa si può fare per cambiare la radice template

C'è un cms_page_render evento che è possibile utilizzare per aggiungere il proprio maniglia di layout XML nelle pagine CMS. Crea il tuo proprio interno (vi risparmio alcuni dettagli qui) e configurare l'osservatore evento nella vostra 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>

Aggiungi il tuo osservatore evento:

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

Infine, aggiungere il nuovo manico di layout XML (per esempio nel vostro 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>

È possibile utilizzare questo metodo anche per aggiungere una maniglia cms_page_view_after o creare maniglie pagina specifica come cms_page_render passa l'oggetto $page al vostro osservatore.

Perché non è possibile aggiungere un blocco alla 'di riferimento a sinistra'

Sei sicuro che il modello che si sta utilizzando ha una colonna di sinistra? Questa domanda può sembrare sciocco, ma il default "2 colonne con barra a destra" layout per esempio, offre solo un 'contenuto' e di una zona 'giusto'. Posso aggiungere blocchi nella colonna di destra utilizzando cms_page senza problemi quindi questo potrebbe essere il problema.

In generale, si può solo aggiungere facilmente i blocchi di riferimenti e loro se eco

  • il modello prescelto radice utilizza il blocco che stai riferimento (vedi app/design/frontend/base/default/template/page/*.phtml) e
  • il blocco che stai riferimento a uno è di tipo core/text_list, chiama $this->getChildhtml() senza argomenti o fa qualcos'altro per eco tutti i blocchi bambino.

Senza ulteriori dettagli, non posso dire perché i blocchi non sono echo'd nella colonna di sinistra o di destra.

Altri suggerimenti

Per quanto riguarda il tuo "non può aggiungere un blocco utilizzando <reference name="left />, sei sicuro che la tua pagina CMS ha un blocco denominato sinistra? Per esempio, se si considera la home page predefinita fornita con i dati di esempio Magento, è appare per avere un blocco denominato sinistra.

è che una colonna di sinistra?

Tuttavia, se si guarda la pagina nel backend, si può vedere insieme è di utilizzare il Modello di radice

`2 columns with right bar`    

e poi nella sua area di contenuto, viene aggiunto alla colonna di sinistra utilizzando HTML markup (ginocchiera WYSIWYG alla visualizzazione origine)

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

Questa grafo orientato rende chiaro non c'è blocco denominato left al gancio nel ( clicca per la piena immagine di dimensioni )

grafo orientato generato con Commerce Bug

Per quanto riguarda l'impostazione di un modello, se si guarda alla fonte per il "Layout" discesa

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

si può vedere quando si sta impostando questo campo, il valore effettivo sempre risparmiato è qualcosa di simile one_column, two_columns_left, ecc Questi valori corespond alle maniglie di layout con lo stesso nome.

#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>

Quando Magento è il rendering di una pagina CMS, fa riferimento i valori salvati, e aggiunge la maniglia di layout adeguato alla pagina. Mentre è tangente alla domanda, si aggiunge che la maniglia qui

#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);
    }  
    //...
}

Ancora più importante è però il ordine le maniglie di layout sono aggiunti in

Maniglie Tab di Commercio Bug

Come si può vedere nello screenshot qui sopra, la maniglia page_two_columns_right si aggiunge dopo la maniglia cms_index_index. Questo significa che se si aggiunge il layout codice di aggiornamento XML per modificare il modello in cms_index_index il codice verrà eseguito, ma poi il codice XML aggiornamento layout in page_two_columns_right verrà eseguito dopo di esso.

Ho sempre sospettato questo è di progettazione per garantire il set modello nella interfaccia utente è sempre corretta. Nella versione precedente del Magento chiamata al metodo <action method="setIsHandle"><applied>1</applied></action> sembra essere esistito per le stesse ragioni.

Quindi, non c'è modo di fare ciò che si desidera utilizzare il codice di layout xml puro. Se sei a tuo agio con la creazione di moduli personalizzati e codice di osservatore, poi esaminare l'evento cms_page_render. Questo incendi a destra prima loadLayoutUpdates è chiamato, e lascerei si fa scorrere un nome di impugnatura supplementare in, o rimuovere i nomi maniglia esistente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a magento.stackexchange
scroll top