web-dev-qa-db-fra.com

Magento - Ajoute un produit au panier via une requête sans paramètre form_key

Je viens d'installer Magento Community Edition version 1.8.0.0 (paramètres par défaut).

Système -> Configuration -> Ventes -> Paiement -> Options de paiement
Activer le paiement en une page: Oui
Autoriser le départ des invités: Oui

J'essaie d'ajouter un produit au panier en utilisant la méthode de la chaîne de requête.
Selon toutes les ressources que j'ai trouvées, voici les bonnes manières de le faire: 

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

mais ils ne travaillent pas ... le chariot reste vide.

Après un certain temps, j'ai trouvé la solution de travail: 

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

Cependant, j'aimerais que pas mette form_key paramètre dans l'URL.
Cette fonctionnalité de sécurité n’est pas nécessaire dans mon cas.

Par exemple, la comparaison de produits fonctionne correctement sans form_key:

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

L'idée est de mettre un lien statique sur certains autres sites Web (le formulaire généré dynamiquement n'est pas connu), ainsi, si un client clique dessus, il est immédiatement redirigé vers le magasin avec un panier rempli.

Est-il possible de se débarrasser du paramètre form_key tout en pouvant ajouter un produit au panier? Et si oui, alors comment?

9
rafis

Ce que j'ai fait est de remplacer la CartController de Magento par un module personnalisé. J'ai créé un fichier dans: \app\code\local\Espace de noms\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();
        }
    }
?>

(Le module doit avoir le fichier config.xml et être activé sous etc/modules/ comme pour chaque module personnalisé magento. Changez Namespace avec celui que vous utilisez.)

Cela fonctionne parfaitement comme magento 1.7 et avec un impact minimal; le form_key est généré s'il manque et c'est tout.

8
andQlimax

Cela fonctionne mieux pour moi dans 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>
21
Stephen Dance

Cette étape n'est pas très compliquée! J'espère que cette aide. 

//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');
    }
}
3
D3ad L0cK

Utilisez le lien "Ajouter au panier" de votre produit où que vous soyez sur un site Web Magento ::

Le code suivant peut être utile:

$product = Mage::getModel('catalog/product')->load($YourProductID);

echo Mage::helper('checkout/cart')->getAddUrl($product);

De magento 1.8 besoin d'ajouter la clé de formulaire $formKey = Mage::getSingleton('core/session')->getFormKey();?> à l'URL

2
asishint

Voici comment je le fais dans Magento 1.8.1

<a href="<?= $this->getAddtoCartUrl($_product, array('qty' => $_price['price_qty'])) ?>">

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

1
danecando

Les éléments suivants peuvent être utilisés avec un ensemble de quantité:

$product = Mage::getModel('catalog/product')->load($getProductID);

echo Mage::helper('checkout/cart')->getAddUrl($product, array('qty'=>$getQty));
0
MagentoFormat

En fin de compte, ce que j’ai fait est de comparer les nouvelles modifications avec l’ancien code et j’ai découvert que le bouton Ajouter au panier était réglé sur type = "bouton" et ne soumettait pas. 

Changer le bouton pour simplement taper = "submit" et aucune autre modification ne l'a réellement fait fonctionner Ceci est dans [theme]/template/catalogue/produit/vue/addtocart

peut avoir à se déplacer du dossier de base s'il est inexistant

0
ESavage