Maniglie XML CMS per aggiornamenti di layout


13

Ho avuto alcuni scenari in cui ho provato ad usare le maniglie cms per aggiornare il layout di una pagina cms. Ad esempio, stavo cercando di utilizzare la maniglia cms_index_index che fa riferimento alla radice e all'impostazione del modello di pagina. Questo non è riuscito e ho dovuto effettuare questo aggiornamento del layout tramite il sistema di amministrazione direttamente nelle impostazioni di visualizzazione della pagina cms della homepage.

Ho anche provato ad aggiungere un blocco a riferimento a sinistra usando l'handle cms_page. Anche in questo caso non è riuscito e ho dovuto implementare l'aggiornamento del layout tramite il sistema di amministrazione.

Ho letto che non puoi assegnare un template di root alle pagine di cms. È corretto e qualcuno può spiegare perché?

Mi chiedevo anche se esistesse un modo per abilitare gli handle cms per usare i riferimenti standard come left, right, root etc? Mi sembra di essere in grado di fare riferimento a cose come head e content bene.

Risposte:


20

Perché cambiare il modello di root non funziona

Tutti e due

Mage_Cms_IndexController::indexAction()

e

Mage_Cms_IndexController::viewAction()

che sono responsabili della visualizzazione della homepage predefinita e di una pagina CMS chiamano rispettivamente un aiuto:

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

Se salti nell'helper (che si trova in app / code / core / Mage / Cms / Helper / Page.php) e segui renderPage()il metodo protetto _renderPage()vedrai che Magento sta verificando due volte un modello di root (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 che gli handle di layout come "cms_page" e simili sono stati elaborati, quindi non sei fortunato qui.

Cosa puoi fare per cambiare il modello di root

Esiste un evento cms_page_renderche è possibile utilizzare per aggiungere il proprio handle di layout XML nelle pagine CMS. Crea la tua estensione (risparmierò alcuni dettagli qui) e configura l'osservatore di eventi nel tuo 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 di eventi:

<?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, aggiungi il tuo nuovo handle XML di layout (ad esempio nel tuo 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>

Puoi usare questo metodo anche per aggiungere un cms_page_view_afterhandle o creare handle specifici della pagina quando cms_page_renderpassa l' $pageoggetto al tuo osservatore.

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

Sei sicuro che il modello che stai utilizzando abbia una colonna a sinistra? Questa domanda può sembrare sciocca ma il layout predefinito "2 colonne con la barra di destra", ad esempio, offre solo un'area "contenuto" e un'area "giusta". Posso aggiungere blocchi alla colonna di destra usando cms_pagesenza problemi, quindi questo potrebbe essere il problema.

In generale, puoi solo aggiungere facilmente blocchi ai riferimenti e farli eco se

  • il modello di root scelto utilizza il blocco a cui fai riferimento (vedi app/design/frontend/base/default/template/page/*.phtml) e
  • il blocco a cui fai riferimento è di tipo core/text_list, chiama $this->getChildhtml()senza argomenti o fa qualcos'altro per fare eco a tutti i blocchi figlio.

Senza ulteriori dettagli, non posso dirti perché i tuoi blocchi non vengono ripetuti nella colonna sinistra o destra.


Ciao Matthias. Grazie per il suggerimento di aggiungere un osservatore di eventi, darò un'occhiata a uno dei nostri sviluppatori e vedrò se funziona. Questa potrebbe essere la risposta! @Alan ha anche fatto un punto simile sull'avere impostato il modello predefinito corretto per le pagine cms e sul fatto che le maniglie sono sostituite. Grazie anche per le informazioni, penso di averlo capito ora.
Mark Weston,

Ciao. Testato questo e funziona. Lo ha anche testato per handle specifici della pagina e funziona, ma non è la soluzione migliore in quanto ho bisogno di un identificatore per le pagine che non verranno modificate. Come test ho usato l'identificatore di pagina $cmsPageId = '_' . str_replace('-', '_', $observer->getEvent()->getPage()->getIdentifier()); Se qualcuno ha cambiato l'URL della pagina cms, la maniglia non funzionerà. Idealmente, un campo per "chiave di pagina" esisterebbe nella pagina CMS nel sistema di amministrazione, quindi l'URL della pagina, il nome ecc. Potrebbero essere modificati e la chiave potrebbe essere mantenuta invariata.
Mark Weston,

14

Per quanto riguarda il "non puoi aggiungere un blocco usando <reference name="left/>, sei sicuro che la tua pagina CMS abbia un blocco chiamato a sinistra? Ad esempio, se consideri la home page predefinita fornita con i dati di esempio Magento, sembra che abbia un blocco chiamato sinistra.

è quella una colonna di sinistra?

Tuttavia, se guardi la pagina nel back-end, puoi vedere che è impostato per utilizzare il modello radice

`2 columns with right bar`    

e quindi nella sua area di contenuto, la colonna di sinistra viene aggiunta usando il markup HTML (attiva il WYSIWYG alla vista sorgente)

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

Questo grafico diretto chiarisce che non ci sono blocchi nominati leftda agganciare ( fare clic per l'immagine a dimensione intera )

grafico diretto generato con Commerce Bug

Per quanto riguarda l'impostazione di un modello, se si osserva l'origine per il menu a discesa "Layout"

<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_lefte così via 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 esegue il rendering di una pagina CMS, fa riferimento ai valori salvati e aggiunge l'handle di layout appropriato alla pagina. Mentre è tangenziale alla domanda, quell'handle viene aggiunto 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 è l' ordine in cui vengono aggiunti gli handle di layout

Scheda Maniglie di commercio Bug

Come puoi vedere nello screenshot sopra, l' page_two_columns_righthandle viene aggiunto dopo l' cms_index_indexhandle. Ciò significa che se si aggiunge il codice di aggiornamento xml del layout per modificare il modello nel cms_index_indexcodice verrà eseguito, ma successivamente page_two_columns_rightverrà eseguito il codice xml di aggiornamento del layout .

Ho sempre sospettato che ciò avvenisse in base alla progettazione per garantire che il modello impostato nell'interfaccia utente sia sempre corretto. Nella versione precedente di Magento la <action method="setIsHandle"><applied>1</applied></action>chiamata del metodo sembra esistere per gli stessi motivi.

Quindi, non c'è modo di fare quello che vuoi usando un codice xml di layout puro. Se hai dimestichezza con la creazione di moduli personalizzati e codice osservatore, guarda l' cms_page_renderevento. Questo viene generato subito prima di loadLayoutUpdatesessere chiamato e ti consente di inserire un nome di handle aggiuntivo o rimuovere i nomi di handle esistenti.


Grazie Alan, i tuoi commenti sull'aggiunta di blocchi a una pagina di cms hanno perfettamente senso. Di solito imposto modelli per pagine diverse usando le varie maniglie xml fornite da Magento. La mia comprensione leggermente migliore delle pagine di cms ha reso più chiaro il motivo per cui ho avuto problemi usando i riferimenti per le pagine di cms. Devo assicurarmi che l'handle predefinito nel mio page.xml abbia il layout corretto per le pagine cms. Sembra che ho superato quella maniglia, perché di solito lo sto esagerando altrove. È corretto? Posso chiederti come hai prodotto il grafico e quale strumento stai utilizzando per visualizzare le maniglie per una richiesta specifica?
Mark Weston,

2
@MarkWeston I diagrammi e la gestione dell'interfaccia utente di Commerce Bug, uno strumento di debug commerciale che ho creato e venduto. (vedi alanstorm.com/find_magento_block_name per i dettagli) Non sono sicuro di aver capito la tua domanda sugli handle, ma se stai impostando un modello defaultnell'handle, il layout impostato nell'amministratore continuerà a vincere (cioè page_two_columns_rightcontinuerà a funzionare dopo). Inoltre, Re: terminologia - non si sovrascrive gli handle, i handle coesistono sempre con gli altri - è solo l'ordine in cui vengono eseguiti a produrre effetti il ​​risultato finale.
Alan Storm,

Saluti Alan. Capisco cosa intendi quando si chiama l'uso di un handle per impostare un modello che non sia una sostituzione - buon punto. Grazie per le informazioni su Commerce Bug.
Mark Weston,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.