Configuración de restricciones de envío avanzadas en Magento 2
Publicado: 2017-05-17En este artículo, explicaremos cómo ocultar un método de envío cuando se aplican ciertas condiciones.
En algunos escenarios, los propietarios de las tiendas pueden querer restringir las opciones de envío porque:
- un producto tiene grandes dimensiones y peso, por lo que no se puede enviar de ninguna manera estándar,
- las condiciones de almacenamiento congelado no permiten entregar un producto a tiempo
- el envío está restringido debido a la ubicación del cliente (país, región, ciudad )
- el C art Total no permite que un comprador califique para ninguna oferta de envío,
- etc.
La selección predeterminada de las opciones de envío de Magento no ofrece mucha flexibilidad. Solo es posible restringir el envío para ciertos condados y regiones o cuando el total del carrito es inferior al monto establecido.
Si crees que esto no es suficiente, sigue leyendo.
Te diré cómo crear tu propio complemento que te permitirá restringir las opciones de envío de acuerdo con tu modelo de negocio, objetivos y condiciones.
NOTA
No seguiré los pasos específicos necesarios para crear una extensión para Magento 2. Puede ver cómo hacerlo aquí o aquí.
Para deshabilitar dinámicamente cualquier método de envío dado, necesitamos un nuevo conjunto de clases en nuestra extensión: estos son 2 complementos . El 1º estará a cargo de la validación de los métodos de envío, mientras que el 2º los filtrará.
En pocas palabras, todos los métodos que no pasen la validación se marcarán como " is_disabled ", y en el siguiente paso, todos los métodos " is_disabled " se filtrarán y eliminarán de la lista principal.
Vamos a rodar.
* Dado que el enfoque que voy a describir se basa en los principios utilizados en la extensión Shipping Suite , usaré el nombre del proveedor 'Mageworx' y el nombre de la extensión 'ShippingRules'. ¡NOTA! ¡Para evitar errores, debe reemplazarlos con sus propios nombres!
Primero, creemos un complemento (clase) que se usará para filtrar. Aquí está cómo:
> MageWorx\Reglas de envío\Modelo\Complemento\Envío\Tarifa\Resultado\Agregar
espacio de nombres MageWorx\ShippingRules\Model\Plugin\Shipping\Rate\Result; agregar clase { /** * @var\Magento\Checkout\Model\Session|\Magento\Backend\Model\Session\Quote */ $sesión protegida; /** * @param \Magento\Checkout\Model\Session $checkoutSession * @param \Magento\Backend\Model\Session\Quote $backendQuoteSession * @param \Magento\Framework\App\State $estado * @parámetro interno Sesión $sesión */ función pública __construir( \Magento\Checkout\Model\Session $checkoutSession, \Magento\Backend\Model\Session\Quote $backendQuoteSession, \Magento\Framework\Aplicación\Estado $estado ) { if ($estado->getAreaCode() == \Magento\Framework\App\Area::AREA_ADMINHTML) { $esta->sesión = $backendQuoteSession; } más { $this->session = $checkoutSession; } } /** * Valide cada método de envío antes de anexarlo. * Aplicar la acción de reglas si la validación fue exitosa. * Puede marcar algunas reglas como deshabilitadas. Las reglas deshabilitadas se eliminarán en la clase. * @ver MageWorx\ShippingRules\Model\Plugin\Shipping\Rate\Result\GetAllRates * comprobando el valor de esta marca en el objeto tarifa. * * NOTA: Si tiene algún problema con las reglas y los métodos de envío, comience a depurar desde aquí. * * @param \Magento\Shipping\Model\Rate\Result $asunto * @param \Magento\Quote\Model\Quote\Address\RateResult\AbstractResult|\Magento\Shipping\Model\Rate\Result $result * Matriz @return */ función pública beforeAppend($sujeto, $resultado) { if (!$resultado instancia de \Magento\Quote\Model\Quote\Address\RateResult\Method) { devolver [$resultado]; } $filtableMethods = [ 'tarifa plana_tarifa plana', 'ups_XDM', 'ups_XPR', 'ups_WXS', 'método_portador', // ... añade aquí tus códigos de método ]; $métodoCode = $resultado->getCarrier() . '_' . $resultado->getMethod(); if (!in_array($métodoCódigo, $filtableMethods)) { devolver [$resultado]; } /** @var \Magento\Quote\Model\Quote $quote */ $presupuesto = $esta->sesión->obtenerPresupuesto(); $artículospresupuesto = $presupuesto->getAllItems(); $HeavyWeightFlag = falso; foreach ($quoteItems como $elemento) { if ($elemento->obtenerPeso() > 100) { $heavyWeightFlag = verdadero; Seguir; } } if ($heavyWeightFlag == verdadero) { $resultado->setIsDisabled(true); } devolver [$resultado]; } }
Realizamos 3 comprobaciones en el cuerpo de nuestro complemento:
1.
!$resultado instancia de \Magento\Quote\Model\Quote\Address\RateResult\Method
– asegura que en el punto de entrada obtengamos lo que necesitamos: esa es una instancia de un método de envío. En caso de que no lo sea, simplemente lo devolvemos tal como está.
2.
!in_array($métodoCódigo, $filtableMethods)
– a continuación, verificamos si el método actual está en la lista de métodos para filtrar. En caso de que no sea así, lo devolvemos tal como está.
3.
$HeavyWeightFlag == verdadero
– es la última y principal comprobación. Si la bandera se aplica al valor real, el método actual se deshabilita: $resultado->setIsDisabled(true);
Intentaremos filtrar al menos un producto agregado al carrito y que tenga un peso de más de 100 unidades estándar (libras o kilos).
Los métodos disponibles para filtrar son 'flatrate_flatrate','ups_XDM','ups_XPR','ups_WXS','carrier_method' . Están codificados y almacenados en la matriz $filtableMethods .
Operamos sobre el código utilizando el código completo del método de envío que, por regla general, consiste en el código del transportista ($resultado->getCarrier()) y el código del método mismo ($resultado->getMethod()) conectado con " _” .
Los productos necesarios para el cheque se toman directamente de la cotización del cliente actual.
NOTA
Un pequeño fragmento de código en el constructor de la clase de matriz le permitirá definir la cotización tanto en el frontend como en el backend (siempre que se haya creado un pedido en el panel de administración).
Usando \Magento\Framework\App\State podemos comprobar en qué zona nos encontramos en este momento, y seleccionar la cotización necesaria:
1. \Magento\Backend\Model\Session\Quote para administrador
2. \Magento\Checkout\Model\Session para la interfaz
¡Eso es todo!
Ahora podemos validar los métodos de envío y pasar a la siguiente etapa: crear un complemento para deshabilitar los métodos de envío no válidos (según nuestras condiciones).
Así es como:
> MageWorx\ShippingRules\Model\Plugin\Shipping\Rate\Result\GetAllRates
/** * Derechos de autor 2016 MageWorx. Reservados todos los derechos. * Consulte LICENSE.txt para conocer los detalles de la licencia. */ espacio de nombres MageWorx\ShippingRules\Model\Plugin\Shipping\Rate\Result; clase ObtenerTodasLasTasas { /** * Deshabilitar las tarifas de envío marcadas. * * NOTA: Si no puede ver algunas de las tarifas de envío, comience a depurar desde aquí. Al principio, marque 'is_disabled' * param en el objeto de tarifa de envío. * * @param \Magento\Shipping\Model\Rate\Result $asunto * @param array $resultado * Matriz @return */ función pública afterGetAllRates($asunto, $resultado) { foreach ($resultado como $clave => $tasa) { if ($tasa->getIsDisabled()) { unset($resultado[$clave]); } } devolver $resultado; } }
Este complemento se utiliza para obtener todos los datos de métodos de envío disponibles y verificar cada uno de ellos. Si alguno de los métodos tiene la marca “is_disabled” , simplemente lo excluimos de la lista, lo que nos permite ver solo aquellos métodos que corresponden a las condiciones creadas en el validador. Estos métodos se excluyen en cualquier página de un sitio web, ya sea un bloque de envío estimado en el carrito de compras o la página de pago.
Ahora, para verificar cómo funcionan los complementos, debemos registrarlos en el archivo:
> MageWorx/Reglas de envío/etc/di.xml
<?xml versión="1.0"?> <config xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd"> <escriba nombre="Magento\Envío\Modelo\Tarifa\Resultado"> <nombre del complemento="mageworx_shippingrules_update_rate_result" type="MageWorx\ShippingRules\Model\Plugin\Shipping\Rate\Result\Append" ordenarOrden="10" inhabilitado="falso"/> <plugin name="mageworx_shippingrules_update_disabled_or_enabled_rates" type="MageWorx\ShippingRules\Model\Plugin\Shipping\Rate\Result\GetAllRates" ordenarOrden="11" inhabilitado="falso"/> </tipo> </config>
NOTA
Por razones descriptivas, los complementos se dividen en 2 clases diferentes. En un escenario ordinario, puede usar solo 1 clase para modificar 2 métodos diferentes de la clase Magento\Shipping\Model\Rate\Result.
¿Por qué funciona de esta manera?
Magento\Shipping\Model\Rate\Result es la clase principal de Magento 2 responsable de la procesión de los métodos de envío. Su método getAllRates se utiliza para obtener listas de métodos de envío.
Mientras tanto, agregar métodos de envío generalmente se realiza con la ayuda del método 'anexar'. Habiendo validado los métodos mientras se agregan y excluyéndolos de la colección, podemos obtener una lista de métodos válidos.
La validación en sí también se puede modificar.
Nuestra extensión tiene una gran clase especial que almacena una colección de filtros personalizados con diferentes condiciones (como store_id, customer_group_id, date from/to, days of the week, etc. ). también tiene una clase separada con una colección de acciones que deben aplicarse a un método de envío (por ejemplo, habilitarlo o deshabilitarlo, reescribir su costo según diferentes condiciones, agregar costos adicionales o descuentos, etc. )
El resultado del primer complemento en la depuración se parece a esto (para un producto con el peso de 1 unidad):
Así es como se ve en el carrito de compras (ups_WXS todavía está disponible, ya que no se excede el límite de peso):
Sin embargo, si cambia el peso del producto a 101, este método de envío no estará disponible:
Vuelve a estar disponible si lo excluyó de la lista:
En la caja:
NOTA
Puede obtener la lista de todos los métodos de envío del sistema disponibles directamente en el código de la siguiente manera:
/** * Matriz de retorno de los transportistas. * Si $isActiveOnlyFlag se establece en verdadero, devolverá solo los operadores activos * * @param bool $isActiveOnlyFlag * Matriz @return */ función pública getAvailableMethods($isActiveOnlyFlag = false) { $transportistas = $this->shippingConfig->getAllCarriers(); foreach ($transportistas as $codigodetransportista => $modelodetransportista) { if (!$carrierModel->isActive() && (bool)$isActiveOnlyFlag === verdadero) { Seguir; } $carrierMethods = $carrierModel->getAllowedMethods(); si (! $ métodos de transporte) { Seguir; } foreach ($carrierMethods as $methodCode => $methodTitle) { $métodos[] = $carrierCode . '_' . $métodoCódigo; } } return !empty($métodos) ? $métodos: []; }
Donde `$this->shippingConfig` es una instancia de la clase `Magento\Shipping\Model\Config` . Con este código, puede crear el modelo fuente para el selector de métodos de envío en la configuración de la extensión (por lo tanto, no tendrá que codificarlo en el complemento).
Y por último pero no menos importante.
Si no desea crear su propia extensión para deshabilitar los métodos de envío, puede usar nuestra solución Shipping Suite para Magento 2 .
La extensión le permite excluir cualquier método de envío cuando sea necesario con solo un par de clics del mouse.
1. Cree una nueva regla de envío con la siguiente condición:
2. Seleccione la acción Ocultar método de envío en la lista y elija qué métodos deben desactivarse:
NOTA
Si no encuentra el atributo 'peso' en la lista de condiciones, verifique si está habilitado para usar en las reglas de promoción:
Si tiene alguna pregunta o idea sobre cómo mejorar aún más nuestra extensión , comparta su opinión en la sección de comentarios a continuación.