2

Tinybrick が「高度な穴あけ」と呼んでいる状況があり、それを機能させることができないようです。最近、Aheadworks のサブスクリプションと定期支払いの拡張機能をインストールしました。この拡張機能により、顧客は定期的に購入する製品を購読できるようになり、PayPal の定期的なプロファイルの機能が拡張されます。これが機能するには、製品ビュー ページのaddtocartブロックが動的である必要があります。顧客がログインしているかどうか、および問題の製品の特定の詳細に応じて、addtocartブロックに表示される内容が決まります。

Lightspeed ホール パンチングを使用して、ページ上のさまざまな動的ブロック (トップ リンク、ヘッダー カート、関連製品など) を埋めることができました。このブロックの問題は、Mage::registry('current_product')値に依存することです。Lightspeed がキャッシュされたページを返す場合、完全な Magento コードは実行されず、current_productレジストリ値は設定されません。これを機能させる方法が見つかりません。

Tinybrick にメールを送信したところ、次の応答が返ってきました。

このような高度な穴あけには、コントローラーで API / SOAP を介して呼び出しを行う必要があります。基本的に、必要な情報を呼び出して、その情報を使用して動的コンテンツを表示します。私は個人的にこのようなことをしたことはありませんが、主任開発者からそれが可能であると知らされました.

例や詳細情報を求めて返信しましたが、まだ返事がありません。誰かがこれについて何か経験があり、助けを提供できるかどうかを確認するために、ここに何かを投げると思いました.

4

1 に答える 1

2

ディレクトリ内にlightspeed.php対応するキャッシュ ファイルが表示されるvar/lightspeedと、それをロードして解析します。これで、一部のコンテンツを動的にする必要があることがわかりました。そのため、前に変更されlightspeed.phpた経由で Magento に偽の GET リクエストを行います。次のコードを見てください。Mage::run()$_REQUEST['URI']

lightspeed.php:

self::report("attempting to retrieve hole punched content from {$data[2]}");
$_SERVER['originalRequestUri'] = $_SERVER['REQUEST_URI'];
$_SERVER['REQUEST_URI'] = self::$request_path . "/" . $data[2];

にコピー$_SERVER['REQUEST_URI']する方法をここで見ることができます$_SERVER['originalRequestUri']。次に行って見てみましょう

HoleController.php:

    $originalRequest = new Mage_Core_Controller_Request_Http('http://example' . $_SERVER['originalRequestUri']);
    $originalRequest->setPathInfo()->setDispatched(false);
    Mage::getModel('core/url_rewrite')->rewrite($originalRequest);

    $params = explode('/', $originalRequest->getPathInfo());
    /* IF YOU HAVE SOME ADDITONAL PARAMS PASSED AS /color/1/size/2, 
       THIS PARAMS SHOULD BE ALSO PARSED AND SET TO REQUEST OBJECT
    for ($i = 3, $l = sizeof($params); $i < $l; $i+=2) {
        $originalRequest->setParam($params[$i], isset($params[$i + 1]) ? $params[$i + 1] : '');
    }
    */

    if ($params[1] == 'product') { // if parsed URL is product view page URL
        $productId = $originalRequest->getParam('id');
        $product = Mage::getModel('catalog/product')->load($productId);
        Mage::register('current_product', $product);
    }

わーい!これcurrent_productでレジストリができました。必要なブロックを作成できます。

于 2013-01-11T05:11:11.690 に答える