beyonceuk1 Posted February 23, 2021 Share Posted February 23, 2021 Hi all - I've been using PS 1.6.1 for years for many stores, very happy with it and will move to 1.7 one day. The only hurdle I've never been able to overcome is shipping. Our carrier (Royal Mail) calculates pricing based on weight and package dimensions. Although PS allows product dimensions to be entered it only seems to restrict carriers based on the largest item in an order, not on the total package dimensions. This seems like madness to me but up to now I've been stuck with it. Has anyone ever solved this problem, or does anyone know where I would amend the formula PS uses to calculate the order dimensions? At this stage I'm just reaching out in the dark and hoping to find a caring genius... Link to comment Share on other sites More sharing options...
TonyB6000 Posted February 24, 2021 Share Posted February 24, 2021 I have a similar problem with Royal Mail/PS in the UK when ordering multiple products. When a customer adds multiple products to the cart, PS ignores the dimensions and just uses weight to select a carrier. This means that a large product with low weight can be added to the cart several times and still go on the cheapest carrier, because the weight is below the limit, but the combined size is way over the size for the carrier option. How can I get Prestashop to look at both the total weight and the total size? Link to comment Share on other sites More sharing options...
TonyB6000 Posted February 25, 2021 Share Posted February 25, 2021 Here is my solution for PS 1.6.1.23. I only care about the depth of the product. As these stack up they become too tall to fit in the Large Letter carrier option. I added the following code to the file classes>Carrier.php. Find: $cart_quantity = 0; $cart_weight = 0; foreach ($cart->getProducts(false, false) as $cart_product) { if ($cart_product['id_product'] == $product->id) { $cart_quantity += $cart_product['cart_quantity']; } if (isset($cart_product['weight_attribute']) && $cart_product['weight_attribute'] > 0) { $cart_weight += ($cart_product['weight_attribute'] * $cart_product['cart_quantity']); } else { $cart_weight += ($cart_product['weight'] * $cart_product['cart_quantity']); } } if ($product->width > 0 || $product->height > 0 || $product->depth > 0 || $product->weight > 0 || $cart_weight > 0) { foreach ($carrier_list as $key => $id_carrier) { $carrier = new Carrier($id_carrier); // Get the sizes of the carrier and the product and sort them to check if the carrier can take the product. $carrier_sizes = array((int)$carrier->max_width, (int)$carrier->max_height, (int)$carrier->max_depth); $product_sizes = array((int)$product->width, (int)$product->height, (int)$product->depth); rsort($carrier_sizes, SORT_NUMERIC); rsort($product_sizes, SORT_NUMERIC); if (($carrier_sizes[0] > 0 && $carrier_sizes[0] < $product_sizes[0]) || ($carrier_sizes[1] > 0 && $carrier_sizes[1] < $product_sizes[1]) || ($carrier_sizes[2] > 0 && $carrier_sizes[2] < $product_sizes[2])) { $error[$carrier->id] = Carrier::SHIPPING_SIZE_EXCEPTION; unset($carrier_list[$key]); } if ($carrier->max_weight > 0 && ($carrier->max_weight < $product->weight * $cart_quantity || $carrier->max_weight < $cart_weight)) { $error[$carrier->id] = Carrier::SHIPPING_WEIGHT_EXCEPTION; unset($carrier_list[$key]); } } } and replace with: $cart_quantity = 0; $cart_weight = 0; $cart_depth = 0; foreach ($cart->getProducts(false, false) as $cart_product) { if ($cart_product['id_product'] == $product->id) { $cart_quantity += $cart_product['cart_quantity']; } if (isset($cart_product['weight_attribute']) && $cart_product['weight_attribute'] > 0) { $cart_weight += ($cart_product['weight_attribute'] * $cart_product['cart_quantity']); } else { $cart_weight += ($cart_product['weight'] * $cart_product['cart_quantity']); $cart_depth += ($cart_product['depth'] * $cart_product['cart_quantity']); } } if ($product->width > 0 || $product->height > 0 || $product->depth > 0 || $product->weight > 0 || $cart_weight > 0) { foreach ($carrier_list as $key => $id_carrier) { $carrier = new Carrier($id_carrier); // Get the sizes of the carrier and the product and sort them to check if the carrier can take the product. $carrier_sizes = array((int)$carrier->max_width, (int)$carrier->max_height, (int)$carrier->max_depth); $product_sizes = array((int)$product->width, (int)$product->height, (int)$product->depth); rsort($carrier_sizes, SORT_NUMERIC); rsort($product_sizes, SORT_NUMERIC); if (($carrier_sizes[0] > 0 && $carrier_sizes[0] < $product_sizes[0]) || ($carrier_sizes[1] > 0 && $carrier_sizes[1] < $product_sizes[1]) || ($carrier_sizes[2] > 0 && $carrier_sizes[2] < $product_sizes[2])) { $error[$carrier->id] = Carrier::SHIPPING_SIZE_EXCEPTION; unset($carrier_list[$key]); } if ($carrier->max_weight > 0 && ($carrier->max_weight < $product->weight * $cart_quantity || $carrier->max_weight < $cart_weight)) { $error[$carrier->id] = Carrier::SHIPPING_WEIGHT_EXCEPTION; unset($carrier_list[$key]); } if ($carrier->max_depth > 0 && ($carrier->max_depth < $product->depth * $cart_quantity || $carrier->max_depth < $cart_depth)) { $error[$carrier->id] = Carrier::SHIPPING_WEIGHT_EXCEPTION; unset($carrier_list[$key]); } } } Now the carrier selection considers the combined depth of the products in the cart as well as the combined weight. Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now