2013-05-13 2 views
2

Я программирую модуль, где мне нужно установить бесплатную доставку цитаты в определенные случаи. Я пытаюсь получить эту работу:Magento: программно установленная бесплатная доставка

$quote = Mage::helper('checkout/cart')->getCart()->getQuote(); 
$quote->getShippingAddress()->setFreeShipping(1); 

но до сих пор не удалось. Может ли кто-нибудь помочь?

EDIT: мне нужно сделать это из на следующих событий:

checkout_cart_update_items_after 
checkout_cart_product_add_after 
sales_quote_remove_item 

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

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

$address = $quote->getShippingAddress(); 
$address->setShippingMethod('freeshipping_freeshipping'); 

ответ

3

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

Ниже код может немного помочь.

приложение/дизайн/интерфейс/по умолчанию/по умолчанию/шаблон/выписка/OnePage/SHIPPING_METHOD/available.phtml:

// find methods loop: 
<?php foreach ($_rates as $_rate): ?> 

// add checking for free shipping method and setting it as default 
<?php if ($_rate->getCode()=='freeshipping_freeshipping' && !$this->getAddress()->getShippingMethod()) { 
     $this->getAddress()->setShippingMethod($_rate->getCode()); 
} ?> 
+0

Спасибо! freeshipping_freeshipping - это, вероятно, способ. – clime

+0

pardon для редактирования !!! – Slimshadddyyy

1

Вы не должны просто сохранить цитату?

$quote = Mage::helper('checkout/cart')->getCart()->getQuote(); 
$quote->getShippingAddress()->setFreeShipping(1); 
$quote->save(); 
3

Лучший способ сделать это, добавив свой собственный «цитата адрес общей» точно так же, как это делается в модуле SalesRule по Mage_SalesRule_Model_Quote_Freeshipping класса. Для того, чтобы повторить это, вам нужно создать класс, расширяющий Mage_Sales_Model_Quote_Address_Total_Abstract и внутри него метод с именем collect() так:

class Mycompany_Mymod_Model_Sales_Quote_Address_Total_Freeshipping extends Mage_Sales_Model_Quote_Address_Total_Abstract 
{ 
    public function collect(Mage_Sales_Model_Quote_Address $address) 
    { 
     parent::collect($address); 
     if(somecondition){ 
      $address->setFreeShipping(true); 
     } 
    } 
} 

, а затем объявить обычай «котировка адрес всего» в вашем модуле config.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<config> 
    <global> 
     <sales> 
      <quote> 
       <totals> 
        <customfreeshipping> 
         <class>mymodname/sales_quote_address_total_freeshipping</class> 
         <after>freeshipping</after> <!-- this ensures our custom total is placed after Mage_SalesRule_Model_Quote_Freeshipping so we can override "$address->setFreeShipping(0);" --> 
        </customfreeshipping> 
       </totals> 
      </quote> 
     </sales> 
    </global> 
</config> 

Это объявит бесплатную доставку по адресу объекта, который будет передан на объект запроса на $request->setFreeShipping($this->getFreeShipping()); в Mage_Sales_Model_Quote_Address класса в requestShippingRates() способе, а затем будет доступны для любого модуля доставки, который является проверкой для $request->getFreeShipping().

Наслаждайтесь :)

0

Я имел следующие Magento 2 ошибки

Пожалуйста, укажите способ доставки

И этот код решить проблему:

$shippingAddress->setCollectShippingRates(true) 
       ->collectShippingRates() 
       ->setShippingMethod('flatrate_flatrate'); 

Также проверьте правильное решение от Unable to set Shipping Method in Magento order create script

Смежные вопросы