Magento 2 ¿Cómo obtener todos los métodos de envío activos?

10

Mi versión de magento es 2.1.0. ¿Cómo puedo obtener toda la lista de métodos de envío activos?

Cualquier ayuda sería muy apreciada

Prashant Valanda
fuente

Respuestas:

10

¡O puede usar Magento \ Shipping \ Model \ Config \ Source \ Allmethods que hace exactamente eso!

gorrión
fuente
1
¡Esta debería ser la respuesta aceptada!
Milan Simek
¿Qué pasa con el uso en campos de selección múltiple?
spiil
pero ¿cómo puedo pasar la bandera para obtener todos los métodos activos? de mi formulario de componente ui
Himanshu
7

Además de la respuesta de keyur shah

Puede obtener todos los envíos activos utilizando el siguiente código:

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 el siguiente código, obtendrá una lista de operadores en el archivo phtml. aquí $blockestá relacionado con el bloque en el que hemos definido la función anterior

<?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
fuente
este cambio de método de envío de radio como select ??? estoy trabajando en la conversión de métodos de envío de botones de radio al menú desplegable de métodos de envío con el precio ..
sangan
3
 $objectManager = \Magento\Framework\App\ObjectManager::getInstance();

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

Nota: Estoy en contra del objeto de carga directa con $ objectManager, para un mejor impacto puede inyectarlo en su constructor. Acabo de dar un ejemplo de cómo puedes lograrlo. ``


Mejor manera

protected $_shippingConfig;

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

Ahora puede obtener todos los métodos de envío activos al

$this->_shippingConfig->getActiveCarriers();

Si desea un storeespecífico active shipping method, puede pasar el $storeobjeto parameter, como puede ver a continuación, este método acepta $storeparámetros

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
fuente
Keyur Necesito una lista de métodos de envío, solo agrega un código que proporciona el objeto del método de envío después de que haya editado la respuesta gracias por su apoyo
Prashant Valanda
Estoy trabajando en convertir los métodos de envío de radio a métodos de envío desplegables con la tasa de envío (personalizado) en la comprobación ... así que cómo hacer esto
sangan