web-dev-qa-db-fra.com

Magento XML utilisant avant / après pour placer des blocs ne fonctionne presque jamais

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

41
mike-source

Les attributs before et after ne fonctionnent que dans l'un des deux cas suivants:

  1. Lorsque vous insérez dans un core/text_list bloquer
  2. Lorsque votre bloc de modèle appelle getChildHtml sans aucun paramètre

Quand 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 bloc root.

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.

86
Alan Storm