将产品添加到 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;
}