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


Respuestas:


10

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


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>

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 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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.