【问题标题】:Add product to cart outside of magento (external script)将产品添加到 magento 之外的购物车(外部脚本)
【发布时间】:2017-11-14 09:16:21
【问题描述】:

我必须通过外部页面将产品添加到同一 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;

   }

addToBasket 是通过 ajax 调用的。

所以问题是:如何在 Magento 范围之外开始会话并将产品放入购物车?

【问题讨论】:

    标签: php magento magento-1.9


    【解决方案1】:

    一旦你包含了 Mage.php,你需要用初始化 Magento

    Mage::app("default");
    

    (第一个参数是商店代码)

    之后……

    Mage::getSingleton('core/session', array('name'=>'frontend'));
    

    ...会正常工作。

    【讨论】:

    • 已经尝试添加商店代码,但这不会改变任何东西。与描述的问题相同。
    【解决方案2】:

    先添加(如 @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 和路径。

    系统 -> 配置 -> 网页 -> Cookies

    我们必须自定义两个字段:

    Cookie-Path: /Shop/Shop 是 magento 的目的地)

    Cookie-Domain: .test.de(其中.test.de是项目的URL)

    此后/Shop/checkout/cart 能够继承外部脚本的frontend-Cookie (productpage)

    注意:在不更改 Cookie-Path 和 Cookie-Domain 的情况下,Magento 将创建两个具有不同内容的前端 cookie。

    完整代码:

    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;
    }
    

    【讨论】:

    • 虽然这是一篇旧帖子。我面临着类似的问题。我有一个新的 php 页面 (scrapwebshop.nl/AddToCart.php?id=5100),它将获取 form_key,然后重定向到正确的 url (scrapwebshop.nl/checkout/cart/add/...) 但我的 form_key 与网上商店中使用的不同。让我想起你对 Cookie 的评论。我应该使用什么值?我的Cookie-Path: /Cookie-domain: scrapwebshop.nlAddToCart.php 将从我的 Facebook 商店页面调用。谢谢。
    • 抱歉,我帮不了你。我希望其他人可以帮助解决这个问题。
    • 谢谢 Slatyoo 我想通了。我也需要$session = Mage::getSingleton("customer/session");,尽管我根本没有使用那个变量。我的完整工作脚本位于magento.stackexchange.com/questions/249156/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 2017-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多