2013-10-03 17 views
9

Właśnie zainstalowałem Magento Community Edition ver 1.8.0.0 (ustawienia domyślne).Magento - Dodaj produkt do koszyka przez ciąg zapytania bez parametru form_key

System -> Konfiguracja -> Sprzedaż -> Zamówienie -> Zamówienie Opcje
Włącz onepage Checkout: Tak
Pozwól gości Checkout: Tak

Próbuję dodać produkt do koszyk za pomocą metody ciągu zapytania.
Według wszystkich zasobów znalazłem, są poprawne sposoby to zrobić:

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

ale nie pracujesz ... wózek pozostaje pusta.

Po dłuższego czasu, znalazłem Roztwór roboczy:

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

Jednak chciałbym nie umieścić form_key parametr w adresie URL.
Ta funkcja bezpieczeństwa nie jest potrzebna w moim przypadku.

Dla porównania przykład produkt działa dobrze bez form_key:

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

Chodzi o to, aby umieścić statyczny link na innych stronach internetowych (tak dynamicznie generowane form_key nie jest znana), więc jeśli klient kliknie na nim zostaje natychmiast przekierowany do sklepu z wypełnionym wózkiem.

Czy można pozbyć się parametru form_key i nadal móc dodać produkt do koszyka? A jeśli tak, to w jaki sposób?

Odpowiedz

8

co zrobiłem to, aby zastąpić Magento CartController z modułem niestandardowej. stworzyłem plik Wewnątrz: \ app \ code \ Local \ nazw \ AddProductFromUrl \ sterowniki \ 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(); 
     } 
    } 
?> 

(Moduł trzeba mieć config.xml i włączone pod etc/modules/ jak dla każdy moduł niestandardowy Magento. Zmień Namespace z tym, którego używasz.)

Działa to idealnie jak Magento 1.7 i przy minimalnym wpływie; form_key jest generowany, jeśli go brakuje i to wszystko.

+0

Muszę powiedzieć, że zrobiłem to samo. – rafis

+1

Z jakiegoś powodu nie działa to dla mnie z CE 1.9.0.1. Czy coś się zmieniło? Stworzyłem ten plik, config.xml, który znajduje się pod AddProductFromUrl/etc oraz app/etc/modules/Namespace_AddProuctFromUrl.xml. Widzę to w sekcji Sys> Config> Advanced> Advanced modules. – sparecycle

2

Ten krok nie jest bardzo skomplikowany! Mam nadzieję, że to pomoże.

//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

Zastanawiałem się, czy to możliwe, aby ustawić form_key jak nie wymagane gdzieś w konfiguracji lub używać innego adresu URL niż programowo. W tym przypadku wstawiłbym form_key przed dodaniem produktu do koszyka za pomocą 'Mage :: getSingleton ('core/session') -> getFormKey()' lub pomiń sprawdzanie poprawności za pomocą metody '_validateFormKey()'. – rafis

+1

Gdzie ten kod się znajduje? – ggwarpig

+0

Jak to wdrożyć? – sparecycle

21

Działa to dla mnie najlepsza w 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

Co ja faktycznie w końcu było porównanie nowych zmian z starego kodu i odkryłem dodaj do koszyka przycisk, aby był ustawiony na type = „przycisk” i był nie przesyłając.

Zmiana przycisk, aby po prostu type = "submit" i żadne inne zmiany faktycznie to działa jest w [tematu]/template/catalog/product/view/addtocart

może się przenieść z folderu bazowej jeśli nieistniejące

2

Use „Dodaj do koszyka” łącza dla danego produktu w każdym miejscu na stronie internetowej Magento ::

Poniższy kod może pomocne:

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

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

Od Magento 1.8 trzeba dodać postać kluczową $formKey = Mage::getSingleton('core/session')->getFormKey();?> do adresu

0

może być użyte z Ilosc ustawić następujące:

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

echo Mage::helper('checkout/cart')->getAddUrl($product, array('qty'=>$getQty)); 
Powiązane problemy