Magento添加到购物车问题缓存新产品

时间:2013-12-13 10:17:34

标签: magento caching cron product

我在主页的新产品小部件中添加购物车功能时遇到问题。通过点击“添加到购物车”它加载/结帐/购物车/页面,但我收到“购物车是空的!”。我检查了JS问题,但我没有任何错误,也在系统日志中。 在缓存管理中,如果我只禁用BLOCK_HTML缓存,它可以正常工作;如果我重新启用它我有问题

该网站由siteground托管,实际上我在cron中: 每25分钟:php /home/ledsuper/public_html/cron.php>的/ dev / null的 每30分钟:/ bin / sh /home/ledsuper/public_html/cron.sh

导致问题的原因是什么?怎么办才能解决? THX

5 个答案:

答案 0 :(得分:8)

这个问题似乎是Cache正在存储“新产品”块,其中包含带有“添加到购物车”链接的新产品,其中包含旧的(不正确的)表单密钥

什么是表单键

这是一种防范XSS攻击的机制,恶意攻击者可以在您使用其他浏览器标签时为您的购物车添加内容,甚至可以为您完成订单。这取决于可预测的URL,因为该站点无法访问您的Magento订单等待的浏览器选项卡中的实际HTML内容。然而,发送到Magento商店的所有内容都会提交您的Cookie,从而使用您的会话。通过为每个表单或在服务器上生成操作的每个链接添加唯一键,URL或表单内容将变得不再可预测。表单密钥存储在会话数据中,并在提交给服务器时进行验证。如果它们不匹配 - 您会收到表单键错误并且操作未完成。

问题在这里

这就是新产品小部件中Magento 1.8中实现的添加到购物车的方式会产生表单键错误,因为它会将新产品列表与“添加到购物车”链接一起缓存,其中包含首先请求页面的用户的表单密钥。

为什么在您不使用缓存时不会显示此问题

生成阻止后,使用product/widget/new/content/new_grid.phtml中定义的方法$this->getAddToCartUrlcode/core/Mage/Catalog/Block/Product/Abstract.php中创建添加到购物车链接,该方法将form_key添加到网址。

提议的解决方案

我可以想到三个选项

  1. 简单的一点是将窗口小部件缓存生命周期设置为1,所以它 根本不缓存它。 (确保在此更改后刷新所有缓存。)这样做的(大)缺点是 对于每个页面加载,都会调用重新渲染块 加载集合。
  2. 仅为添加到购物车按钮创建子块,该按钮根本不缓存。
  3. 通过编辑product/widget/new/content/new_grid.phtml更改链接,并使用href替换产品页面的“添加到购物车”按钮,以便将用户重定向到产品页面,而不是将产品添加到购物车,他们在哪里添加产品。如果您对工作流程没有问题,这可能是最简单的。

答案 1 :(得分:5)

离开Magento"阻止HTML输出"最好离开Magento"阻止HTML输出"启用缓存以提高网站性能。您可以添加" cache_lifetime"新产品上的节点阻止并将其设置为允许的最小值(1秒)。最后,您的块代码应如下所示:

{{block type="catalog/product_new" name="home.catalog.product.new" alias="product_homepage" template="catalog/product/new.phtml" _productsCount="8" cache_lifetime="1"}}

这将有效地保持新产品块不缓存,同时安全地保持所有其他HTML块元素像往常一样缓存,因此添加到购物车缓存新产品不会有任何问题。

答案 2 :(得分:2)

我使用Anonymous的答案并修改它以符合我的目的。这是一种丑陋的黑客但它确实有效(需要放在head.phtml和文件中的相关位置):

<script type = "text/javascript"> jQuery(document).ready(function () {
    var fkey = "<?php echo Mage::getSingleton('core/session')->getFormKey(); ?>";
    var onclickold = jQuery(".btn-cart").first().attr("onclick");
    var fkeyold = onclickold.replace(/.*\/form_key\/([a-zA-Z0-9]+)\/.*/,  '$1');
    jQuery(".btn-cart").each(function() {
        var onclick = jQuery(this).attr("onclick");
        if (typeof onclick !== typeof undefined && onclick !== false && onclickold !== fkeyold) {
            var onclick2 = onclick.replace(fkeyold, fkey);
            jQuery(this).attr("onclick", onclick2);
        }
    });
});</script>

答案 3 :(得分:1)

或者你可以使用这个

<script type = "text/javascript" > jQuery(document).ready(function () {
    var fkey = "<?php echo Mage::getSingleton('core/session')->getFormKey(); ?>";
    var fkeyold = jQuery('[name="form_key"]').val();
    jQuery('[name="form_key"]').val(fkey);
    var action = jQuery('#product_addtocart_form').attr('action');
    var action2 = action.replace(fkeyold, fkey);
    jQuery('#product_addtocart_form').get(0).setAttribute('action', action2);
});</script>

答案 4 :(得分:0)

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){
    //then set status bar color or any thing else
}

您可以将上述代码作为模块 这对我有用。但我没有把它作为一个模块。我直接更新了以下文件

 if (!($formKey = $this->getRequest()->getParam('form_key', null)) || $formKey != Mage::getSingleton('core/session')->getFormKey()) {
                $this->getRequest()->setParams(array('form_key' =>Mage::getSingleton('core/session')->getFormKey()));
     }   

有一个功能

app/code/core/Mage/Checkout/controllers/CartController.php 将上述代码粘贴到所有内容中。