Magento добавляет пользовательский код в инструкцию xml?


Я создал код, необходимый для добавления пользовательского товара в каждую корзину, и, похоже, все ПОЧТИ работает так, как задумано. Код получает товары в корзине и формулирует XML, который отправляется третьей стороне в запросе, и анализирует ответ обратно на мой код в массив. Массив ответов затем добавляется в корзину как уникальный товар с определенным, заранее определенным артикулом.

Единственная проблема, с которой я сталкиваюсь, заключается в том, что когда я делаю это, кажется, что это не обновите промежуточный итог в корзине. Например:

Я положил в корзину заказ на один товар стоимостью 421 доллар. Этот один товар помещается в XML-выписку, которая отправляется третьей стороне, чтобы получить определенную цену за "облигацию", основанную на стоимости всех товаров в корзине. В ответе стоимость облигации возвращается в размере 12,63 доллара США, а промежуточный итог двух товаров в корзине составляет 433,63 доллара, как и предполагалось. Затем, поиграв с количеством товара в 421 доллар, я начинаю видеть некоторые странности вещи...

Я меняю номер товара на 5 и нажимаю "ОБНОВИТЬ КОРЗИНУ". Я получаю доходность в размере 63,15 доллара по облигации, но промежуточный итог показывает, что я добавляю 2 105 долларов (цена 5 предметов) с 12,63 доллара (цена первоначальной облигации) на общую сумму 2 117,63 доллара. Я снова нажимаю "ОБНОВИТЬ КОРЗИНУ", и затем отображается общее количество $2,168.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);
    }

У меня такое чувство, будто я убиваю муравья с помощью кувалда здесь, но промежуточные итоги постоянно остаются на шаг позади моих действий. Возможно, я помещаю это в неправильный раздел кода?

 1
Author: Vinnie Saletto, 2014-05-01

1 answers

В этой ситуации лучшее, что вам нужно сделать, это создать новый промежуточный итог для расчета этих товаров после того, как они будут добавлены в вашу корзину.

Когда вы добавляете новый итог в свой модуль, вы можете изменить расчет предложения на основе объекта адреса предложения, переданного в ваш класс промежуточных итогов. Таким образом, вы можете вносить изменения каждый раз при сохранении объекта корзины или предложения, и вы всегда будете обновлять промежуточные итоги по своему усмотрению.

В основном вы добавляете несколько узлов в свой config.xml

<config>
    <global>
        <sales>
            <quote>
                <totals>
                    <my_new_total>
                        <class>mymodule/my_total_class</class>
                        <after>subtotal</after>
                    </my_new_total>
                </totals>
            </quote>
        </sales>
    </global>
</config>

В вашем общем классе вам необходимо расширить Mage_Sales_Model_Quote_Address_Total_Abstract и реализовать два общедоступных метода:

public function collect(Mage_Sales_Model_Quote_Address $address)
public function fetch(Mage_Sales_Model_Quote_Address $address)

На основе объекта $address вы можете вычислить все необходимые значения.

Возьмите эти две ссылки в качестве примера, чтобы создать свой новый итог:

Http://turnkeye.com/blog/magento-development-add-total-row-checkout / http://excellencemagentoblog.com/magento-add-fee-discount-order-total

Я я бы написал вам базовый код для этого, но я здесь немного занят.

Надеюсь, я вам помог.

Тиаго Сампайо

 1
Author: Tiago Sampaio, 2014-05-02 15:01:44