Question

J'ai eu quelques scénarios où j'ai essayé d'utiliser les poignées de CMS pour mettre à jour la mise en page d'un CMS page. Par exemple, je suis en train d'utiliser la racine de référencement poignée de cms_index_index et le réglage du modèle de page. Ce échoué et je devais faire cette mise à jour de la mise en page via le système d'administration directement sur les paramètres d'affichage de la page d'accueil de CMS.

Je l'ai également essayé d'ajouter un bloc à gauche référence en utilisant la poignée de cms_page. Encore une fois cela a échoué et je devais mettre en œuvre la mise à jour de la mise en page par le biais du système d'administration.

J'ai lu que vous ne pouvez pas affecter un modèle racine aux pages cms. Est-ce que quelqu'un correct et peut expliquer pourquoi?

Je me demandais aussi s'il y avait un moyen de permettre aux poignées cm d'utiliser les références standard telles que gauche, à droite, la racine etc? Je crois pouvoir aux choses de référence comme la tête et le contenu très bien.

Était-ce utile?

La solution

Pourquoi changer le modèle racine ne fonctionne pas

Les deux

Mage_Cms_IndexController::indexAction()

et

Mage_Cms_IndexController::viewAction()

qui sont responsables de l'affichage de la page d'accueil par défaut et une page CMS appeler respectivement une aide:

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

Si vous sautez dans l'aide (situé à app / code / core / Mage / Cms / Aide / page.php) et suivez renderPage() la _renderPage() méthode protégée, vous verrez que Magento vérifie deux fois pour un modèle racine (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);     
}

et

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

Les deux appels ont lieu après que les poignées de mise en page comme « cms_page » et autres sont traitées, de sorte que vous êtes hors de la chance ici.

Qu'est-ce que vous pouvez faire pour changer le modèle racine

Il y a un cms_page_render d'événement que vous pouvez utiliser pour ajouter votre propre poignée de mise en page XML sur les pages CMS. Créez votre propre extension (je vais épargner quelques détails ici) et configurer l'observateur d'événements dans votre 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>

Ajoutez votre observateur d'événement:

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

Enfin, ajoutez votre nouvelle poignée XML de mise en page (par exemple dans votre 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>

Vous pouvez utiliser cette méthode et d'ajouter une poignée de cms_page_view_after ou créer des poignées spécifiques de page cms_page_render passe l'objet $page à votre observateur.

Pourquoi vous ne pouvez pas ajouter un bloc à la 'référence gauche'

Êtes-vous sûr que le modèle que vous utilisez a une colonne de gauche? Cette question peut paraître stupide, mais la valeur par défaut « 2 colonnes avec barre de droite » mise en page par exemple offre seulement « contenu » et une zone « droit ». Je peux ajouter des blocs à la colonne de droite en utilisant cms_page sans problème si cela pourrait être le problème.

En général, vous ne pouvez facilement ajouter des blocs à références et écho si

  • le modèle racine choisi utilise le bloc que vous faites référence (voir app/design/frontend/base/default/template/page/*.phtml) et
  • le bloc que vous faites référence est soit de type core/text_list, appelle $this->getChildhtml() sans arguments ou fait autre chose pour faire écho à tous les blocs enfants.

Sans plus de détails, je ne peux pas vous dire pourquoi vos blocs ne sont pas echo'd dans la colonne de gauche ou à droite.

Autres conseils

En ce qui concerne votre « ne peut pas ajouter un bloc à l'aide <reference name="left />, êtes-vous sûr de votre page CMS a un bloc named gauche? Par exemple, si vous considérez la page d'accueil par défaut livré avec les données d'échantillon Magento, il apparaît pour avoir un bloc nommé gauche.

est qu'une colonne de gauche?

Cependant, si vous regardez la page dans le back-end, vous pouvez le voir de jeu à utiliser le modèle racine

`2 columns with right bar`    

puis dans sa zone de contenu, la colonne de gauche est ajoutée à l'aide HTML balisage (Toggle WYSIWYG à la vue source)

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

Ce graphe orienté, il est clair qu'il n'y a pas bloc nommé left à crochet dans ( cliquez pour plein image de taille )

graphe orienté généré avec Commerce Bug

En ce qui concerne la fixation d'un modèle, si vous regardez la source de la « mise en page » menu déroulant

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

Vous pouvez voir quand vous configurez ce champ, la valeur réelle sauvées est quelque chose comme one_column, two_columns_left, etc. Ces valeurs corespond à des poignées de mise en page du même nom.

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

Quand Magento est rendu une page CMS, il fait référence aux valeurs enregistrées, et ajoute la poignée de mise en page appropriée à la page. Bien qu'il soit tangente à la question, cette poignée est ajoutée ici

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

Plus important encore est le pour les poignées de mise en page sont ajoutés dans

Poignées Tab du Commerce Bug

Comme vous pouvez le voir dans la capture d'écran ci-dessus, la poignée de page_two_columns_right est ajouté après la poignée de cms_index_index. Cela signifie que si vous ajoutez la mise en page du code de mise à jour XML pour modifier le modèle dans cms_index_index votre code fonctionnera, mais la mise à jour de la mise en page du code XML en page_two_columns_right courront après.

J'ai toujours soupçonné c'est par la conception pour assurer l'ensemble du modèle dans l'interface utilisateur est toujours correcte. Dans la version précédente de Magento l'appel de la méthode <action method="setIsHandle"><applied>1</applied></action> semble avoir existé pour les mêmes raisons.

Alors, il n'y a aucun moyen de faire ce que vous voulez en utilisant le code xml pur de mise en page. Si vous êtes à l'aise avec la création de modules personnalisés et le code d'observateur, puis regardez dans l'événement cms_page_render. Ce feu juste avant loadLayoutUpdates est appelé, et voulez-vous laisser glisser un nom de poignée supplémentaire, ou supprimer les noms de poignée existants.

Licencié sous: CC-BY-SA avec attribution
Non affilié à magento.stackexchange
scroll top