使用 Tinybrick 的 Lightspeed 进行高级打孔

Posted

技术标签:

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

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

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

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

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

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

【问题讨论】:

【参考方案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,但它早就被删除了。有人有这个存档吗?

以上是关于使用 Tinybrick 的 Lightspeed 进行高级打孔的主要内容,如果未能解决你的问题,请参考以下文章

Mindscape.Lightspeed 错误:对象名称“KeyTable”无效

Mindscape.LightSpeed 数据库连接问题

Magento 的 Lightspeed 连接器 - 如何禁用来自 Lightspeed 的描述更新,以便它们仅在 Magento 中进行管理?

利奥博德FC750R键盘 - G613主控Lightspeed无线双模改造分享

具有复数和单数生成相同实体名称的 Lightspeed 数据库优先表

光速与 NHibernate