【问题标题】:Advanced hole punching with Tinybrick's Lightspeed使用 Tinybrick 的 Lightspeed 进行高级打孔
【发布时间】:2012-12-25 07:19:38
【问题描述】:

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

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

我向 Tinybrick 发送了一封电子邮件,得到了以下回复:

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

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

【问题讨论】:

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


    【解决方案1】:

    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。您可以创建所需的块。

    【讨论】:

    • 谢谢,这是一个很好的解释。我最终做了类似的事情。我们启用了 SEO URL 重写,因此产品页面的 URL 不包含产品 ID 作为参数。我可以通过将路径传递给core/url_rewrite 来获取它,如下所示:$urlRW = Mage::getModel('core/url_rewrite')-&gt;setStoreId(Mage::app()-&gt;getStore()-&gt;getId())-&gt;loadByRequestPath($url); 然后我可以调用$urlRW-&gt;getProductId(),如果存在,加载产品并设置注册表值。它仍然没有正确格式化结果,但我已经取得了进展。谢谢!
    • @BrianVPS 不客气。是的,我忘了提到我在答案中输入的示例来自 Magento 1.3,您必须对其进行调整。我很高兴听到您得到了有效的解决方案。
    • 有一篇关于使用这个缓存的博文 - web.archive.org/web/20130724072347/http://… 它有示例文件 - HolePunching_Example.zip,但它早就被删除了。有人有这个存档吗?
    猜你喜欢
    • 1970-01-01
    • 2011-07-18
    • 1970-01-01
    • 2014-12-28
    • 1970-01-01
    • 1970-01-01
    • 2015-10-20
    • 2012-07-21
    相关资源
    最近更新 更多