Je suis un développeur frontal de Magento, j'ai créé pas mal de mes propres thèmes et je veux mieux comprendre le positionnement des blocs XML de Magento ...
J'utilise normalement un fichier local.xml
Pour tout manipuler, je peux définir un bloc comme suit:
<cms_index_index>
<reference name="root">
<block type="core/template" name="example_block" as="exampleBlock" template="page/html/example-block.phtml"/>
</reference>
</cms_index_index>
Cela créerait un bloc sur la page d'accueil (cms_index_index
) Et comme le bloc est créé d'un niveau sous root
, j'appellerais normalement le bloc en ajoutant:
<?php echo $this->getChildHtml('exampleBlock') ?>
... à 1column.phtml
(ou 2columns-left
/right.phtml
, 3columns.phtml
etc.). Le bloc peut être placé sur n'importe quelle page en remplaçant cms_index_index
Par la balise de page appropriée.
Je vois des choses comme les suivantes dans les fichiers XML de base et dans les didacticiels:
<reference name="root">
<block type="core/template" name="example_block" before="content" template="page/html/example-block.phtml"/>
</reference>
content
est un bloc qui fait partie de la structure générale des pages de magento et, d'après ce que je comprends, before="content"
devrait le placer là où vous vous attendez, sans avoir besoin d'utiliser getChildHtml('exampleBlock')
, jusqu'ici tout va bien ... cependant, avant/après ne semble presque jamais fonctionner pour moi, et je me retrouve souvent à recourir à la méthode getChildHtml comme sauvegarde, ce qui n'est pas toujours idéal, et signifie éditer plus de fichiers .phtml que nécessaire .
J'ai essayé:
<reference name="root">
<block type="core/template" name="example_block" before="content" template="page/html/example-block.phtml"/>
</reference>
Rien n'apparaît ...
<reference name="root">
<block type="core/template" name="example_block" after="header" template="page/html/example-block.phtml"/>
</reference>
Toujours rien .... Je suis également conscient d'utiliser before="-"
Ou after="-"
Pour placer quelque chose avant tout dans son bloc parent. J'ai parfois de la chance avec ça, mais je suis généralement confus et frustré.
J'ai googlé partout pour `` magento xml avant/après ne fonctionne pas '' et commence à me demander si c'est juste moi que cela arrive ... quelqu'un peut-il expliquer quand je peux et ne peux pas utiliser avant/après pour positionner des blocs? Quel est le problème avec les exemples ci-dessus?
Je suis dans Magento 1.7.0.2 (dernière disponible au moment de la publication)
La principale motivation pour cela est de réduire le nombre de fichiers .phtml de base que je dois modifier juste pour ajouter une getChildHtml()
, donc s'il y a une autre façon (XML) de contourner cela, je serais intéressé de connaître...
Les attributs before
et after
ne fonctionnent que dans l'un des deux cas suivants:
core/text_list
bloquergetChildHtml
sans aucun paramètreQuand tu dis
<reference name="root">
<block type="core/template" name="example_block" before="content" template="page/html/example-block.phtml"/>
</reference>
tu dis à Magento
Hey Magento, mets le
example_block
à l'intérieur du blocroot
.
Lorsque vous placez un certain nombre de blocs différents dans un parent, ces blocs ont un ordre implicite. Pour les blocs de modèle, cet ordre n'a pas d'importance, car ces blocs sont rendus explicitement.
<?php echo $this->getChildHtml('example_block') ?>
Cependant, il y a deux cas où l'ordonnance est importante. Tout d'abord, si vous appelez
<?php echo $this->getChildHtml() ?>
à partir d'un modèle, Magento rendra tous les blocs enfants, dans l'ordre.
Deuxièmement, il existe un type spécial de bloc appelé "liste de texte" (core/text_list
/Mage_Core_Block_Text_List
). Ces blocs rendent automatiquement tous leurs enfants, de nouveau dans l'ordre. Le bloc content
en est un exemple
<block type="core/text_list" name="content"/>
C'est pourquoi vous pouvez insérer des blocs dans content
et ils s'affichent automatiquement.
Ainsi, dans votre exemple ci-dessus, vous insérez des blocs dans le bloc root
. Le bloc root
est un bloc de modèle dont le modèle phtml utilise des appels getChildHtml
avec des paramètres explicites. Par conséquent, les attributs before
et after
ne font pas ce que vous (et beaucoup d'autres, y compris moi) souhaiteriez qu'ils fassent.