Программно получить список всех способов доставки - PullRequest
17 голосов
/ 24 февраля 2012

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

Каждый продукт будет иметь выпадающий атрибут, называемый «Класс доставки».Администратор сможет создавать эти классы доставки в бэкэнде.Они дадут ему имя и выберут, какие методы разрешены.

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

Мой главный вопрос: как я могу получить список всех методов доставки, которые администратор может выбрать при создании этих классов доставки?

И как дополнительный вопрос, имеет ли смысл делатьфильтрация разрешенных методов внутри Mage_Sales_Model_Quote_Address :: requestShippingRates?(Я буду переопределять этот метод, конечно)


РЕДАКТИРОВАТЬ:

Благодаря @BrianVPS, я смог придумать код ниже.Он отображает все отдельные методы от носителей, используя optgroups.Отлично работает с множественным выбором!Я не думаю, что он проверяет, действительно ли включены методы.

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

Ответы [ 3 ]

24 голосов
/ 24 февраля 2012

Вот блок кода, который у меня есть в source_model для расширения доставки, которое я написал. Надеюсь, это то, что вы ищете.

... что касается вашего второго вопроса, не уверен ....

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;
}
9 голосов
/ 17 января 2013

Принимая ответ @ BrianVPS, я использую приведенный ниже фрагмент кода (с показанной структурой), чтобы помочь в моей ситуации, когда я хотел простой ярлык человека из кода доставки.

$methods = Mage::getSingleton('shipping/config')->getActiveCarriers();
$shipping = array();
foreach($methods as $_ccode => $_carrier) {
    if($_methods = $_carrier->getAllowedMethods())  {
        if(!$_title = Mage::getStoreConfig("carriers/$_ccode/title"))
            $_title = $_ccode;
        foreach($_methods as $_mcode => $_method)   {
            $_code = $_ccode . '_' . $_mcode;
            $shipping[$_code]=array('title' => $_method,'carrier' => $_title);
        }
    }
}
echo "\n";print_r($shipping);
/*
[flatrate_flatrate] => Array
        [title] => Will-call
        [carrier] => Pickup At Ca Cycleworks
[freeshipping_freeshipping] => Array
        [title] => Economy
        [carrier] => Free Ground Shipping
[ups_11] => Array
        [title] => UPS Standard
        [carrier] => United Parcel Service
[ups_12] => Array
        [title] => UPS Three-Day Select
        [carrier] => United Parcel Service
[ups_54] => Array
        [title] => UPS Worldwide Express Plus
        [carrier] => United Parcel Service
[ups_65] => Array
        [title] => UPS Saver
        [carrier] => United Parcel Service
[ups_01] => Array
        [title] => UPS Next Day Air
        [carrier] => United Parcel Service
[ups_02] => Array
        [title] => UPS Second Day Air
        [carrier] => United Parcel Service
[ups_03] => Array
        [title] => UPS Ground
        [carrier] => United Parcel Service
[ups_07] => Array
        [title] => UPS Worldwide Express
        [carrier] => United Parcel Service
[ups_08] => Array
        [title] => UPS Worldwide Expedited
        [carrier] => United Parcel Service
[customshippingrate_customshippingrate] => Array
        [title] => Custom Shipping Rate
        [carrier] => Custom Shipping Rate
*/
4 голосов
/ 07 января 2014

Я создал для этого функцию из уже предоставленных ответов.Это создает группу параметров всех методов доставки:

function getShippingMethods($_methods, $fieldId, $fieldName, $fieldClass){
    $_shippingHtml = '<select name="' . $fieldName . '" id="' . $fieldId . '" class="' . $fieldClass . '">';
    foreach($_methods as $_carrierCode => $_carrier){
        if($_method = $_carrier->getAllowedMethods())  {
            if(!$_title = Mage::getStoreConfig('carriers/' . $_carrierCode . ' /title')) {
                $_title = $_carrierCode;
            }
            $_shippingHtml .= '<optgroup label="' . $_title . '">';
            foreach($_method as $_mcode => $_m){
                $_code = $_carrierCode . '_' . $_mcode;
                $_shippingHtml .= '<option value="' . $_code . '">' . $_m . '</option>';
            }
            $_shippingHtml .= '</optgroup>';
        }
    }
    $_shippingHtml .= '</select>';
    return $_shippingHtml;
}

Аргумент $_methods является объектом из Magento:

$_methods = Mage::getSingleton('shipping/config')->getActiveCarriers();

Итак, мы можем вызвать функцию и передать$_methods возразить на это следующим образом:

<?php echo getShippingMethods($_methods, 'shipping_method', 'shipping_method', 'shipping'); ?>

Надеюсь, что это поможет кому-то еще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...