Программно получить список всех способов доставки

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

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

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

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

И как второстепенный вопрос, имеет ли смысл делать фильтрацию разрешенных методов внутри 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; } 

Вот блок кода, который у меня есть в 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; } 

Принимая ответ @ 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 */ 

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

 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 объект $_methods следующим образом:

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

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