4

ミニカートブロックにブロック(ボタン)を追加しようとしています。子ブロックが自動的にタイプになるように、name="cart_sidebar"またはできればname="topCart.extra_actions"子ブロックをレンダリングするときに追加します。core/text_list

FPCが有効になっているためにブロックが製品ページで呼び出されないことを除いて、すべてがうまく機能します。Enterprise_PageCache_Model_Container_Advanced_Quoteクラスからコンテナを拡張しようとしています(同様に試しEnterprise_PageCache_Model_Container_Abstractました)が、_renderBlockメソッドが呼び出されません。

私のcache.xmlは正しく、有効なようです。

<?xml version="1.0" encoding="UTF-8"?>
<config>
    <placeholders>
        <internationalcheckout_international>
            <block>internationalcheckout/international</block>
            <name>internationalcheckout_international</name>
            <placeholder>INT_CHECKOUT</placeholder>
            <container>GSX_InternationalCheckout_Model_Container_Button</container>
            <cache_lifetime>84600</cache_lifetime>
        </internationalcheckout_international>
    </placeholders>
</config>

ヘルプやヒントをいただければ幸いです

4

2 に答える 2

18

動的ブロックのネスト

実行しようとしているのは、動的ブロックをネストすることです。つまり、動的ミニカートブロックには、ネストされた動的ブロックが含まれている必要がありますtype=internationalcheckout/international

これは、FPCプロセッサが動的ブロック(ホールパンチング)を実装する方法のために機能しません。

protected function _processContainers(&$content)
{
    $placeholders = array();
    preg_match_all(
        Enterprise_PageCache_Model_Container_Placeholder::HTML_NAME_PATTERN,
        $content, $placeholders, PREG_PATTERN_ORDER
    );

    // ...
    // ... if applyWithoutApp() on each placeholder then update content
    // ... else prepare data for applyWithApp()
    // ...

    }

FPC処理フロー

何が起こるかを段階的に見ていきましょう。

まず_processContainers()メソッドが呼び出されると、$contentすべてのプレースホルダータグを含むキャッシュされたページが含まれます。これには、定義したネストされたブロックも含まれます。

次に、メソッドはすべてのプレースホルダータグに一致します。この後$placeholders、ミニカートのプレースホルダーと、ネストされたプレースホルダーの定義が含まれます。

第三に、見つかったプレースホルダーは順番に処理されます。これは、ミニカートのプレースホルダーがネストされたプレースホルダーを処理する前に処理されることを意味します。これpreg_match_all()は、一致を収集する方法だからです。

第4に、ミニカートコンテナがインスタンス化されます。次に、checkout/cart_sidebarブロックをインスタンス化し、レンダラーを初期化して呼び出しますtoHtml()

5番目に、checkout / cart/cartheader.phtmlテンプレートがレンダリングされます。Magentoが電話に出たとき

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

の処理中に子ブロックが存在しapplyWithoutApp()ないため、コンテンツはレンダリングされません。applyWithApp()

第6に、FPCプロセッサは、ミニカートプレースホルダータグでマークされた完全なコンテンツ領域を、ミニカートコンテナによって返されるレンダリングされたコンテンツに置き換えます。これ$contentで、更新されたミニカートのhtmlが含まれます。

第7に、FPCコンテナーは、ネストされたブロックのプレースホルダーを処理しようとします。ただし、$contentにはプレースホルダータグが含まれなくなりました。ラッピングミニカートプレースホルダーを新しく生成されたコンテンツに置き換えることで、これらは削除されました。

概要

FPCがコンテンツを処理しているとき、レイアウトXMLはロードされず、通常のブロック階層はインスタンス化されません。
動的(「ホールパンチ」)ブロックの場合、ブロックインスタンス自体またはコンテナがレイアウトXMLをロードせずにインスタンス化を処理しない限り、子ブロックからのすべての出力が削除されます。
FPCがページコンテンツを処理している間にレイアウトXMLをロードし、すべてのブロックを生成することは、パフォーマンスの面で悪い考えです。

つまり、topCart.extra_actionsコンテナブロックは良いアイデアのように見えますが、FPCとは互換性がありません:(

動的ブロック内で子ブロックを使用することはできません。

回避策を実装するには、ブロックをブロックの外に移動する必要がありますcart_sidebar

于 2012-12-12T08:07:18.907 に答える
2

extra_actions PayPal ボタンの解決策を探している人には、それを修正する Magento パッチ (SUPEE-87_1.12.0.0_v1.patch) があります。

これは Magento パッチであるため、「app/code/core/Enterprise/PageCache/Model/Container/Sidebar/Cart.php」ファイルを開き、_renderBlock 関数の後にこれら 2 つの関数を追加するだけで済みます。これはまさにパッチが行うことです。 :

    /**
 * Get Place Holder Block
 *
 * @return Mage_Core_Block_Abstract
 */
protected function _getPlaceHolderBlock()
{
    $block = parent::_getPlaceHolderBlock();
    $block->setChild('extra_actions', $this->_getExtraActionsChildBlock());
    return $block;
}

/**
 * Get child Block
 *
 * @return Mage_Core_Block_Abstract
 */
protected function _getExtraActionsChildBlock()
{
     $paypalShortcutBlock = Mage::app()->getLayout()->createBlock('paypal/express_shortcut');
     $paypalShortcutBlock->setTemplate('paypal/express/shortcut.phtml');
     $paypalShortcutBlock->setLayout(Mage::app()->getLayout());

     return $paypalShortcutBlock;
}

これがどのように機能するかを理解すると、他の同様の問題にも役立ちます。

ちなみに、Vinaiに感謝します。非常に有益な回答です。

于 2014-01-03T20:18:29.693 に答える