3

さまざまなチュートリアルを試しましたが、これを機能させることができません。

基本的に、ホームページに別のフッターを付けたいと思っています。2 つのページ レイアウトを設定し、cms ページに適用しました。

だから私が参照するホームページのレイアウトで...

<?php echo $this->getChildHtml('footer_home') ?>

そして、他のすべてのページでは、これ...

<?php echo $this->getChildHtml('footer_alt') ?>

ものすごく単純!次に、ページxmlで、フッターを参照する部分を次のように修正しました...

            <block type="page/html_footer" name="footer_alt" as="footer_alt" template="page/html/footer_alt.phtml">
            <block type="page/html_wrapper" name="bottom.container" as="bottomContainer" translate="label">
                <label>Page Footer</label>
                <action method="setElementClass"><value>bottom-container</value></action>
            </block>
            <block type="page/switch" name="store_switcher" as="store_switcher" template="page/switch/stores.phtml"/>
            <block type="page/template_links" name="footer_links" as="footer_links" template="page/template/links.phtml"/>
        </block>


          <block type="page/html_footer" name="footer_home" as="footer_home" template="page/html/footer_home.phtml">
            <block type="page/html_wrapper" name="bottom.container" as="bottomContainer" translate="label">
                <label>Page Footer2</label>
                <action method="setElementClass"><value>bottom-container</value></action>
            </block>
            <block type="page/switch" name="store_switcher" as="store_switcher" template="page/switch/stores.phtml"/>
            <block type="page/template_links" name="footer_links" as="footer_links" template="page/template/links.phtml"/>
        </block>

ここに問題があると思います。上記のすべてのページで「footer_alt」フッターが表示されますが、その理由はわかりません。

「page/html/footer_alt.phtml」と「page/html/footer_home.phtml」が正しく設定されていることを確認できます。

それが理にかなっていることを願っています。ありがとう。

4

3 に答える 3

8

これらの答えはすべて、簡単解決策としては複雑すぎます。書き直しはやり過ぎです。Magento コアの書き換えは、たとえ適切に行われたとしても、常に警告を発し、その開発者に Magento ソースを徹底的に読ませる必要があります。私の経験では、すべての Magento の心痛には、謎めいたが完全に満足のいく解決策が伴います。これは、満足のいく解決策を備えた心痛の1つです。

フッター テンプレートが一意のキャッシュ キーを生成しないようにすることを Magento が任意に決定したことは驚くことではありません。これは、読み込まれたサイトのセクションに応じてフッターを変えることができないことを意味します。明確にするために、実際には可能ですが、ブロックキャッシュが無効になっている場合のみです。ただし、ブロック キャッシュを無効にすべきではないため、最終的には、サイト全体で 1 つのフッターに制限することと同じです。

サイトのさまざまな部分に別のフッターが必要な正当なユース ケースがあります。たとえば、チェックアウトでは、チェックアウトは没入型で気が散らないものにする必要があります。ただし、サイトの任意のページが表示されると、それらのページのフッターがキャッシュされ、チェックアウト時に同じフッターが表示されます。

ここで説明する解決策には、コアの書き換えが必要ですが、これは良くありません。または、いくつかの条件を超えて合理的に拡張できないその他の条件付きチェックも必要です。

私の解決策は簡単です。新しいテンプレートに cacheKey を追加します。特定のページのレイアウト ハンドルをターゲットにし、フッターを参照し、テンプレートを設定してから、cacheKey を追加します。これは標準の Magento レイアウト XML です。このレイアウト XML は、1 ページ チェックアウトのフッターを変更します (1 ページ チェックアウトのみ)。さらに、キャッシュは、この方法で定義されたすべての一意のフッターに対して引き続き機能します。

    <checkout_onepage_index>
        <reference name="footer">
            <action method="setTemplate">
                <template>linusmoneymaker/page/html/checkout-footer.phtml</template>
            </action>
            <action method="setCacheKey">
                <key>your-own-unique-cache-key-for-linus-moneymaker</key>
            </action>
        </reference>
    </checkout_onepage_index>

これは次の理由で機能します。app/code/core/Mage/Core/Block/Abstract.phpすべてのブロック キャッシングを処理するのソースは次のとおりです。

/**
 * Get Key for caching block content
 *
 * @return string
 */
public function getCacheKey()
{
    if ($this->hasData('cache_key')) {
        return $this->getData('cache_key');
    }
    /**
     * don't prevent recalculation by saving generated cache key
     * because of ability to render single block instance with different data
     */
    $key = $this->getCacheKeyInfo();
    //ksort($key);  // ignore order
    $key = array_values($key); // ignore array keys
    $key = implode('|', $key);
    $key = sha1($key);
    return $key;
}

acacheKeyが定義されている場合、テンプレートごとの unique を生成しないgetCacheKeyInfoin のメソッドから生成されるものよりも優先されることに注意してください。レイアウト XML からを提供することにより、Magentoは、サイトの特定の部分のレイアウト XML を介して手動で提供されるものを優先して、デフォルトの一意でないフッターを効果的に破棄します。app/code/core/Mage/Page/Block/Html/Footer.phpcacheKeycacheKeycacheKey

これは適切な方法であるだけでなく、無限に拡張できます。サイトのすべてのページは、独自のフッターを現実的に定義できます。

于 2015-12-07T21:55:08.043 に答える