我有一种情况,Tinybrick称之为“高级打孔”,我似乎无法让它发挥作用。我们最近安装了Aheadworks的Subscriptions和Recurring Payments扩展程序。此扩展允许客户定期订购他们购买的产品,并扩展PayPal的重复配置文件的功能。为此,产品视图页面上的 addtocart 块需要是动态的。根据客户是否已登录以及相关产品的具体详细信息确定 addtocart 块中显示的内容。
使用Lightspeed打孔,我已经能够填充页面上的各种动态块(顶部链接,标题栏,相关产品等)。此块的问题在于它取决于Mage::registry('current_product')
值。当Lightspeed返回缓存页面时,它不会运行完整的Magento代码,并且未设置current_product
注册表值。我找不到办法让这项工作。
我发了一封电子邮件给Tinybrick并得到了以下回复:
对于像这样的高级打孔,您必须通过Controller中的API / SOAP进行调用。基本上,您可以拨打所需的任何信息,然后使用该信息显示您的动态内容。我个人从来没有像这样做过,但我们的首席开发人员告知我们可以这样做。
我回答了要求提供示例或更多信息,但尚未收到回复。我想我会在这里抛出一些东西,看看是否有人对此有任何经验并且可以提供一些帮助。
答案 0 :(得分:2)
当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
。你可以创建一个你需要的块。