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
`2 columns with right bar`
puis dans sa zone de contenu, la colonne de gauche est ajoutée à l'aide du balisage HTML (basculer le WYSIWYG en 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 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"
<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 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.
#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>
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
#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);
}
//...
}
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 la cms_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 dans cms_index_index
votre code, il s'exécutera, mais le code XML de mise à jour de mise en page page_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 avant loadLayoutUpdates
son appel et vous permet de faire glisser un nom de poignée supplémentaire ou de supprimer les noms de poignée existants.