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 ?>
...
musicliftsme
la source

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

Dhanpat Saran
la source
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 ..

musicliftsme
la source
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')
Michael Thessel
la source
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>
Don
la source
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>
Pronto
la source
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