Layout-Aktualisierung: Es kann kein untergeordneter Block in Layout-XML als Referenz hinzugefügt werden

8

Ich habe ein Problem, bei dem ich scheinbar keinen untergeordneten Block in eine Layout-XML-Datei einfügen kann. Was mache ich falsch, mylayout.xmlweil ich nicht laden kann abc? Ich habe die folgenden Dateien.

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
quelle

Antworten:

8

Wenn es sich um ein Problem beim Laden von Modulen handelt, sollten Sie Ihrer Moduldeklarationsdatei ein Tag hinzufügen. Wie unten

<depends> <companyname_modulename/> </depends>

Dadurch wird sichergestellt, dass Ihr Modul nach Firmenname_Modulenname geladen wird

Dhanpat Saran
quelle
4

Ich fand heraus warum. Meine Erweiterung wird zuerst geladen, und die Erweiterung, die onestepcheckout_index_index lädt, wird nach meiner geladen. Daher bezog sich mein Layout-Update auf ein Handle, das noch nicht existiert.

musicliftsme
quelle
4

Nur um das zu klären. Es waren mehrere Schritte erforderlich. Deklarieren Sie den Block zunächst als untergeordneten Block.

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

Fügen Sie dann die Abhängigkeit zu Ihrer Moduldeklarationsdatei hinzu. In meinem Fall war esIdev_OneStepCheckout

<depends>
    <Idev_OneStepCheckout />
</depends>

Schließlich funktioniert es in der Vorlage nur, wenn Sie den Alias ​​verwenden.

echo $this->getChildHtml('my_name')
Michael Thessel
quelle
2

Ich bin mir nicht sicher, warum das auch nicht funktioniert. Haben Sie versucht, den Block als Kind explizit zu deklarieren?

<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
quelle
Ich habe es versucht, aber es funktioniert immer noch nicht. Das Seltsame ist, dass ich andere Updates habe my layout.xml, die dieselbe Methode verwenden und alle funktionieren.
musicliftsme
1
Ich fand heraus warum. Meine Erweiterung wird zuerst onestepcheckout_index_indexgeladen , und die Erweiterung, die geladen wird, wird nach meiner geladen. Daher bezog sich mein Layout-Update auf ein Handle, das noch nicht existiert.
musicliftsme
@ Laketuna das ist sehr interessant, ich hatte vor kurzem ein ähnliches Problem und habe nur einen Beobachter benutzt, aber diese Frage hat meine Neugier wieder
geweckt
1

Wenn Sie einen neuen Block hinzufügen möchten, sollten Sie auf Strukturblöcke verweisen, nicht auf Inhaltsblöcke. Probieren Sie stattdessen so etwas aus:

<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
quelle
1
Bezieht sich auf das contentLaden meines Blocks, aber ich kann nicht steuern, wo der Block platziert wird, wenn ich auf `content verweise.
musicliftsme
Es wird platziert von<?php echo $this->getChildHtml('abc') ?>
Pronto
Ich muss diesen Block an einem bestimmten Ort platzieren. Soweit ich weiß, wird contentder Block durch Referenzieren automatisch platziert und echo $this->getChildHtml('abc')hat keine Auswirkung. Korrigiere mich, wenn ich falsch liege.
musicliftsme