2013-10-03 10 views
9

Ho appena installato Magento Community Edition ver 1.8.0.0 (impostazioni predefinite).Magento - Aggiungi un prodotto al carrello tramite stringa di query senza parametro form_key

Sistema -> Configurazione -> Vendite -> Checkout -> Opzioni Acquista
Abilita Checkout OnePage: Sì
Consenti visitatori Checkout: Si

Sto cercando di aggiungere un prodotto al carrello utilizzando il metodo stringa di query.
Secondo tutte le risorse che ho trovato, questi sono modi corretti per farlo:

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

ma non stanno lavorando ... il carro rimane vuoto.

Dopo un bel po 'di tempo, ho trovato la soluzione di lavoro:

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

Tuttavia, mi piacerebbe non mettere form_key parametro nell'URL.
Questa funzione di sicurezza non è necessaria nel mio caso.

Per confronto esempio prodotto funziona bene anche senza il form_key:

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

L'idea è quella di mettere un link statico su alcuni altri siti web (form_key così generato dinamicamente non è nota), quindi se un cliente fa clic su di esso viene reindirizzato direttamente al negozio con un carrello pieno.

È possibile eliminare il parametro form_key ed essere ancora in grado di aggiungere un prodotto al carrello? E se è così, allora come?

risposta

8

Quello che ho fatto è quello di ignorare il Magento CartController con un modulo personalizzato. Ho creato un file all'interno: \ app \ code \ locale \ Namespace \ AddProductFromUrl \ controller \ 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(); 
     } 
    } 
?> 

(Il modulo necessario disporre di config.xml e abilitati sotto etc/modules/ come per ogni modulo Magento personalizzato. Cambia Namespace con quello che usi.)

Che funziona perfettamente come Magento 1.7 e con impatto minimo; il form_key viene generato se manca e il gioco è fatto.

+0

Devo dire che ho fatto lo stesso. – rafis

+1

Per qualsiasi motivo, questo non funziona per me con CE 1.9.0.1. Qualcosa è cambiato? Ho creato questo file, il config.xml che va sotto AddProductFromUrl/etc e l'app/etc/modules/Namespace_AddProuctFromUrl.xml. Posso vederlo nella sezione Sys> Config> Avanzate> Moduli avanzati. – sparecycle

2

Questo passaggio non è molto complicato! Spero che questo aiuto.

//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'); 
    } 
} 
+0

mi chiedevo se era possibile impostare form_key come non richiesto da qualche parte nella configurazione o utilizzare un URL diverso anziché risolverlo a livello di codice. In questo caso, inserisco form_key prima di aggiungere un prodotto al carrello usando 'Mage :: getSingleton ('core/session') -> getFormKey()' o salta la convalida con il metodo '_validateFormKey()'. – rafis

+1

Dove va questo codice? – ggwarpig

+0

Come si implementa questo? – sparecycle

21

Questo funziona meglio per me in 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> 
0

Quello che ho effettivamente fatto, alla fine, è stato confrontare le nuove modifiche con il vecchio codice e ho scoperto il pulsante Aggiungi al carrello è stato fissato a digitare = "button" ed è stato non inviare.

Cambiare il pulsante per digitare semplicemente = "submit" e altri cambiamenti effettivamente fatto funzionare questo è in [tema]/template/catalog/product/view/addToCart

potrebbe essere necessario spostare dalla cartella di base se inesistente

2

Usa "Aggiungi al carrello" per il vostro prodotto ogni dove su un sito web Magento ::

Il seguente codice può utile:

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

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

Da Magento 1.8 bisogno di aggiungere forma chiave $formKey = Mage::getSingleton('core/session')->getFormKey();?> alla url

0

Il seguente può essere utilizzato con set qty:

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

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