使用 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.php
在var/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')->setStoreId(Mage::app()->getStore()->getId())->loadByRequestPath($url);
然后我可以调用$urlRW->getProductId()
,如果存在,加载产品并设置注册表值。它仍然没有正确格式化结果,但我已经取得了进展。谢谢!
@BrianVPS 不客气。是的,我忘了提到我在答案中输入的示例来自 Magento 1.3,您必须对其进行调整。我很高兴听到您得到了有效的解决方案。
有一篇关于使用这个缓存的博文 - web.archive.org/web/20130724072347/http://… 它有示例文件 - HolePunching_Example.zip,但它早就被删除了。有人有这个存档吗?以上是关于使用 Tinybrick 的 Lightspeed 进行高级打孔的主要内容,如果未能解决你的问题,请参考以下文章
Mindscape.Lightspeed 错误:对象名称“KeyTable”无效
Magento 的 Lightspeed 连接器 - 如何禁用来自 Lightspeed 的描述更新,以便它们仅在 Magento 中进行管理?
利奥博德FC750R键盘 - G613主控Lightspeed无线双模改造分享