Magento 2 Jak uzyskać wszystkie aktywne metody wysyłki?

10

Moja wersja Magento to 2.1.0. Jak mogę uzyskać listę wszystkich aktywnych metod wysyłki?

Każda pomoc byłaby bardzo wdzięczna

Prashant Valanda
źródło

Odpowiedzi:

10

Lub możesz użyć Magento \ Shipping \ Model \ Config \ Source \ Allmethods , który właśnie to robi!

wróbel
źródło
1
To powinna być zaakceptowana odpowiedź!
Milan Simek
Co z użyciem w polach wielokrotnego wyboru?
'18
ale jak mogę przekazać flagę, aby uzyskać wszystkie aktywne metody. z mojego formularza komponentu interfejsu użytkownika
Himanshu,
7

Oprócz odpowiedzi keyur shah

Możesz uzyskać całą aktywną wysyłkę, używając poniższego kodu:

protected $scopeConfig;

protected $shipconfig;

public function __construct(
\Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
\Magento\Shipping\Model\Config $shipconfig
) {
    $this->shipconfig=$shipconfig;
    $this->scopeConfig = $scopeConfig;
}

public function getShippingMethods(){

        $activeCarriers = $this->shipconfig->getActiveCarriers();
        $storeScope = \Magento\Store\Model\ScopeInterface::SCOPE_STORE;
            foreach($activeCarriers as $carrierCode => $carrierModel)
            {
               $options = array();
               if( $carrierMethods = $carrierModel->getAllowedMethods() )
               {
                   foreach ($carrierMethods as $methodCode => $method)
                   {
                        $code= $carrierCode.'_'.$methodCode;
                        $options[]=array('value'=>$code,'label'=>$method);

                   }
                   $carrierTitle =$this->scopeConfig->getValue('carriers/'.$carrierCode.'/title');

               }
                $methods[]=array('value'=>$options,'label'=>$carrierTitle);
            }
        return $methods;        

    }

Za pomocą poniższego kodu otrzymasz listę przewoźników w pliku phtml. tutaj $blockjest związane z bloku, w którym mamy zdefiniowanego powyżej funkcji

<?php $carriers = $block->getShippingMethods(); ?>
<select name="shipping"  class="control-select">
    <option value=""><?php /* @escapeNotVerified */ echo __('Please Select'); ?></option>
        <?php foreach ($carriers as $carrier): ?>
            <optgroup label="<?php /* @escapeNotVerified */ echo $carrier['label'] ?>">
                <?php foreach ($carrier['value'] as $child): ?>
                    <option value="<?php /* @escapeNotVerified */ echo $child['value'] ?>">
                    <?php /* @escapeNotVerified */ echo $child['label']; ?>
                    </option>
                <?php endforeach; ?>
            </optgroup>
        <?php endforeach; ?>
</select>
Prashant Valanda
źródło
zmieniające się metody wysyłki radia jako wybrane? Pracuję nad konwersją metod wysyłki przycisków radiowych na rozwijane metody wysyłki z ceną.
sangan
3
 $objectManager = \Magento\Framework\App\ObjectManager::getInstance();

 $activeShipping = $objectManager->create('Magento\Shipping\Model\Config')->getActiveCarriers();

Uwaga: Jestem przeciwny bezpośredniemu ładowaniu obiektu za pomocą $ objectManager, dla lepszego wpływu możesz wstrzyknąć go do swojego konstruktora. Właśnie podałem przykład, jak możesz to osiągnąć. `


Lepszy sposób

protected $_shippingConfig;

public function __construct(
\Magento\Shipping\Model\Config $shippingConfig
) {
    $this->_shippingConfig=$shippingConfig
}

Teraz możesz uzyskać wszystkie aktywne metody wysyłki do

$this->_shippingConfig->getActiveCarriers();

Jeśli chcesz storekonkretny active shipping method, możesz przekazać $storeobiekt parameter, jak widać poniżej: metoda accept $storeparametru

public function getActiveCarriers($store = null)
    {
        $carriers = [];
        $config = $this->_scopeConfig->getValue('carriers', \Magento\Store\Model\ScopeInterface::SCOPE_STORE, $store);
        foreach (array_keys($config) as $carrierCode) {
            if ($this->_scopeConfig->isSetFlag('carriers/' . $carrierCode . '/active', \Magento\Store\Model\ScopeInterface::SCOPE_STORE, $store)) {
                $carrierModel = $this->_carrierFactory->create($carrierCode, $store);
                if ($carrierModel) {
                    $carriers[$carrierCode] = $carrierModel;
                }
            }
        }
        return $carriers;
    }
Keyur Shah
źródło
Keyur Potrzebuję listy metod wysyłki, po prostu dodajesz kod, który daje obiekt metody wysyłki po tym, jak zredagowałeś odpowiedź, dziękuję za wsparcie
Prashant Valanda,
Pracuję nad konwersją metod wysyłki na rozwijane metody wysyłki z kursem wysyłki (niestandardowe) przy kasie. więc jak to zrobić
sangan