2014-03-13 32 views
2

我有一個外部網站,您可以直接從中添加產品。Magento以編程方式添加產品並重定向到結帳

所以我試圖創建一個PHP文件,它可以接收一些HTTP POST - 但它不工作。

首先,我嘗試了一些非常基本的

<?php 
namespace Addtocart; 

use Mage; 

require __DIR__ . '/app/Mage.php'; 

/* 
if (! isset($_POST, $_POST['data'])) { 
    exit; 
} 
*/ 

$data = array(
    //array('id' => 2532, 'qty' => 1, 'attribute' => 92, 'value' => 11), // 002 
    //array('id' => 1854, 'qty' => 1), 
    array('id' => '5711914018542', 'qty' => 1) 
); 

Mage::app(); 

$product_model = Mage::getModel('catalog/product'); 

/** @var \Mage_Checkout_Model_Cart $cart */ 
$cart = Mage::getSingleton('checkout/cart'); 
$cart->init(); 

$errors = array(); 
foreach($data as $product) { 
    try { 
     $productid = (int)$product_model->getIdBySku($product['id']); 

     $params = array(
      'product' => $productid, 
      'qty' => $product['qty'] 
     ); 

     if (array_key_exists('attribute', $product)) { 
      $params['super_attribute'] = array($product['attribute'] => $product['value']); 
     } 

     $p = $product_model->load($productid); 
     $cart->addProduct($p, $params); 
    } catch (\Exception $e) { 
     $errors[$product['id']] = $e->getMessage(); 
     continue; 
    } 
} 

$cart->save(); 
$cart->getItems()->setQuote($cart->getQuote()); 
$cart->save(); 
Mage::getSingleton('checkout/session')->setCartWasUpdated(true); 

if ($errors) { 
    var_dump($errors); 
    exit; 
} 

header('Location: /checkout/cart/'); 

但車仍然是空的。

然後我試圖尋找到購物車var_dump($cart),發現所有的產品實際上添加,所以我的猜測是會話Mage::app()Mage::run()之間的變化有什麼我能做的事堅持了會議?

  • Magento的:1.7.0.2
+0

開您也可以嘗試var轉儲附加到會話的報價ID,併爲您的發佈腳本(上面)執行相同操作,並比較兩者以確保報價ID相同。我的猜測是你正在發出一個新的會話ID在重定向到結帳/購物車。雖然magento有一個購物車對象,但引用對象是產品最終所在的位置。 – Ashley

+0

'$ cart-> getQuote() - > getId()' - 在'header('location ...')之前和之後相同' – Martin

+0

'session_id()'在 – Martin

回答

2

這裏該代碼可以使用,這將增加多個產品

<?php 
namespace Addtocart; 

require __DIR__ . '/app/Mage.php'; 
use Mage; 

if (! isset($_GET, $_GET['p'])) { 
    var_dump($_GET); 
    exit; 
} 

Mage::app(); 

/** @var \Mage_Core_Model_Session */ 
$coresession = Mage::getSingleton('core/session', array('name'=>'frontend')); 

/** @var \Mage_Checkout_Model_Session $session */ 
$session = Mage::getSingleton('checkout/session'); 
$session->start(); 
$session->clear(); 

/** @var \Mage_Catalog_Model_Product $product_model */ 
$product_model = Mage::getModel('catalog/product'); 

/** @var \Mage_Checkout_Model_Cart $cart */ 
$cart = Mage::getSingleton('checkout/cart'); 
$cart->init(); 
$cart->truncate(); 

$errors = array(); 
foreach($_GET['p'] as $product) { 
    $product = json_decode($product, true); 
    try { 
     $productid = (int)$product_model->getIdBySku(urldecode($product['id'])); 

     $params = array(
      'product' => $productid, 
      'qty' => $product['qty'] 
     ); 

     if (array_key_exists('attribute', $product)) { 
      $params['super_attribute'] = array($product['attribute'] => $product['value']); 
     } 

     $cart->addProduct($productid, $params); 
    } catch (\Exception $e) { 
     $errors[$product['id']] = $e->getMessage() . ' (Product: ' . print_r($product, true) . ')'; 
     continue; 
    } 
} 

$cart->save(); 
$session->setCartWasUpdated(true); 

if ($errors) { 
    var_dump($errors); 
    exit; 
} 

if ($cart->getQuote()->getHasError()) { 
    var_dump($cart->getQuote()->getHasError()); 
    exit; 
} 


header('Location: /checkout/cart/'); 

,並利用它發送GET請求以下文件

p[]={"id":"<config-sku>","attribute":<attr>,"value":<value>,"qty":<qty>}&p[]={"id":"<simple-sku>","qty":<qty>} 
0

嘗試使用Magento的內置URL系統這樣做從外部站點的GET請求。

對於簡單的產品:http://www.magentosite.com/checkout/cart/add?product=1001&qty=1

你也可以做定製選項:http://www.magentosite.com/checkout/cart/add?product=1001&qty=1&options[12]=57&options[15]=32

+0

與那個問題是你只能添加1個產品,這是不可用:) – Martin

相關問題