Mise à jour de la mise en page: impossible d'ajouter un bloc enfant dans la mise en page XML par référence


8

J'ai un problème où je n'arrive pas à ajouter un bloc enfant dans un fichier XML de mise en page. Qu'est-ce que je fais mal mylayout.xmlparce que je ne peux pas charger abc? J'ai les fichiers suivants.

onestepcheckout.xml

<onestepcheckout_index_index>
    ...
    <reference name="content">
        <block type="onestepcheckout/checkout" name="onestepcheckout.checkout" template="onestepcheckout/checkout.phtml">
            ...
            <!-- this child block can be loaded -->
             <block type="block/class" template="path/to/template/template.phtml" name="qwe" as="qwe" />
            ...
        </block>
    </reference>
    ...
</onestepcheckout_index_index>

mylayout.xml

<onestepcheckout_index_index>
    <reference name="onestepcheckout.checkout">
        <!-- this child block can not be loaded -->
        <block type="block/class" template="path/to/template/template.phtml" name="abc" as="abc" />
    </reference>
</onestepcheckout_index_index>

checkout.phtml

...
<?php echo $this->getChildHtml('abc') // doesn't work ?>
<?php echo $this->getChildHtml('qwer') // works ?>
...

Réponses:


8

Si c'est un problème de chargement de module, je pense que vous devriez ajouter une balise dans votre fichier de déclaration de module. comme ci-dessous

<depends> <companyname_modulename/> </depends>

Cela garantira que votre module sera chargé après companyname_modulename


4

J'ai découvert pourquoi. Mon extension se charge d'abord, et l'extension qui se charge sur onstepcheckout_index_index est chargée après la mienne. Par conséquent, ma mise à jour de la mise en page faisait référence à une poignée qui n'existe pas encore ..


4

Juste pour clarifier cela. Plusieurs étapes ont été nécessaires. Tout d'abord, déclarez le bloc en tant que bloc enfant.

<action method="setChild"><alias>my_name</alias><child>my.name</child></action>

Ajoutez ensuite la dépendance à votre fichier de déclaration de module. Dans mon cas, c'étaitIdev_OneStepCheckout

<depends>
    <Idev_OneStepCheckout />
</depends>

Enfin, dans le modèle, cela ne fonctionnera que si vous utilisez l'alias.

echo $this->getChildHtml('my_name')

2

Je ne sais pas pourquoi cela ne fonctionne pas non plus. Avez-vous essayé de déclarer explicitement le bloc en tant qu'enfant?

<onestepcheckout_index_index>
    <reference name="onestepcheckout.checkout">
        <!-- this child block can not be loaded -->
        <block type="block/class" template="path/to/template/template.phtml" name="abc" as="abc" />
        <action method="setChild"><child>abc</child><alias>abc</alias></action>
    </reference>
</onestepcheckout_index_index>

Je l'ai essayé, mais cela ne fonctionne toujours pas. Ce qui est étrange, c'est que j'ai d'autres mises à jour my layout.xmlqui utilisent la même méthode, et elles fonctionnent toutes.
musicliftsme

1
J'ai découvert pourquoi. Mon extension se charge d'abord, et l'extension qui se charge onestepcheckout_index_indexest chargée après la mienne. Par conséquent, ma mise à jour de la mise en page faisait référence à une poignée qui n'existe pas encore ..
musicliftsme

@laketuna c'est très intéressant, j'ai eu un problème similaire récemment et je viens d'utiliser un observateur, mais cette question a de nouveau éveillé ma curiosité, merci
pzirkind

1

Si vous souhaitez ajouter un nouveau bloc, vous devez référencer les blocs structurels, pas les blocs de contenu. Essayez plutôt quelque chose comme ceci:

<onestepcheckout_index_index>
    <reference name="content">
        <block type="block/class" template="path/to/template/template.phtml" name="abc" as="abc" />
    </reference>
</onestepcheckout_index_index>

1
Se référant à contentcharge mon bloc, mais je ne peux pas contrôler où le bloc est placé si je me réfère au `contenu.
musicliftsme

Il est placé par<?php echo $this->getChildHtml('abc') ?>
Pronto

J'ai besoin de placer ce bloc à un endroit spécifique. Pour autant que je sache, le référencement contentplace automatiquement le bloc et echo $this->getChildHtml('abc')n'a aucun effet. Corrige moi si je me trompe.
musicliftsme
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.