将产品添加到 magento 之外的购物车(外部脚本)
Add product to cart outside of magento (external script)
我必须通过外部页面将产品添加到同一 URL 下的购物车中。
这些页面之间的区别在于,例如test.de
是 运行 TYPO3,test.de/Shop
是 运行 Magento,test.de/productpage
是 运行 通过 TYPO3 的外部脚本。
在产品页面上,我必须将产品添加到 Magento 购物车才能继续结帐。
关键问题是在 Magento 之外启动会话。
如果我在前往 test.de/productpage
并将产品添加到购物车之前调用 test.de/Shop/checkout/cart
,它会完美运行。
但是如果我走正常的路(站点 -> 产品页面 -> 购物车),我无法让 Magento 收听产品页面上的会话。
我有这样的东西要打电话
function addToBasket()
{
require_once('../app/Mage.php');
ob_start();
session_start();
umask(0);
session_write_close();
Mage::app()->setCurrentStore(33);
$session = Mage::getSingleton('core/session', array('name'=>'frontend'));
$productId = !isset($_GET['activeProdId']) ? '' : $_GET['activeProdId'];
$qty = !isset($_GET['qty']) ? '1' : $_GET['qty'];
if(empty($productId)) {
return "no product-id found";
}
$request = Mage::app()->getRequest();
$product = Mage::getModel('catalog/product')->load($productId);
$cart = Mage::helper('checkout/cart')->getCart();
$cart->addProduct($product, array('qty' => $qty));
$session->setLastAddedProductId($product->getId());
$session->setCartWasUpdated(true);
$cart->save();
return true;
}
通过 ajax 调用 addToBasket。
所以问题是:如何在 Magento 范围之外启动会话并将产品放入购物车?
包含 Mage.php 后,您需要使用
初始化 Magento
Mage::app("default");
(第一个参数是商店代码)
之后...
Mage::getSingleton('core/session', array('name'=>'frontend'));
...将正常工作。
先添加(像 @samsonovits 建议的那样)我不得不在 mage 应用程序中添加商店代码和商店 ID(没有测试之后是否需要商店 ID添加商店代码)。
Mage::app("default")->setCurrentStore(33);
之后我在 Mage::app
上调用了前端
Mage::app()->loadArea('frontend');
我将 Mage::helper('checkout/cart')
切换为单例 Mage::getSingleton('checkout/cart')
。
因为 Magento 1.8
我们必须添加一个 form_key
来通过外部脚本添加产品。
这是通过以下代码完成的:
$param = array('product' => $productId,
'qty' => $qty,
'form_key' => Mage::getSingleton('core/session')->getFormKey());
$request = new Varien_Object();
$request->setData($param);
现在我们可以继续 $cart->addProduct($product, $request)
和 $cart->save()
来保存购物车。
还有一个更重要的部分需要更改(因为外部脚本与 magento 不在同一范围内)- cookie url 和路径。
System -> Configuration -> Web -> Cookies
这里我们要自定义两个字段:
Cookie-Path: /Shop
(其中 /Shop
是 magento 的目的地)
Cookie-Domain: .test.de
(其中 .test.de
是项目的 URL)
在此之后 /Shop/checkout/cart
能够继承外部脚本的 frontend-Cookie
(productpage
)
NOTE: Without changing the Cookie-Path & Cookie-Domain Magento will create two frontend cookies with different content.
完整代码:
function addToBasket()
{
require_once('path/to/Mage.php');
umask(0);
Mage::app("default")->setCurrentStore(33);
umask(0);
Mage::app()->loadArea('frontend');
$productId = !isset($_GET['activeProdId']) ? '' : $_GET['activeProdId'];
$qty = !isset($_GET['qty']) ? '1' : $_GET['qty'];
Mage::getSingleton("core/session", array("name" => "frontend"));
$session = Mage::getSingleton("customer/session");
$cart = Mage::getSingleton('checkout/cart')->setStoreId(33);
$cart->init();
$paramater = array('product' => $productId,
'qty' => $qty,
'form_key' => Mage::getSingleton('core/session')->getFormKey()
);
$request = new Varien_Object();
$request->setData($paramater);
if(empty($productId)) {
return "no product-id found";
}
$product = Mage::getModel('catalog/product')->load($productId);
$cart->addProduct($product, $request);
$session->setLastAddedProductId($product->getId());
$session->setCartWasUpdated(true);
$cart->save();
return 1;
}
我必须通过外部页面将产品添加到同一 URL 下的购物车中。
这些页面之间的区别在于,例如test.de
是 运行 TYPO3,test.de/Shop
是 运行 Magento,test.de/productpage
是 运行 通过 TYPO3 的外部脚本。
在产品页面上,我必须将产品添加到 Magento 购物车才能继续结帐。
关键问题是在 Magento 之外启动会话。
如果我在前往 test.de/productpage
并将产品添加到购物车之前调用 test.de/Shop/checkout/cart
,它会完美运行。
但是如果我走正常的路(站点 -> 产品页面 -> 购物车),我无法让 Magento 收听产品页面上的会话。
我有这样的东西要打电话
function addToBasket()
{
require_once('../app/Mage.php');
ob_start();
session_start();
umask(0);
session_write_close();
Mage::app()->setCurrentStore(33);
$session = Mage::getSingleton('core/session', array('name'=>'frontend'));
$productId = !isset($_GET['activeProdId']) ? '' : $_GET['activeProdId'];
$qty = !isset($_GET['qty']) ? '1' : $_GET['qty'];
if(empty($productId)) {
return "no product-id found";
}
$request = Mage::app()->getRequest();
$product = Mage::getModel('catalog/product')->load($productId);
$cart = Mage::helper('checkout/cart')->getCart();
$cart->addProduct($product, array('qty' => $qty));
$session->setLastAddedProductId($product->getId());
$session->setCartWasUpdated(true);
$cart->save();
return true;
}
通过 ajax 调用 addToBasket。
所以问题是:如何在 Magento 范围之外启动会话并将产品放入购物车?
包含 Mage.php 后,您需要使用
初始化 MagentoMage::app("default");
(第一个参数是商店代码)
之后...
Mage::getSingleton('core/session', array('name'=>'frontend'));
...将正常工作。
先添加(像 @samsonovits 建议的那样)我不得不在 mage 应用程序中添加商店代码和商店 ID(没有测试之后是否需要商店 ID添加商店代码)。
Mage::app("default")->setCurrentStore(33);
之后我在 Mage::app
Mage::app()->loadArea('frontend');
我将 Mage::helper('checkout/cart')
切换为单例 Mage::getSingleton('checkout/cart')
。
因为 Magento 1.8
我们必须添加一个 form_key
来通过外部脚本添加产品。
这是通过以下代码完成的:
$param = array('product' => $productId,
'qty' => $qty,
'form_key' => Mage::getSingleton('core/session')->getFormKey());
$request = new Varien_Object();
$request->setData($param);
现在我们可以继续 $cart->addProduct($product, $request)
和 $cart->save()
来保存购物车。
还有一个更重要的部分需要更改(因为外部脚本与 magento 不在同一范围内)- cookie url 和路径。
System -> Configuration -> Web -> Cookies
这里我们要自定义两个字段:
Cookie-Path: /Shop
(其中 /Shop
是 magento 的目的地)
Cookie-Domain: .test.de
(其中 .test.de
是项目的 URL)
在此之后 /Shop/checkout/cart
能够继承外部脚本的 frontend-Cookie
(productpage
)
NOTE: Without changing the Cookie-Path & Cookie-Domain Magento will create two frontend cookies with different content.
完整代码:
function addToBasket()
{
require_once('path/to/Mage.php');
umask(0);
Mage::app("default")->setCurrentStore(33);
umask(0);
Mage::app()->loadArea('frontend');
$productId = !isset($_GET['activeProdId']) ? '' : $_GET['activeProdId'];
$qty = !isset($_GET['qty']) ? '1' : $_GET['qty'];
Mage::getSingleton("core/session", array("name" => "frontend"));
$session = Mage::getSingleton("customer/session");
$cart = Mage::getSingleton('checkout/cart')->setStoreId(33);
$cart->init();
$paramater = array('product' => $productId,
'qty' => $qty,
'form_key' => Mage::getSingleton('core/session')->getFormKey()
);
$request = new Varien_Object();
$request->setData($paramater);
if(empty($productId)) {
return "no product-id found";
}
$product = Mage::getModel('catalog/product')->load($productId);
$cart->addProduct($product, $request);
$session->setLastAddedProductId($product->getId());
$session->setCartWasUpdated(true);
$cart->save();
return 1;
}