レイアウトの更新:参照によりレイアウトXMLに子ブロックを追加できません


8

レイアウトXMLファイルに子ブロックを追加できないように見える問題があります。私はで間違って何をやっているmylayout.xml私はロードできませんかabc?次のファイルがあります。

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

回答:


8

モジュールの読み込みに問題がある場合は、モジュール宣言ファイルにタグを追加する必要があると思います。以下のように

<depends> <companyname_modulename/> </depends>

これにより、companyname_modulenameの後にモジュールが確実にロードされます。


4

理由がわかりました。私の拡張機能が最初に読み込まれ、onestepcheckout_index_indexを読み込む拡張機能が私の拡張機能の後に読み込まれます。したがって、私のレイアウトの更新は、まだ存在しないハンドルを参照していました。


4

これを明確にするために。いくつかのステップが必要でした。最初に、ブロックを子ブロックとして宣言します。

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

次に、依存関係をモジュール宣言ファイルに追加します。私の場合、それはIdev_OneStepCheckout

<depends>
    <Idev_OneStepCheckout />
</depends>

最後に、テンプレートでは、エイリアスを使用する場合にのみ機能します。

echo $this->getChildHtml('my_name')

2

それがうまくいかない理由がわかりません。ブロックを子として明示的に宣言してみましたか?

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

試してみましたが、うまくいきません。奇妙なことにmy layout.xml、同じ方法を使用する他のアップデートがあり、それらはすべて機能します。
musicliftsme 14年

1
理由がわかりました。私の拡張機能が最初にonestepcheckout_index_indexロードされ、ロードする拡張機能が私の拡張機能の後にロードされます。したがって、私のレイアウトの更新は...まだ存在しないハンドルに言及していた
musicliftsme

@laketunaは非常に興味深いです。最近同様の問題が発生し、オブザーバーを使用しただけでしたが、この質問は再び好奇心を刺激しました。ありがとう
pzirkind

1

新しいブロックを追加する場合は、コンテンツブロックではなく、構造ブロックを参照する必要があります。代わりに次のようなものを試してください:

<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
を参照するとcontentブロックが読み込まれますが、 `contentを参照すると、ブロックが配置される場所を制御できません。
musicliftsme

配置場所<?php echo $this->getChildHtml('abc') ?>
Pronto

このブロックを特定の場所に配置する必要があります。私の知る限り、参照contentはブロックを自動的に配置し、echo $this->getChildHtml('abc')効果はありません。私が間違っていたら訂正してください。
musicliftsme 14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.