Magento Core:1つのハンドルで同一のブロック名


7

「persistent.remember.me」というブロック名のテンプレートを変更したいのですが、同じハンドルの下に同じ名前の2つのブロックがあります。

app / design / frontend / base / default / layout / persistent.xml

<checkout_onepage_index>
    <reference name="checkout.onepage.login">
        <action method="setTemplate"><template>persistent/checkout/onepage/login.phtml</template></action>
        <block type="persistent/form_remember" name="persistent.remember.me" template="persistent/remember_me.phtml" />
    </reference>
    <reference name="checkout.onepage.billing">
        <action method="setTemplate"><template>persistent/checkout/onepage/billing.phtml</template></action>
        <block type="persistent/form_remember" name="persistent.remember.me" template="persistent/remember_me.phtml" />
        <block type="core/template" name="persistent.remember.me.tooltip" template="persistent/remember_me_tooltip.phtml" />
    </reference>
</checkout_onepage_index>

次の内容でlocal.xmlを作成しました。

app / design / frontend / mytheme / default / layout / local.xml

<checkout_onepage_index>
    <reference name="persistent.remember.me">
        <action method="setTemplate"><template>mytheme/persistent/remember_me.phtml</template></action>
    </reference>
</checkout_onepage_index>

そして、すべてが正常に動作します。最後の参照のテンプレート( "checkout.onepage.billing")のみが更新されます。これはまさに私が望んでいることですが、なぜこれが行われるのかはわかりません。ブロック名は常に一意である必要があるという印象を受けました。これはMagentoのバグですか?Magentoをアップグレードすると、このコードはどうなりますか?

回答:


5

Erfanは、HTMLが2回出力されることを正しく、1回は「checkout.onepage.login」の子として、もう1回は「checkout.onepage.billing」の子として

したがって、同じ名前の2つの子ブロックがあります。それぞれに異なるテンプレートを設定でき、それぞれが親の子としてレンダリングされます。

いずれかの親ブロックの永続ブロックを変更するには、次のように親ブロックを直接ターゲットにする必要があります。

<checkout_onepage_index>
    <reference name="checkout.onepage.login">
            <block type="persistent/form_remember" name="persistent.remember.me" template="my/custom/template.phtml" />
        </reference>
</checkout_onepage_index>

上記は、ログインブロックのテンプレートのみを変更します。

子ブロック「persistent.remember.me」のみを対象とする場合、magentoは最初に見つかったブロックの出現のみを変更するようです。投機を開始:これは、順序またはアルファオカレンスである可能性が最も高く、「checkout.onepage.login」の前に「checkout.onepage.billing」がアルファベット順に表示され、ブロックを内部に格納するために使用される配列にあります。.billingが.loginの後にレンダリングされるという事実は、2番目のオカレンスのみを変更しているように見えるだけです。:) 投機を終了


4

いいえ、これはバグではありません。サイトには「checkout.onepage.billing」と「checkout.onepage.login」のブロックが1つしかないと思います。

したがって、「persistent.remember.me」というブロックは1つしかありません。


しかし、HTMLは2回出力されますか?また、app / design / frontend / mytheme / default / mytheme / persistent / remember_me.phtmlで何かを変更すると、最後の1つだけが変更されますか?app / design / frontend / base / default / persistent / remember_me.phtmlを変更すると、最初の1つだけが変更されます...
Erfan

同じ名前の2つのブロックが同じページに出力される別の例は、checkout_cart_indexハンドルのカートにあります。checkout.cart.top_methodsとcheckout.cart.methodsの両方に、checkout.cart.methods.onepageという名前のブロックがあります。
pcronin 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.