Pourquoi changer le modèle racine ne fonctionne pas
Tous les deux
Mage_Cms_IndexController::indexAction()
et
Mage_Cms_IndexController::viewAction()
qui sont chargés d'afficher la page d'accueil par défaut et une page CMS appellent respectivement un assistant:
Mage::helper('cms/page')->renderPage($this, $pageId)
Si vous sautez dans l'assistant (situé dans app / code / core / Mage / Cms / Helper / Page.php) et suivez renderPage()
la méthode protégée, _renderPage()
vous verrez que Magento recherche deux fois 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 se produisent après le traitement des poignées de mise en page comme "cms_page" et autres, vous n'avez donc pas de chance ici.
Ce que vous pouvez faire pour modifier le modèle racine
Il existe un événement cms_page_render
que vous pouvez utiliser pour ajouter votre propre descripteur de disposition XML sur les pages CMS. Créez votre propre extension (j'épargnerai quelques détails ici) et configurez 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 également utiliser cette méthode pour ajouter une cms_page_view_after
poignée ou créer des poignées spécifiques à une page en cms_page_render
passant l' $page
objet à 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 sembler idiote, mais la disposition par défaut "2 colonnes avec barre de droite", par exemple, ne propose qu'un "contenu" et une "bonne" zone. Je peux ajouter des blocs à la colonne de droite en utilisant cms_page
sans problème, cela pourrait donc être le problème.
En général, vous ne pouvez ajouter facilement des blocs aux références et les faire écho que si
- le modèle racine choisi utilise le bloc auquel vous faites référence (voir
app/design/frontend/base/default/template/page/*.phtml
) et
- le bloc auquel vous faites référence est 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 repris dans la colonne de gauche ou de droite.
$cmsPageId = '_' . str_replace('-', '_', $observer->getEvent()->getPage()->getIdentifier());
Si quelqu'un a changé l'URL de la page cms, la fonction ne fonctionnera pas. Idéalement, un champ pour «clé de page» existerait sur la page CMS dans le système d'administration, puis l'url de la page, le nom, etc. pourraient être modifiés et la clé pourrait être conservée.En ce qui concerne votre "ne peut pas ajouter un bloc en utilisant
<reference name="left
/>, êtes-vous sûr que votre page CMS a un bloc nommé gauche? Par exemple, si vous considérez la page d'accueil par défaut livrée avec les exemples de données Magento, elle semble avoir un bloc nommé la gauche.Cependant, si vous regardez la page dans le backend, vous pouvez voir qu'elle est configurée pour utiliser le modèle racine
puis dans sa zone de contenu, la colonne de gauche est ajoutée à l'aide du balisage HTML (basculer le WYSIWYG en vue source)
Ce graphique orienté montre clairement qu'il n'y a pas de bloc nommé
left
à accrocher ( cliquez pour agrandir l'image )Concernant la configuration d'un modèle, si vous regardez la source du menu déroulant "Mise en page"
Vous pouvez voir quand vous configurez ce champ, la valeur réelle s'économisée est quelque chose comme
one_column
,two_columns_left
, etc. Ces valeurs corespond à des poignées de mise en page du même nom.Lorsque Magento affiche 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 que cela soit tangentiel à la question, cette poignée est ajoutée ici
Mais le plus important est l' ordre dans lequel les poignées de mise en page sont ajoutées
Comme vous pouvez le voir dans la capture d'écran ci-dessus, la
page_two_columns_right
poignée est ajoutée après lacms_index_index
poignée. Cela signifie que si vous ajoutez du code de mise à jour XML de mise en page pour modifier le modèle danscms_index_index
votre code, il s'exécutera, mais le code XML de mise à jour de mise en pagepage_two_columns_right
s'exécutera après.J'ai toujours soupçonné que c'est par conception pour garantir que le modèle défini dans l'interface utilisateur est toujours correct. Dans la version précédente de Magento, l'
<action method="setIsHandle"><applied>1</applied></action>
appel de méthode semble avoir existé pour les mêmes raisons.Il n'y a donc aucun moyen de faire ce que vous voulez en utilisant du code XML de mise en page pure. Si vous êtes à l'aise avec la création de modules personnalisés et de code d'observateur, examinez l'
cms_page_render
événement. Cela se déclenche juste avantloadLayoutUpdates
son appel et vous permet de faire glisser un nom de poignée supplémentaire ou de supprimer les noms de poignée existants.la source
default
poignée, alors la mise en page définie dans l'admin gagnera toujours (c'estpage_two_columns_right
-à- dire continuera de fonctionner plus tard). En outre, Re: terminologie - vous ne remplacez pas les poignées, vos poignées coexistent toujours avec les autres - c'est juste l'ordre dans lequel elles s'exécutent qui affecte le résultat final.