Buenas @samueldev, @marcosdeco tiene razón, la versión de PrestaShop es importante, pero por el código, asumo que estamos en PrestaShop 1.7.x, lo cual es un buen punto de partida para este tipo de overrides.
El problema principal que señalas en tu código es cómo tomar la decisión de filtrar los transportistas una vez que has identificado el producto más caro. Tu lógica para encontrar el producto más costoso es correcta.
La clave está en cómo decides qué transportista se aplica a ese producto. Si tienes un campo personalizado en tus productos (por ejemplo, una característica de producto o un campo extra guardado en ps_product o ps_product_shop) que especifique el id_carrier preferido para ese artículo en particular, podrías usarlo. Si no, tendrías que mantener un mapeo en tu módulo.
Aquí tienes una forma de completar el filtrado en tu override, asumiendo que tienes una manera de obtener el ID del transportista preferido para el producto más caro. Esto debería ir en modules/mymodule/override/classes/Carrier.php como ya lo estabas haciendo:
// modules/mymodule/override/classes/Carrier.php (continúa)
class Carrier extends CarrierCore
{
public static function getCarriersForOrder(Cart $cart, $id_zone = null, $shipping_cost = null)
{
$carriers = parent::getCarriersForOrder($cart, $id_zone, $shipping_cost);
$mostExpensiveProduct = null;
$maxPrice = 0;
foreach ($cart->getProducts() as $product) {
if ((float)$product['total_wt'] > $maxPrice) {
Explicación:
- Identificación del producto más caro: Tu bucle
foreach ya hace esto correctamente, obteniendo el producto con el total_wt (precio total con impuestos) más alto.
- Obtención del
preferredCarrierId: La línea ($mostExpensiveProduct['id_product'] == 15) ? 7 : 0; es un ejemplo simplificado. En un caso real, deberías reemplazar 15 y 7 por una lógica que obtenga el ID del transportista preferido para ese id_product de forma dinámica. Esto podría ser a través de una característica de producto, una tabla de mapeo personalizada en tu módulo, o un atributo específico.
Aunque este override puede funcionar, ten en cuenta que modificar el core directamente o usar overrides sin un módulo que los gestione bien es arriesgado y puede causar problemas en futuras actualizaciones. Para una solución más mantenible y que no tengas que reescribir con cada nueva versión de PrestaShop, te recomendaría considerar un módulo específico. Existe una solución para gestionar métodos de envío transportistas sin tocar el código core que hace exactamente esto de forma modular y sin riesgos de rotura.