【问题标题】:Magento - Add a product to the cart via query string without form_key parameterMagento - 通过不带 form_key 参数的查询字符串将产品添加到购物车
【发布时间】:2023-04-02 21:55:01
【问题描述】:

我刚刚安装了 Magento Community Edition ver 1.8.0.0(默认设置)。

系统 -> 配置 -> 销售 -> 结帐 -> 结帐选项
启用单页结帐:是
允许访客结帐:是

我正在尝试使用查询字符串方法将产品添加到购物车。
根据我找到的所有资源,这些是正确的方法:

[store]/checkout/cart/add/product/1/
[store]/checkout/cart/add?product=1&qty=1

但他们不工作......购物车仍然是空的。

经过一段时间,我找到了可行的解决方案:

[store]/checkout/cart/add/product/1/form_key/yu6b5VEzwSU2V7YE/

但是,我希望form_key 参数放入 url。
在我的情况下,不需要此安全功能。

例如,没有 form_key 的产品比较可以正常工作:

[store]/catalog/product_compare/add/product/1/

这个想法是在其他一些网站上放置一个静态链接(因此动态生成的 form_key 是未知的),因此如果客户点击它,他会立即被重定向到购物车已满的商店。

是否可以去掉 form_key 参数,仍然可以将产品添加到购物车?如果是这样,那怎么办?

【问题讨论】:

    标签: magento


    【解决方案1】:

    这一步不是很复杂!希望这有帮助。

    //Namespace need to change with your namespace
    //AddProduct need to change with your module name
    class Namespace_AddProduct_AddController extends Mage_Core_Controller_Front_Action {
        public function indexAction() {
                $product_id = $this->getRequest()->getParam('products');
                $qty = $this->getRequest()->getParam('qty');  //used if your qty is not hard coded
                $cart = Mage::getModel('checkout/cart');
                $cart->init();
                if ($product_id == '') {
                    continue;
                }
                $productModel = Mage::getModel('catalog/product')->load($product_id);
    
                //I added only Virtual product here. If no need, remove this condtion
                if ($productModel->getTypeId() == Mage_Catalog_Model_Product_Type::TYPE_VIRTUAL) {
                    try
                    {
                       $cart->addProduct($productModel, array('qty' => '1'));  //qty is hard coded
                    }
                    catch (Exception $e) {
                       continue;
                    }
                }
                $cart->save();
                if ($this->getRequest()->isXmlHttpRequest()) {
                   exit('1');
                }
                 $this->_redirect('checkout/cart');
        }
    }
    

    【讨论】:

    • 我想知道是否可以在配置中的某处将 form_key 设置为不需要的,或者使用不同的 url 而不是以编程方式解决它。在这种情况下,我会在使用 Mage::getSingleton('core/session')->getFormKey() 将产品添加到购物车之前插入 form_key 或使用 _validateFormKey() 方法跳过验证。
    • 你如何实现这个?
    【解决方案2】:

    我所做的是用自定义模块覆盖 Magento CartController。 我在里面创建了一个文件: \app\code\local\Namespace\AddProductFromUrl\controllers\Checkout\CartController.php

    <?php
        require_once 'Mage/Checkout/controllers/CartController.php';
        class Namespace_AddProductFromUrl_Checkout_CartController extends Mage_Checkout_CartController {
            # overloaded addAction
            public function addAction() {        
                // generate form_key if missing or invalid
                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()));
                }        
    
                // do parent actions
                parent::addAction();
            }
        }
    ?>
    

    (对于每个 magento 自定义模块,该模块需要具有 config.xml 并在 etc/modules/ 下启用。将 Namespace 更改为您使用的模块。)

    这与 magento 1.7 一样完美,并且影响最小; form_key 会在丢失时生成,仅此而已。

    【讨论】:

    • 我得说我也是这样做的。
    • 无论出于何种原因,这对我来说不适用于 CE 1.9.0.1。有什么改变吗?我创建了这个文件,位于 AddProductFromUrl/etc 和 app/etc/modules/Namespace_AddProuctFromUrl.xml 下的 config.xml。我可以在 Sys > Config > Advanced > Advanced modules 部分看到它。
    【解决方案3】:

    这在 Magento C 1.8 中最适合我

    <?php
     
    $formKey = Mage::getSingleton('core/session')->getFormKey();?>
    
    <form action="/checkout/cart/add/product/<?php echo $productid; ?>" method="post">
        <input type="hidden" name="form_key" value="<?php echo $formKey; ?>" />
    
        <input type="text" name="qty"> QTY
    
        <input type="submit" value="Add to basket" />
    </form>
    

    【讨论】:

      【解决方案4】:

      这就是我在 Magento 1.8.1 中的做法

      &lt;a href="&lt;?= $this-&gt;getAddtoCartUrl($_product, array('qty' =&gt; $_price['price_qty'])) ?&gt;"&gt;

      http://docs.magentocommerce.com/Mage_Catalog/Mage_Catalog_Block_Product_Abstract.html#getAddToCartUrl

      【讨论】:

        【解决方案5】:

        最后我实际上所做的是将新更改与旧代码进行比较,我发现添加到购物车按钮设置为 type="button" 并且没有提交。

        将按钮更改为简单地 type="submit" 并且没有其他更改实际上使它起作用 这是在 [theme]/template/catalog/product/view/addtocart

        如果不存在,可能必须从基本文件夹中移出

        【讨论】:

          【解决方案6】:

          在 Magento 网站的任何位置为您的产品使用“添加到购物车”链接::

          以下代码可能会有所帮助:

          $product = Mage::getModel('catalog/product')->load($YourProductID);
          
          echo Mage::helper('checkout/cart')->getAddUrl($product);
          

          从magento 1.8需要将表单键$formKey = Mage::getSingleton('core/session')-&gt;getFormKey();?&gt;添加到url

          【讨论】:

            【解决方案7】:

            以下可与数量集一起使用:

            $product = Mage::getModel('catalog/product')->load($getProductID);
            
            echo Mage::helper('checkout/cart')->getAddUrl($product, array('qty'=>$getQty));
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2023-03-10
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-05-18
              • 1970-01-01
              相关资源
              最近更新 更多