2

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

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

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

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

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

4

1 回答 1

2

lightspeed.php在目录中看到相应的缓存文件时var/lightspeed,它会加载并解析。现在它看到,有些内容需要是动态的。因此,通过之前更改lightspeed.php的方式向 Magento 发出虚假的 GET 请求。看看下面的代码:Mage::run()$_REQUEST['URI']

光速.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']. 下面我们一起来看看

孔控制器.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在注册表中。您可以创建所需的块。

于 2013-01-11T05:11:11.690 回答