使用Tinybrick的Lightspeed进行高级打孔

时间:2013-01-10 19:30:51

标签: php magento caching magento-1.5 hole-punching

我有一种情况,Tinybrick称之为“高级打孔”,我似乎无法让它发挥作用。我们最近安装了Aheadworks的Subscriptions和Recurring Payments扩展程序。此扩展允许客户定期订购他们购买的产品,并扩展PayPal的重复配置文件的功能。为此,产品视图页面上的 addtocart 块需要是动态的。根据客户是否已登录以及相关产品的具体详细信息确定 addtocart 块中显示的内容。

使用Lightspeed打孔,我已经能够填充页面上的各种动态块(顶部链接,标题栏,相关产品等)。此块的问题在于它取决于Mage::registry('current_product')值。当Lightspeed返回缓存页面时,它不会运行完整的Magento代码,并且未设置current_product注册表值。我找不到办法让这项工作。

我发了一封电子邮件给Tinybrick并得到了以下回复:

  

对于像这样的高级打孔,您必须通过Controller中的API / SOAP进行调用。基本上,您可以拨打所需的任何信息,然后使用该信息显示您的动态内容。我个人从来没有像这样做过,但我们的首席开发人员告知我们可以这样做。

我回答了要求提供示例或更多信息,但尚未收到回复。我想我会在这里抛出一些东西,看看是否有人对此有任何经验并且可以提供一些帮助。

1 个答案:

答案 0 :(得分:2)

lightspeed.phpvar/lightspeed目录中看到相应的缓存文件时,它会加载并解析。现在它看到,一些内容需要是动态的。因此,lightspeed.php通过Mage::run()向Magento发出虚假GET请求,之前已更改$_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。你可以创建一个你需要的块。