Magento 2 Como obter todos os métodos de remessa ativos?

10

Minha versão do magento é 2.1.0. Como posso obter toda a lista de métodos de envio ativos?

Qualquer ajuda seria muito apreciada

Prashant Valanda
fonte

Respostas:

10

Ou você pode usar o Magento \ Shipping \ Model \ Config \ Source \ Allmethods que faz exatamente isso!

pardal
fonte
1
Essa deve ser a resposta aceita!
Milan Simek
Que tal usar em campos de seleção múltipla?
spiil
mas como posso passar sinalizador para obter todo o método ativo. do meu formulário de componente de interface do
usuário
7

Além da resposta do keyur shah

Você pode obter todo o transporte ativo usando o código abaixo:

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;        

    }

Usando o código abaixo, você obterá a lista de transportadora no arquivo phtml. aqui $blockestá relacionado ao bloco no qual definimos a função acima

<?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
fonte
este método mudando o transporte de rádio é como selecionar ??? eu estou trabalhando na conversão botões de rádio métodos transporte para suspensa de transporte métodos com preço ..
Sangan
3
 $objectManager = \Magento\Framework\App\ObjectManager::getInstance();

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

Nota: Sou contra o objeto de carregamento direto com $ objectManager, para obter um melhor impacto, você pode injetá-lo em seu construtor. Acabei de dar um exemplo de como você pode alcançá-lo. `


Melhor maneira

protected $_shippingConfig;

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

Agora você pode obter todo o método de envio ativo por

$this->_shippingConfig->getActiveCarriers();

Se você quiser storeespecífica active shipping method, então você pode passar $storeobjeto parameter, como você pode ver abaixo deste método aceitar $storeparâmetro

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
fonte
Keyur I lista método de envio necessidade que você acabou de adicionar código que dá o transporte método de objeto depois que você tiver editado resposta obrigado por seu apoio
Prashant Valanda
Eu estou trabalhando na conversão de métodos de envio de rádio para métodos de envio suspensos com taxa de envio (personalizada) na finalização da compra
.. Então