Aggiornamento del layout: impossibile aggiungere un blocco figlio nell'XML del layout per riferimento


8

Sto riscontrando un problema in cui non riesco ad aggiungere un blocco figlio in un file XML di layout. Cosa sto facendo di sbagliato in mylayout.xmlquanto non riesco a caricare abc? Ho i seguenti file.

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

Risposte:


8

Se si tratta di un problema di caricamento del modulo, penso che dovresti aggiungere un tag nel tuo file di dichiarazione del modulo. come sotto

<depends> <companyname_modulename/> </depends>

Questo assicurerà che il tuo modulo verrà caricato dopo companyname_modulename


4

Ho scoperto il perché. La mia estensione viene caricata per prima e l'estensione che carica onestepcheckout_index_index viene caricata dopo la mia. Pertanto, il mio aggiornamento del layout si riferiva a un handle che non esiste ancora.


4

Giusto per chiarire questo. Sono stati necessari diversi passaggi. Innanzitutto, dichiarare il blocco come blocco secondario.

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

Quindi aggiungere la dipendenza al file di dichiarazione del modulo. Nel mio caso lo eraIdev_OneStepCheckout

<depends>
    <Idev_OneStepCheckout />
</depends>

Infine, nel modello funzionerà solo se si utilizza l'alias.

echo $this->getChildHtml('my_name')

2

Non sono sicuro del perché neanche questo funzioni. Hai provato a dichiarare esplicitamente il blocco da bambino?

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

L'ho provato, ma non funziona ancora. La cosa strana è che ho altri aggiornamenti my layout.xmlche usano lo stesso metodo e funzionano tutti.
musicliftsme,

1
Ho scoperto il perché. La mia estensione viene caricata per prima e l'estensione che onestepcheckout_index_indexviene caricata viene caricata dopo la mia. Pertanto, il mio aggiornamento del layout si riferiva a un handle che non esiste ancora ..
musicliftsme,

@laketuna è molto interessante, ho avuto un problema simile di recente e ho appena usato un osservatore, ma questa domanda ha suscitato nuovamente la mia curiosità, grazie
pzirkind

1

Se si desidera aggiungere un nuovo blocco, è necessario fare riferimento ai blocchi strutturali, non ai blocchi di contenuto. Prova invece qualcosa del genere:

<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
Facendo riferimento a contentcarica il mio blocco, ma non posso controllare dove viene posizionato il blocco se mi riferisco a `contenuto.
musicliftsme,

Viene inserito da<?php echo $this->getChildHtml('abc') ?>
Pronto il

Devo posizionare questo blocco in una posizione specifica. Per quanto ne so, il riferimento contentposiziona automaticamente il blocco e echo $this->getChildHtml('abc')non ha alcun effetto. Correggimi se sbaglio.
musicliftsme,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.