Recalls74240 Posted August 9, 2013 Share Posted August 9, 2013 Bonjour, Je vous explique mon problème, sur ma boutique qui utilise Prestashop 1.5.4.1 j'ai deux transporteurs qui s'appliquent chacun un une catégorie spécifique de produits. 1 transporteur par lettre pour produit A en fonction du prix 1 transporteur par colis pour produit B en fonction du poids Jusque là tout va bien, 1 ) si le client commande seulement un produit A, seulement le transporteur par lettre lui est proposé. 2 ) si le client commande seulement un produit B, seulement le transporteur par colis lui est proposé. 3) si le client commande un produit A et B, le transporteur par lettre et par colis lui seront proposé et seront additionné pour donner un total de frais de port. Si le client passe une commande avec dans son panier la formule 3), une fois le paiement validé, deux mails de confirmation sont envoyé au client car cela créé une commande liée avec la même référence mais avec un #1 pour la commande du produit qui va être livré le transporteur par lettre et la même référence suivie de #2 avec la commande du produit qui va être livré le transporteur par colis. Le problème, dans les deux mails envoyé au client (voir image MailClient.jpg) , les deux produits sont listé dans les deux mail avec un frais de port et un total à payer correspondant à un seul produit alors que dans les deux mails envoyé via le module alerte mail (voir image MailAdmin.jpg) tout est ok, ils affichent un seul produit avec le bon frais de port et le bon total à payer En regardant les smarty utilisés, le mail côté client utilise {products} et le mail admin utilise {items} Ma question est quel smarty il faut utilisé dans le mail de confirmation client pour afficher que le produit concerné ou quelle class modifier dans prestashop pour réglé ce problème qui peut porter à confusion le client surtout si il a choisi de payer par virement bancaire. Merci d'avance pour celui ou celle qui peut m'apporter un début de réponse sur le sujet Bonne journée Link to comment Share on other sites More sharing options...
Recalls74240 Posted August 9, 2013 Author Share Posted August 9, 2013 Re, Bon j'ai trouvé un début de piste, la construction de la boucle des produits injecté via le smarty {products} dans l'email client est géré dans le fichier class\PaymentModule.php à la ligne 346 // Construct order detail table for the email $products_list = ''; $virtual_product = true; foreach ($products as $key => $product) { $price = Product::getPriceStatic((int)$product['id_product'], false, ($product['id_product_attribute'] ? (int)$product['id_product_attribute'] : null), 6, null, false, true, $product['cart_quantity'], false, (int)$order->id_customer, (int)$order->id_cart, (int)$order->{Configuration::get('PS_TAX_ADDRESS_TYPE')}); $price_wt = Product::getPriceStatic((int)$product['id_product'], true, ($product['id_product_attribute'] ? (int)$product['id_product_attribute'] : null), 2, null, false, true, $product['cart_quantity'], false, (int)$order->id_customer, (int)$order->id_cart, (int)$order->{Configuration::get('PS_TAX_ADDRESS_TYPE')}); $customization_quantity = 0; $customized_datas = Product::getAllCustomizedDatas((int)$order->id_cart); if (isset($customized_datas[$product['id_product']][$product['id_product_attribute']])) { $customization_text = ''; foreach ($customized_datas[$product['id_product']][$product['id_product_attribute']][$order->id_address_delivery] as $customization) { if (isset($customization['datas'][Product::CUSTOMIZE_TEXTFIELD])) foreach ($customization['datas'][Product::CUSTOMIZE_TEXTFIELD] as $text) $customization_text .= $text['name'].': '.$text['value'].'<br />'; if (isset($customization['datas'][Product::CUSTOMIZE_FILE])) $customization_text .= sprintf(Tools::displayError('%d image(s)'), count($customization['datas'][Product::CUSTOMIZE_FILE])).'<br />'; $customization_text .= '---<br />'; } $customization_text = rtrim($customization_text, '---<br />'); $customization_quantity = (int)$product['customization_quantity']; $products_list .= '<tr style="background-color: '.($key % 2 ? '#DDE2E6' : '#EBECEE').';"> <td style="padding: 0.6em 0.4em;width: 15%;">'.$product['reference'].'</td> <td style="padding: 0.6em 0.4em;width: 30%;"><strong>'.$product['name'].(isset($product['attributes']) ? ' - '.$product['attributes'] : '').' - '.Tools::displayError('Customized').(!empty($customization_text) ? ' - '.$customization_text : '').'</strong></td> <td style="padding: 0.6em 0.4em; width: 20%;">'.Tools::displayPrice(Product::getTaxCalculationMethod() == PS_TAX_EXC ? Tools::ps_round($price, 2) : $price_wt, $this->context->currency, false).'</td> <td style="padding: 0.6em 0.4em; width: 15%;">'.$customization_quantity.'</td> <td style="padding: 0.6em 0.4em; width: 20%;">'.Tools::displayPrice($customization_quantity * (Product::getTaxCalculationMethod() == PS_TAX_EXC ? Tools::ps_round($price, 2) : $price_wt), $this->context->currency, false).'</td> </tr>'; } if (!$customization_quantity || (int)$product['cart_quantity'] > $customization_quantity) $products_list .= '<tr style="background-color: '.($key % 2 ? '#DDE2E6' : '#EBECEE').';"> <td style="padding: 0.6em 0.4em;width: 15%;">'.$product['reference'].'</td> <td style="padding: 0.6em 0.4em;width: 30%;"><strong>'.$product['name'].(isset($product['attributes']) ? ' - '.$product['attributes'] : '').'</strong></td> <td style="padding: 0.6em 0.4em; width: 20%;">'.Tools::displayPrice(Product::getTaxCalculationMethod() == PS_TAX_EXC ? Tools::ps_round($price, 2) : $price_wt, $this->context->currency, false).'</td> <td style="padding: 0.6em 0.4em; width: 15%;">'.((int)$product['cart_quantity'] - $customization_quantity).'</td> <td style="padding: 0.6em 0.4em; width: 20%;">'.Tools::displayPrice(((int)$product['cart_quantity'] - $customization_quantity) * (Product::getTaxCalculationMethod() == PS_TAX_EXC ? Tools::ps_round($price, 2) : $price_wt), $this->context->currency, false).'</td> </tr>'; // Check if is not a virutal product for the displaying of shipping if (!$product['is_virtual']) $virtual_product &= false; } // end foreach ($products) Puis le smarty est créer à la ligne 599 '{products}' => $this->formatProductAndVoucherForEmail($products_list), Du coté du module Mail alerte cela est gérer dans le fichier \module\mailsalerts\mailalerts.php à la ligne 279 $items_table = ''; $products = $params['order']->getProducts(); $customized_datas = Product::getAllCustomizedDatas((int)$params['cart']->id); Product::addCustomizationPrice($products, $customized_datas); foreach ($products as $key => $product) { $unit_price = $product['product_price_wt']; $customization_text = ''; if (isset($customized_datas[$product['product_id']][$product['product_attribute_id']])) { foreach ($customized_datas[$product['product_id']][$product['product_attribute_id']] as $customization) { if (isset($customization['datas'][_CUSTOMIZE_TEXTFIELD_])) foreach ($customization['datas'][_CUSTOMIZE_TEXTFIELD_] as $text) $customization_text .= $text['name'].': '.$text['value'].'<br />'; if (isset($customization['datas'][_CUSTOMIZE_FILE_])) $customization_text .= count($customization['datas'][_CUSTOMIZE_FILE_]).' '.$this->l('image(s)').'<br />'; $customization_text .= '---<br />'; } $customization_text = rtrim($customization_text, '---<br />'); } $items_table .= '<tr style="background-color:'.($key % 2 ? '#DDE2E6' : '#EBECEE').';"> <td style="padding:0.6em 0.4em;">'.$product['product_reference'].'</td> <td style="padding:0.6em 0.4em;"> <strong>' .$product['product_name'].(isset($product['attributes_small']) ? ' '.$product['attributes_small'] : '').(!empty($customization_text) ? '<br />'.$customization_text : ''). '</strong> </td> <td style="padding:0.6em 0.4em; text-align:right;">'.Tools::displayPrice($unit_price, $currency, false).'</td> <td style="padding:0.6em 0.4em; text-align:center;">'.(int)$product['product_quantity'].'</td> <td style="padding:0.6em 0.4em; text-align:right;">'.Tools::displayPrice(($unit_price * $product['product_quantity']), $currency, false).'</td> </tr>'; } et le smarty est construit à la ligne 374 '{items}' => $items_table, Si un développeur plus expérimenté passe dans le coin pour une petite explication des differences entre ces deux codes ça serait cool car là je coince et je m'arrache le peu de cheveux qu'il me reste depuis plus de 4 heures 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