Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/250.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 是否在xml语句中添加自定义代码?_Php_Xml_Magento - Fatal编程技术网

Php 是否在xml语句中添加自定义代码?

Php 是否在xml语句中添加自定义代码?,php,xml,magento,Php,Xml,Magento,我已经创建了将自定义项目添加到每个购物车所需的代码,所有这些似乎都能按预期工作。代码获取购物车中的项目,并形成XML,在请求中发送给第三方,并将响应解析回我的代码中的数组。然后将响应数组作为具有特定预定SKU的唯一项添加到购物车中 我面临的唯一问题是,当我这样做时,它似乎没有更新购物车中的小计。例如: 我在购物车里订了一件421美元的东西。这一项被放入一个XML语句中,然后发送给第三方,以获得基于购物车中所有项目成本的“债券”的特定价格。响应将债券的成本发回12.63美元,购物车中两个项目的小计

我已经创建了将自定义项目添加到每个购物车所需的代码,所有这些似乎都能按预期工作。代码获取购物车中的项目,并形成XML,在请求中发送给第三方,并将响应解析回我的代码中的数组。然后将响应数组作为具有特定预定SKU的唯一项添加到购物车中

我面临的唯一问题是,当我这样做时,它似乎没有更新购物车中的小计。例如:

我在购物车里订了一件421美元的东西。这一项被放入一个XML语句中,然后发送给第三方,以获得基于购物车中所有项目成本的“债券”的特定价格。响应将债券的成本发回12.63美元,购物车中两个项目的小计按预期为433.63美元。然后,在玩了421美元的物品之后,我开始看到一些奇怪的东西

我将项目编号更改为5,然后单击“更新购物车”。我得到的债券回报值为63.15美元,但小计显示,我将2105美元(5个项目的价格)与12.63美元(原始债券的价格)相加,总计2117.63美元。我再次单击“更新购物车”,然后它显示总共$2168.15

每次我改变数量时都会发生这种情况。我将之前的“债券”价格添加到当前小计中,我需要点击两次“更新购物车”才能赶上价格

因此,我在想,如果有一种方法可以在运行任何其他程序之前添加我创建的代码,我就能够缩小这个差距。我这样做对吗?将我的代码添加到XML中调用此页面的任何其他代码之前的最佳方法是什么

编辑

为了进一步解释,这是我正在使用的代码块:

    $cartHelper = Mage::helper('checkout/cart');
    if ($buySAFEcost > 0) {
        $product = Mage::getModel('catalog/product');
        $bs_cart = Mage::getModel('checkout/cart');
        $items = $cartHelper->getCart()->getItems();

        $bs_my_product_id  = $product->getIdBySku($bs_sku);
        $bs_my_product     = $product->load($bs_my_product_id);

        $params = array( 'qty' => 1, 'price' => $buySAFEcost );
        $bs_cart->addProduct($bs_my_product,$params);
        $bs_cart->save();

        Mage::app()->setCurrentStore(0); // ADMIN_STORE_ID
        $bs_my_product->setPrice($buySAFEcost);
        $bs_my_product->save();
        // Redo the totals?


        $cartModel->getQuote()->getBillingAddress();
        $cartModel->getQuote()->getShippingAddress()->setCollectShippingRates(true);
        $cartModel->getQuote()->collectTotals();
        $cartModel->getQuote()->save();


        // $cartModel->getQuote()->setTotalsCollectedFlag(false)->collectTotals()->save();

        Mage::app()->setCurrentStore(1); // DISTRO_STORE_ID
        Mage::getSingleton('checkout/session')->setCartWasUpdated(true);
    }

我觉得我在用大锤杀死一只蚂蚁,但小计总是比我的行动落后一步。我是否把它放在了错误的代码部分,也许?

听起来需要在报价对象上收集总数。您可以在
Mage\u Checkout\u Model\u Cart::save()方法中看到Magento是如何做到这一点的:

    $this->getQuote()->getBillingAddress();
    $this->getQuote()->getShippingAddress()->setCollectShippingRates(true);
    $this->getQuote()->collectTotals();
    $this->getQuote()->save();

账单和发货地址会影响总额中的税费。

仅供参考,Magento对此表示感谢。我现在也在那里发布了这个问题。我还想说,如果有一种方法可以在执行此过程后重置购物车小计,我也会对如何学习这个感兴趣。谢谢。我现在就去试一试。祝我好运!我已将当前代码块添加到问题中,并进行了编辑。我肯定我做错了什么,但我不确定那是什么。我没有看到你在这个代码中更新债券的价格——也许它发生在其他地方?好像有什么东西坏了。还要注意,$bs_cart->save();调用与$quote->getBillingAddress()执行相同的操作。。。etc调用,所以您不需要两者都使用。是的,$buySAFEcost在代码的前面已经更新。这是从XML请求响应返回的两个项目之一。