2013-05-13 4 views
2

Je suis la programmation d'un module où j'ai besoin de mettre la livraison gratuite d'un devis à certaines occasions. J'essaye de faire fonctionner ceci:Magento: par programmation définir la livraison gratuite

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

mais jusqu'ici aucun succès. Quelqu'un peut-il aider?

EDIT: Je dois le faire à partir des événements suivants:

checkout_cart_update_items_after 
checkout_cart_product_add_after 
sales_quote_remove_item 

Fondamentalement sur toute modification de panier, je dois déterminer si la livraison doit être gratuite.

EDIT: Cela semble fonctionner plutôt bien. Sauf que je devrais désactiver la livraison gratuite comme un choix à la caisse.

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

Répondre

3

vous pouvez d'abord identifier votre événement pour lequel vous souhaitez définir la livraison gratuite et en fonction de cet événement, vous pouvez définir la livraison gratuite comme option par défaut.

Le code ci-dessous pourrait vous aider.

app/design/frontend/default/default/template/caisse/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

Merci! Freeshipping_freeshipping est probablement un moyen. – clime

+0

pardon pour l'édition !!! – Slimshadddyyy

1

Vous ne devriez pas simplement enregistrer votre citation?

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

La meilleure façon de le faire est en ajoutant votre « adresse de citation totale » de la même manière que cela se fait dans le module SalesRule par Mage_SalesRule_Model_Quote_Freeshipping classe. Pour reproduire cela, vous devez créer une classe extension Mage_Sales_Model_Quote_Address_Total_Abstract et à l'intérieur d'une méthode nommée collect() comme ceci:

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

puis déclarer votre « total d'adresse de devis » dans votre module personnalisé 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> 

Cette déclarera la livraison gratuite sur objet adresse qui sera transmise à l'objet de la demande de $request->setFreeShipping($this->getFreeShipping()); dans Mage_Sales_Model_Quote_Address classe dans la méthode requestShippingRates() et sera disponible pour tout module d'expédition pour vérifier est $request->getFreeShipping().

Enjoy :)

0

j'ai eu les éléments suivants Magento 2 erreur

S'il vous plaît spécifier une méthode d'expédition

Et ce code résoudre le problème:

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

également vérifier la bonne solution de Unable to set Shipping Method in Magento order create script

Questions connexes