Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Programmatically retrieve list of all shipping methods

Tags:

php

magento

I'm writing a quick-and-dirty module to restrict shipping methods based on products in the cart. For example, if the customer adds food, I only want overnight shipping methods to be selected. Some of the commercial extensions are just overkill and have way more functionality that I need.

Each product will have a dropdown attribute called "Shipping Class". The admin will be able to create these Shipping Classes in the backend. They will give it a name and choose which methods are allowed.

When it comes time to get shipping quotes, we'll only show allowed methods based on the Shipping Class.

My main question is: how can I retrieve a list of all the shipping methods for the admin to select from when creating these shipping classes?

And as a secondary question, does it make sense to do the filtering of allowed methods inside of Mage_Sales_Model_Quote_Address::requestShippingRates? (I will be overriding this method of course)


EDIT:

Thanks to @BrianVPS, I was able to come up with the code below. It displays all individual methods from the carriers using optgroups. Works great with multiselect! I don't think it checks if the methods are actually enabled though.

public function getAllShippingMethods()
{
    $methods = Mage::getSingleton('shipping/config')->getActiveCarriers();

    $options = array();

    foreach($methods as $_ccode => $_carrier)
    {
        $_methodOptions = array();
        if($_methods = $_carrier->getAllowedMethods())
        {
            foreach($_methods as $_mcode => $_method)
            {
                $_code = $_ccode . '_' . $_mcode;
                $_methodOptions[] = array('value' => $_code, 'label' => $_method);
            }

            if(!$_title = Mage::getStoreConfig("carriers/$_ccode/title"))
                $_title = $_ccode;

            $options[] = array('value' => $_methodOptions, 'label' => $_title);
        }
    }

    return $options;
}
like image 964
Colin O'Dell Avatar asked Feb 24 '12 15:02

Colin O'Dell


People also ask

How do I get all shipping methods in Magento 2?

For this go to Stores > Configuration > Sales > Shipping Settings and configure Origin and Shipping Policy Parameters. It is necessary so Magento can calculate the taxes and shipping costs based on the shipping origin. So, all information you have to set includes : Country.

How can I get shipping method in Magento 2 programmatically?

Here is the code to do the same. First, we need to create a custom block file with name 'Shippingmethods. php' at the following location with below code. Now, you just need to call getActiveShippingMethod() function into your phtml file where you want to display the list of available shipping methods.


1 Answers

Here is a block of code I have in a source_model for a shipping extension I wrote. Hopefully this is what you're looking for.

...as for your second question, not sure....

public function toOptionArray($isMultiSelect = false)
{
    $methods = Mage::getSingleton('shipping/config')->getActiveCarriers();

    $options = array();

    foreach($methods as $_code => $_method)
    {
        if(!$_title = Mage::getStoreConfig("carriers/$_code/title"))
            $_title = $_code;

        $options[] = array('value' => $_code, 'label' => $_title . " ($_code)");
    }

    if($isMultiSelect)
    {
        array_unshift($options, array('value'=>'', 'label'=> Mage::helper('adminhtml')->__('--Please Select--')));
    }

    return $options;
}
like image 76
Mageician Avatar answered Sep 28 '22 16:09

Mageician