yvanb Posted June 7, 2014 Share Posted June 7, 2014 (edited) Bonjour à tous. Je suis sur le point de passer de PS 1.4.9 à PS 1.6 tous en adaptant ma boutique à la loi Hamon.J'ai donc fait un petit bout de code permettant aux clients de lire les CGV directement sur la page des transporteurs, mais la différence c'est qu'a la place de la case à cocher, j'ai mis un bouton qui devient vert quand on clique dessus, et donc qui fait accepter les CGV. Je crois, d'après ce que j'ai lu sur cette loi, que les cases à cocher deviennent interdites sur le processus de commande et même comme options dans le panier. Ce code à été testé et fonctionne sur PS 1.4.9 et sur PS 1.6.0.6 Recherchez dans order-carrier.tpl : {if $conditions AND $cms_id} <p class="carrier_title">{l s='Terms of service'}</p> <p class="checkbox"> <input type="checkbox" name="cgv" id="cgv" value="1" {if $checkedTOS}checked="checked"{/if} /> <label for="cgv">{l s='I agree to the terms of service and will adhere to them unconditionally.'}</label> <a href="{$link_conditions|escape:'html':'UTF-8'}" class="iframe" rel="nofollow">{l s='(Read the Terms of Service)'}</a> </p> {/if} et remplacez par ceci : <!-- Code pour afficher les CGV avec un bouton à cliquer --> {if $conditions AND $cms_id} <p class="carrier_title">{l s='Terms of service'}</p> <div class="clear"></div> <div style="height:200px;margin:5px;padding:5px;border:1px solid #E0E0E0"> <iframe id="fancybox-frame" width="100%" height="100%" frameborder="0" hspace="0" scrolling="auto" src="{$link_conditions}?content_only=1""></iframe> </div> <div class="clear"></div> <p class="checkbox"> <input type="checkbox" name="cgv" id="cgv" value="1" {if $checkedTOS}checked="checked"{/if} style="display:none;" /> <button type="button" onclick="check(this, '#20D00C');" >{l s='I agree to the terms of service and will adhere to them unconditionally.'}</button> <script type="text/javascript"> $('a.iframe').fancybox(); function check(btn, color) { document.getElementById("cgv").checked = true; btn.style.backgroundColor = color; } </script> </p> {/if} <!-- Code pour afficher les CGV avec un bouton à cliquer --> Question résultat, voici ce que cela donne quand le client clique : Je continuerais ce topic pour intégrer l'envoi des CGV en PDF dans l'email de confirmation... J'aime l'idée de PS en Open Source, c'est pour cela que je tente de proposer des solutions alternatives gratuites, surtout quand cela dépend des lois. [EDIT] Chose promise, chose dû, voici le code pour envoyer les CGV aux clients dans le mail de confirmation. (Ce n'est pas moi l'auteur de ce code, je l'ai trouver sur ce forum, mais je ne sais plus où....). Par contre, je l'ai testé avec succès sur PS 1.4.9 et sur PS 1.6.0.6. Ouvrez classes/Mail.php, et recherchez cette ligne : /* Send mail */ Ajoutez juste au dessus ce code-ci : if (substr($template,3) == "order_conf" && file_exists(_PS_ROOT_DIR_.'/docs/CGV_'.$iso.'.pdf')) { $CGVcms = new CMS((int)(Configuration::get('PS_CONDITIONS_CMS_ID')), (int)$id_lang); $message->attach(new Swift_Message_Attachment(new Swift_File(_PS_ROOT_DIR_.'/docs/CGV_'.$iso.'.pdf'), $CGVcms->meta_title.'.pdf', 'application/pdf')); } Il ne vous reste plus qu'à placer vos fichiers CGV_fr.pdf, CGV_en.pdf, un par langue, dans le dossier docs/ qui se situe à la racine de votre Prestashop. Si une âme charitable passe dans le coin et sait comment faire pour transformer la page CMS directement en pdf, je suis preneur. En attendant, ce code fonctionne et nous permet d'être "aux normes"... [/EDIT] Edited June 10, 2014 by yvanb (see edit history) 1 Link to comment Share on other sites More sharing options...
scea Posted June 7, 2014 Share Posted June 7, 2014 Bonjour à tous. Je suis sur le point de passer de PS 1.4.9 à PS 1.6 tous en adaptant ma boutique à la loi Hamon. J'ai donc fait un petit bout de code permettant aux clients de lire les CGV directement sur la page des transporteurs, mais la différence c'est qu'a la place de la case à cocher, qui, je crois, devient interdit avec cette loi, alors j'ai mis un bouton qui devient vert quand on clique dessus, et donc qui fait accepter les CGV. Ce code à été testé et fonctionne sur PS 1.4.9 et sur PS 1.6.0.6 Recherchez dans order-carrier.tpl : {if $conditions AND $cms_id} <p class="carrier_title">{l s='Terms of service'}</p> <p class="checkbox"> <input type="checkbox" name="cgv" id="cgv" value="1" {if $checkedTOS}checked="checked"{/if} /> <label for="cgv">{l s='I agree to the terms of service and will adhere to them unconditionally.'}</label> <a href="{$link_conditions|escape:'html':'UTF-8'}" class="iframe" rel="nofollow">{l s='(Read the Terms of Service)'}</a> </p> {/if} et remplacez par ceci : <!-- Code pour afficher les CGV avec un bouton à cliquer --> {if $conditions AND $cms_id} <p class="carrier_title">{l s='Terms of service'}</p> <div class="clear"></div> <div style="height:200px;margin:5px;padding:5px;border:1px solid #E0E0E0"> <iframe id="fancybox-frame" width="100%" height="100%" frameborder="0" hspace="0" scrolling="auto" src="{$link_conditions}"></iframe> </div> <div class="clear"></div> <p class="checkbox"> <input type="checkbox" name="cgv" id="cgv" value="1" {if $checkedTOS}checked="checked"{/if} style="display:none;" /> <button type="button" onclick="check(this, '#20D00C');" >{l s='I agree to the terms of service and will adhere to them unconditionally.'}</button> <script type="text/javascript"> $('a.iframe').fancybox(); function check(btn, color) { document.getElementById("cgv").checked = true; btn.style.backgroundColor = color; } </script> </p> {/if} <!-- Code pour afficher les CGV avec un bouton à cliquer --> Question résultat, voici ce que cela donne quand le client clique : cgv.jpg Je continuerais ce topic pour intégrer l'envoi des CGV en PDF dans l'email de confirmation... J'aime l'idée de PS en Open Source, c'est pour cela que je tente de proposer des solutions alternatives gratuites, surtout quand cela dépend des lois. Bonjour Merci pour la contribution Suis bien sur interressé "pour integrer l'envoi des CGV en pdf". Link to comment Share on other sites More sharing options...
yvanb Posted June 8, 2014 Author Share Posted June 8, 2014 Bonjour, consultez la fin de mon 1er message (EDIT), je viens à l'instant de posté une "solution" pour l'envoi des pdf dans l'email de confirmation... 1 Link to comment Share on other sites More sharing options...
laurens Posted June 9, 2014 Share Posted June 9, 2014 Bonjour, merci pour ta contribution , il me semble que les cases à cocher sont toujours autorisée mais ce qui est interdit c'est les cases pré-cochées Link to comment Share on other sites More sharing options...
yvanb Posted June 9, 2014 Author Share Posted June 9, 2014 (edited) Bonjour, oui effectivement ce sont les cases pré-cochées qui deviennent interdites, j'ai trouvé ceci qui résume bien cette nouvelle loi : https://www.cic.fr/fr/banques/entreprises/dossiers/ce-qui-change-avec-la-loi-hamon/index.html PS: Ce n'est pas ma banque, recherche google... Ensuite, je réfléchissais pour faire un formulaire de rétractation, mais au final, je pense que je vais également envoyer ce formulaire comme les CGV, lors de la commande. Dès qu'un client ce rétracte pour la totalité de la commande passer celle-ci en annulé ou juste pour un produit faire un retour. Qu'en pensez vous ? Edited June 9, 2014 by yvanb (see edit history) Link to comment Share on other sites More sharing options...
laurens Posted June 9, 2014 Share Posted June 9, 2014 Oui je pense que le mieux et de joindre le formulaire de rétractation avec les cgv. J'ai chercher partout un modèle conforme à cette loi mais je n'ai rien trouvé, je vais donc utiliser celui que j'ai. Link to comment Share on other sites More sharing options...
scea Posted June 10, 2014 Share Posted June 10, 2014 Bonjour J'ai beau essayer d'inserer le code pour l'envoi des CGV avec le mail de confirmation et je n'arrive pas à le faire fonctionner ? auriez vous la gentillesse de me dire exactement ou mettre le code ? voici mon fichier Merci par avance ------------------------------------------------ <?php/** 2007-2014 PrestaShop** NOTICE OF LICENSE** This source file is subject to the Open Software License (OSL 3.0)* that is bundled with this package in the file LICENSE.txt.* It is also available through the world-wide-web at this URL:* http://opensource.org/licenses/osl-3.0.php* If you did not receive a copy of the license and are unable to* obtain it through the world-wide-web, please send an email* to [email protected] so we can send you a copy immediately.** DISCLAIMER** Do not edit or add to this file if you wish to upgrade PrestaShop to newer* versions in the future. If you wish to customize PrestaShop for your* needs please refer to http://www.prestashop.com for more information.** @author PrestaShop SA <[email protected]>* @copyright 2007-2014 PrestaShop SA* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)* International Registered Trademark & Property of PrestaShop SA*/include_once(_PS_SWIFT_DIR_.'Swift.php');include_once(_PS_SWIFT_DIR_.'Swift/Connection/SMTP.php');include_once(_PS_SWIFT_DIR_.'Swift/Connection/NativeMail.php');include_once(_PS_SWIFT_DIR_.'Swift/Plugin/Decorator.php');class MailCore{ const TYPE_HTML = 1; const TYPE_TEXT = 2; const TYPE_BOTH = 3; ICI ? /** ICI ? * Send Email * * @param int $id_lang Language of the email (to translate the template) * @param string $template Template: the name of template not be a var but a string ! * @param string $subject * @param string $template_vars * @param string $to * @param string $to_name * @param string $from * @param string $from_name * @param array $file_attachment Array with three parameters (content, mime and name). You can use an array of array to attach multiple files * @param bool $modeSMTP * @param string $template_path * @param bool $die * @param string $bcc Bcc recipient */ public static function Send($id_lang, $template, $subject, $template_vars, $to, $to_name = null, $from = null, $from_name = null, $file_attachment = null, $mode_smtp = null, $template_path = _PS_MAIL_DIR_, $die = false, $id_shop = null, $bcc = null) { $configuration = Configuration::getMultiple(array( 'PS_SHOP_EMAIL', 'PS_MAIL_METHOD', 'PS_MAIL_SERVER', 'PS_MAIL_USER', 'PS_MAIL_PASSWD', 'PS_SHOP_NAME', 'PS_MAIL_SMTP_ENCRYPTION', 'PS_MAIL_SMTP_PORT', 'PS_MAIL_TYPE' ), null, null, $id_shop); // Returns immediatly if emails are deactivated if ($configuration['PS_MAIL_METHOD'] == 3) return true; $theme_path = _PS_THEME_DIR_; // Get the path of theme by id_shop if exist if (is_numeric($id_shop) && $id_shop) { $shop = new Shop((int)$id_shop); $theme_name = $shop->getTheme(); if (_THEME_NAME_ != $theme_name) $theme_path = _PS_ROOT_DIR_.'/themes/'.$theme_name.'/'; } if (!isset($configuration['PS_MAIL_SMTP_ENCRYPTION'])) $configuration['PS_MAIL_SMTP_ENCRYPTION'] = 'off'; if (!isset($configuration['PS_MAIL_SMTP_PORT'])) $configuration['PS_MAIL_SMTP_PORT'] = 'default'; // Sending an e-mail can be of vital importance for the merchant, when his password is lost for example, so we must not die but do our best to send the e-mail if (!isset($from) || !Validate::isEmail($from)) $from = $configuration['PS_SHOP_EMAIL']; if (!Validate::isEmail($from)) $from = null; // $from_name is not that important, no need to die if it is not valid if (!isset($from_name) || !Validate::isMailName($from_name)) $from_name = $configuration['PS_SHOP_NAME']; if (!Validate::isMailName($from_name)) $from_name = null; // It would be difficult to send an e-mail if the e-mail is not valid, so this time we can die if there is a problem if (!is_array($to) && !Validate::isEmail($to)) { Tools::dieOrLog(Tools::displayError('Error: parameter "to" is corrupted'), $die); return false; } if (!is_array($template_vars)) $template_vars = array(); // Do not crash for this error, that may be a complicated customer name if (is_string($to_name) && !empty($to_name) && !Validate::isMailName($to_name)) $to_name = null; if (!Validate::isTplName($template)) { Tools::dieOrLog(Tools::displayError('Error: invalid e-mail template'), $die); return false; } if (!Validate::isMailSubject($subject)) { Tools::dieOrLog(Tools::displayError('Error: invalid e-mail subject'), $die); return false; } /* Construct multiple recipients list if needed */ $to_list = new Swift_RecipientList(); if (is_array($to) && isset($to)) { foreach ($to as $key => $addr) { $addr = trim($addr); if (!Validate::isEmail($addr)) { Tools::dieOrLog(Tools::displayError('Error: invalid e-mail address'), $die); return false; } if (is_array($to_name)) { if ($to_name && is_array($to_name) && Validate::isGenericName($to_name[$key])) $to_name = $to_name[$key]; } if ($to_name == null || $to_name == $addr) $to_name = ''; else $to_name = self::mimeEncode($to_name); $to_list->addTo($addr, $to_name); } $to_plugin = $to[0]; } else { /* Simple recipient, one address */ $to_plugin = $to; if ($to_name == null || $to_name == $to) $to_name = ''; else $to_name = self::mimeEncode($to_name); $to_list->addTo($to, $to_name); } if(isset($bcc)) { $to_list->addBcc($bcc); } $to = $to_list; try { /* Connect with the appropriate configuration */ if ($configuration['PS_MAIL_METHOD'] == 2) { if (empty($configuration['PS_MAIL_SERVER']) || empty($configuration['PS_MAIL_SMTP_PORT'])) { Tools::dieOrLog(Tools::displayError('Error: invalid SMTP server or SMTP port'), $die); return false; } $connection = new Swift_Connection_SMTP($configuration['PS_MAIL_SERVER'], $configuration['PS_MAIL_SMTP_PORT'], ($configuration['PS_MAIL_SMTP_ENCRYPTION'] == 'ssl') ? Swift_Connection_SMTP::ENC_SSL : (($configuration['PS_MAIL_SMTP_ENCRYPTION'] == 'tls') ? Swift_Connection_SMTP::ENC_TLS : Swift_Connection_SMTP::ENC_OFF)); $connection->setTimeout(4); if (!$connection) return false; if (!empty($configuration['PS_MAIL_USER'])) $connection->setUsername($configuration['PS_MAIL_USER']); if (!empty($configuration['PS_MAIL_PASSWD'])) $connection->setPassword($configuration['PS_MAIL_PASSWD']); } else $connection = new Swift_Connection_NativeMail(); if (!$connection) return false; $swift = new Swift($connection, Configuration::get('PS_MAIL_DOMAIN', null, null, $id_shop)); /* Get templates content */ $iso = Language::getIsoById((int)$id_lang); if (!$iso) { Tools::dieOrLog(Tools::displayError('Error - No ISO code for email'), $die); return false; } $template = $iso.'/'.$template; $module_name = false; $override_mail = false; // get templatePath if (preg_match('#'.__PS_BASE_URI__.'modules/#', str_replace(DIRECTORY_SEPARATOR, '/', $template_path)) && preg_match('#modules/([a-z0-9_-]+)/#ui', str_replace(DIRECTORY_SEPARATOR, '/',$template_path), $res)) $module_name = $res[1]; if ($module_name !== false && (file_exists($theme_path.'modules/'.$module_name.'/mails/'.$template.'.txt') || file_exists($theme_path.'modules/'.$module_name.'/mails/'.$template.'.html'))) $template_path = $theme_path.'modules/'.$module_name.'/mails/'; elseif (file_exists($theme_path.'mails/'.$template.'.txt') || file_exists($theme_path.'mails/'.$template.'.html')) { $template_path = $theme_path.'mails/'; $override_mail = true; } if (!file_exists($template_path.$template.'.txt') && ($configuration['PS_MAIL_TYPE'] == Mail::TYPE_BOTH || $configuration['PS_MAIL_TYPE'] == Mail::TYPE_TEXT)) { Tools::dieOrLog(Tools::displayError('Error - The following e-mail template is missing:').' '.$template_path.$template.'.txt', $die); return false; } else if (!file_exists($template_path.$template.'.html') && ($configuration['PS_MAIL_TYPE'] == Mail::TYPE_BOTH || $configuration['PS_MAIL_TYPE'] == Mail::TYPE_HTML)) { Tools::dieOrLog(Tools::displayError('Error - The following e-mail template is missing:').' '.$template_path.$template.'.html', $die); return false; } $template_html = file_get_contents($template_path.$template.'.html'); $template_txt = strip_tags(html_entity_decode(file_get_contents($template_path.$template.'.txt'), null, 'utf-8')); if ($override_mail && file_exists($template_path.$iso.'/lang.php')) include_once($template_path.$iso.'/lang.php'); else if ($module_name && file_exists($theme_path.'mails/'.$iso.'/lang.php')) include_once($theme_path.'mails/'.$iso.'/lang.php'); else if (file_exists(_PS_MAIL_DIR_.$iso.'/lang.php')) include_once(_PS_MAIL_DIR_.$iso.'/lang.php'); else { Tools::dieOrLog(Tools::displayError('Error - The lang file is missing for :').' '.$iso, $die); return false; } /* Create mail and attach differents parts */ $message = new Swift_Message('['.Configuration::get('PS_SHOP_NAME', null, null, $id_shop).'] '.$subject); $message->setCharset('utf-8'); /* Set Message-ID - getmypid() is blocked on some hosting */ $message->setId(Mail::generateId()); $message->headers->setEncoding('Q'); $template_vars = array_map(array('Tools', 'htmlentitiesDecodeUTF8'), $template_vars); $template_vars = array_map(array('Tools', 'stripslashes'), $template_vars); if (Configuration::get('PS_LOGO_MAIL') !== false && file_exists(_PS_IMG_DIR_.Configuration::get('PS_LOGO_MAIL', null, null, $id_shop))) $logo = _PS_IMG_DIR_.Configuration::get('PS_LOGO_MAIL', null, null, $id_shop); else { if (file_exists(_PS_IMG_DIR_.Configuration::get('PS_LOGO', null, null, $id_shop))) $logo = _PS_IMG_DIR_.Configuration::get('PS_LOGO', null, null, $id_shop); else $template_vars['{shop_logo}'] = ''; } ShopUrl::cacheMainDomainForShop((int)$id_shop); /* don't attach the logo as */ if (isset($logo)) $template_vars['{shop_logo}'] = $message->attach(new Swift_Message_EmbeddedFile(new Swift_File($logo), null, ImageManager::getMimeTypeByExtension($logo))); if ((Context::getContext()->link instanceof Link) === false) Context::getContext()->link = new Link(); $template_vars['{shop_name}'] = Tools::safeOutput(Configuration::get('PS_SHOP_NAME', null, null, $id_shop)); $template_vars['{shop_url}'] = Context::getContext()->link->getPageLink('index', true, Context::getContext()->language->id); $template_vars['{my_account_url}'] = Context::getContext()->link->getPageLink('my-account', true, Context::getContext()->language->id); $template_vars['{guest_tracking_url}'] = Context::getContext()->link->getPageLink('guest-tracking', true, Context::getContext()->language->id); $template_vars['{history_url}'] = Context::getContext()->link->getPageLink('history', true, Context::getContext()->language->id); $template_vars['{color}'] = Tools::safeOutput(Configuration::get('PS_MAIL_COLOR', null, null, $id_shop)); $swift->attachPlugin(new Swift_Plugin_Decorator(array($to_plugin => $template_vars)), 'decorator'); if ($configuration['PS_MAIL_TYPE'] == Mail::TYPE_BOTH || $configuration['PS_MAIL_TYPE'] == Mail::TYPE_TEXT) $message->attach(new Swift_Message_Part($template_txt, 'text/plain', '8bit', 'utf-8')); if ($configuration['PS_MAIL_TYPE'] == Mail::TYPE_BOTH || $configuration['PS_MAIL_TYPE'] == Mail::TYPE_HTML) $message->attach(new Swift_Message_Part($template_html, 'text/html', '8bit', 'utf-8')); if ($file_attachment && !empty($file_attachment)) { // Multiple attachments? if (!is_array(current($file_attachment))) $file_attachment = array($file_attachment); foreach ($file_attachment as $attachment) if (isset($attachment['content']) && isset($attachment['name']) && isset($attachment['mime'])) $message->attach(new Swift_Message_Attachment($attachment['content'], $attachment['name'], $attachment['mime'])); } /* Send mail */ $send = $swift->send($message, $to, new Swift_Address($from, $from_name)); $swift->disconnect(); ShopUrl::resetMainDomainCache(); return $send; } catch (Swift_Exception $e) { return false; } } public static function sendMailTest($smtpChecked, $smtpServer, $content, $subject, $type, $to, $from, $smtpLogin, $smtpPassword, $smtpPort = 25, $smtpEncryption) { $swift = null; $result = false; try { if ($smtpChecked) { $smtp = new Swift_Connection_SMTP($smtpServer, $smtpPort, ($smtpEncryption == 'off') ? Swift_Connection_SMTP::ENC_OFF : (($smtpEncryption == 'tls') ? Swift_Connection_SMTP::ENC_TLS : Swift_Connection_SMTP::ENC_SSL)); $smtp->setUsername($smtpLogin); $smtp->setpassword($smtpPassword); $smtp->setTimeout(5); $swift = new Swift($smtp, Configuration::get('PS_MAIL_DOMAIN')); } else $swift = new Swift(new Swift_Connection_NativeMail(), Configuration::get('PS_MAIL_DOMAIN')); $message = new Swift_Message($subject, $content, $type); if ($swift->send($message, $to, $from)) $result = true; $swift->disconnect(); } catch (Swift_ConnectionException $e) { $result = $e->getMessage(); } catch (Swift_Message_MimeException $e) { $result = $e->getMessage(); } return $result; } /** * This method is used to get the translation for email Object. * For an object is forbidden to use htmlentities, * we have to return a sentence with accents. * * @param string $string raw sentence (write directly in file) */ public static function l($string, $id_lang = null, Context $context = null) { global $_LANGMAIL; if (!$context) $context = Context::getContext(); $key = str_replace('\'', '\\\'', $string); if ($id_lang == null) $id_lang = (!isset($context->language) || !is_object($context->language)) ? (int)Configuration::get('PS_LANG_DEFAULT') : (int)$context->language->id; $iso_code = Language::getIsoById((int)$id_lang); $file_core = _PS_ROOT_DIR_.'/mails/'.$iso_code.'/lang.php'; if (Tools::file_exists_cache($file_core) && empty($_LANGMAIL)) include_once($file_core); $file_theme = _PS_THEME_DIR_.'mails/'.$iso_code.'/lang.php'; if (Tools::file_exists_cache($file_theme)) include_once($file_theme); if (!is_array($_LANGMAIL)) return (str_replace('"', '"', $string)); if (array_key_exists($key, $_LANGMAIL) && !empty($_LANGMAIL[$key])) $str = $_LANGMAIL[$key]; else $str = $string; return str_replace('"', '"', stripslashes($str)); } /* Rewrite of Swift_Message::generateId() without getmypid() */ protected static function generateId($idstring = null) { $midparams = array( "utctime" => gmstrftime("%Y%m%d%H%M%S"), "randint" => mt_rand(), "customstr" => (preg_match("/^(?<!\\.)[a-z0-9\\.]+(?!\\.)\$/iD", $idstring) ? $idstring : "swift") , "hostname" => (isset($_SERVER["SERVER_NAME"]) ? $_SERVER["SERVER_NAME"] : php_uname("n")), ); return vsprintf("<%s.%d.%s@%s>", $midparams); } public static function isMultibyte($data) { $length = strlen($data); for ($i = 0; $i < $length; $i++) { $result = ord(($data[$i])); if ($result > 128) { return true; } } return false; } public static function mimeEncode($string, $charset = 'UTF-8', $newline = "\r\n") { if (!self::isMultibyte($string) && strlen($string) < 75) { return $string; } $charset = strtoupper($charset); $start = '=?' . $charset . '?B?'; $end = '?='; $sep = $end . $newline . ' ' . $start; $length = 75 - strlen($start) - strlen($end); $length = $length - ($length % 4); if ($charset === 'UTF-8') { $parts = array(); $maxchars = floor(($length * 3) / 4); $stringLength = strlen($string); while ($stringLength > $maxchars) { $i = (int)$maxchars; $result = ord($string[$i]); while ($result >= 128 && $result <= 191) { $i--; $result = ord($string[$i]); } $parts[] = base64_encode(substr($string, 0, $i)); $string = substr($string, $i); $stringLength = strlen($string); } $parts[] = base64_encode($string); $string = implode($sep, $parts); } else { $string = chunk_split(base64_encode($string), $length, $sep); $string = preg_replace('/' . preg_quote($sep) . '$/', '', $string); } return $start . $string . $end; }} Link to comment Share on other sites More sharing options...
yvanb Posted June 10, 2014 Author Share Posted June 10, 2014 Bonjour, effectivement j'ai pas vu qu'il y avais deux fois le "Send mail". Voici où placer le code : <---- Placez le code ICI ---> /* Send mail */ $send = $swift->send($message, $to, new Swift_Address($from, $fromName)); $swift->disconnect(); return $send; Link to comment Share on other sites More sharing options...
scea Posted June 10, 2014 Share Posted June 10, 2014 Bonjour, effectivement j'ai pas vu qu'il y avais deux fois le "Send mail". Voici où placer le code : <---- Placez le code ICI ---> /* Send mail */ $send = $swift->send($message, $to, new Swift_Address($from, $fromName)); $swift->disconnect(); return $send; Youpi .......ça fonctionne ... Merci beaucoup. Juste une question le fichier "CGV_fr.pdf " arrive bien sur l'email de confirmation et chez moi il est renommé " Part_2.pdf " sur la pièce jointe.Est ce une erreur de ma config ? peux t on avoir le fichier renommé en conditions générales par exemple qui serait plus explicite ? Merci encore et bonne journée Link to comment Share on other sites More sharing options...
yvanb Posted June 10, 2014 Author Share Posted June 10, 2014 Les fichiers CSV_fr.pdf, CSV_en.pdf sont à placé dans le dossiers docs/, personnellement, quand je reçois l'email de confirmation de commande, le fichier Joint se nomme C.G.V.pdf et est envoyé dans la langue de la commande. Cependant, le script donnée plus haut utilise le nom (titre meta) de la page CGV qui se situe dans les pages CMS d'origine ! Si vous avez supprimé cette page le code ne trouvera pas le nom du fichier. Voici ce que vous pouvez faire : Remplacez le code : if (substr($template,3) == "order_conf" && file_exists(_PS_ROOT_DIR_.'/docs/CGV_'.$iso.'.pdf')) { $CGVcms = new CMS((int)(Configuration::get('PS_CONDITIONS_CMS_ID')), (int)$id_lang); $message->attach(new Swift_Message_Attachment(new Swift_File(_PS_ROOT_DIR_.'/docs/CGV_'.$iso.'.pdf'), $CGVcms->meta_title.'.pdf', 'application/pdf')); } Par celui-ci : if (substr($template,3) == "order_conf" && file_exists(_PS_ROOT_DIR_.'/docs/CGV_'.$iso.'.pdf')) { $message->attach(new Swift_Message_Attachment(new Swift_File(_PS_ROOT_DIR_.'/docs/CGV_'.$iso.'.pdf'), 'C.G.V.pdf', 'application/pdf')); } Avec ce dernier code, le fichier joint sera dans la bonne langue mais s’appellera toujours C.G.V.pdf, quelle qu'en soit la langue de commande. Link to comment Share on other sites More sharing options...
mylesk42 Posted June 10, 2014 Share Posted June 10, 2014 Bonjour, Pour info, quel type de modèle de formulaire de rétractation possédez-vous ? Possible de le mettre en téléchargement ? Merci Link to comment Share on other sites More sharing options...
scea Posted June 10, 2014 Share Posted June 10, 2014 Les fichiers CSV_fr.pdf, CSV_en.pdf sont à placé dans le dossiers docs/, personnellement, quand je reçois l'email de confirmation de commande, le fichier Joint se nomme C.G.V.pdf et est envoyé dans la langue de la commande. Cependant, le script donnée plus haut utilise le nom (titre meta) de la page CGV qui se situe dans les pages CMS d'origine ! Si vous avez supprimé cette page le code ne trouvera pas le nom du fichier. Voici ce que vous pouvez faire : Remplacez le code : if (substr($template,3) == "order_conf" && file_exists(_PS_ROOT_DIR_.'/docs/CGV_'.$iso.'.pdf')) { $CGVcms = new CMS((int)(Configuration::get('PS_CONDITIONS_CMS_ID')), (int)$id_lang); $message->attach(new Swift_Message_Attachment(new Swift_File(_PS_ROOT_DIR_.'/docs/CGV_'.$iso.'.pdf'), $CGVcms->meta_title.'.pdf', 'application/pdf')); } Par celui-ci : if (substr($template,3) == "order_conf" && file_exists(_PS_ROOT_DIR_.'/docs/CGV_'.$iso.'.pdf')) { $message->attach(new Swift_Message_Attachment(new Swift_File(_PS_ROOT_DIR_.'/docs/CGV_'.$iso.'.pdf'), 'C.G.V.pdf', 'application/pdf')); } Avec ce dernier code, le fichier joint sera dans la bonne langue mais s’appellera toujours C.G.V.pdf, quelle qu'en soit la langue de commande. Superbeeeeeeeeeee Nikel,ça fonctionne à la perfection. Merci beaucoup de votre aide et de votre code. 1 Link to comment Share on other sites More sharing options...
yvanb Posted June 10, 2014 Author Share Posted June 10, 2014 (edited) D'après ce que j'ai pu voir sur internet, il fraudais un formulaire type ceci : (source : annexe de la directive européenne) À l’attention de [le professionnel insère ici son nom, son adresse géographique et, lorsqu’ils sont disponibles, son numéro de télécopieur et son adresse électronique]: Je/Nous (1) vous notifie/notifions (1) par la présente ma/notre (1) rétractation du contrat portant sur la vente du bien (1)/pour la prestation de service (1) ci-dessous Commandé le (1)/reçu le (1) Nom du (des) consommateur(s) Adresse du (des) consommateur(s) Signature du (des) consommateur(s) (uniquement en cas de notification du présent formulaire sur papier) Date Barrez la mention inutile. J'imagine quelque choses comme ceci : retractation.pdf Edited June 10, 2014 by yvanb (see edit history) Link to comment Share on other sites More sharing options...
mylesk42 Posted June 10, 2014 Share Posted June 10, 2014 Concernant le formulaire de rétractation, je crois qu'il faut qu'il soit disponible en ligne sur le site marchand, pour donner le choix au client, donc le fait de l'envoyer par email ne suffit pas. Sans faire de la pub, n'y ayant aucun intérêt ce module http://addons.prestashop.com/fr/modules-processus-de-commande/16774-hamon-standard-gestion-de-retractation.html fait déjà le job. Link to comment Share on other sites More sharing options...
jujutte24 Posted June 10, 2014 Share Posted June 10, 2014 Je rencontre un problème avec le code pour l'Iframe des cgv. Le pied de page est présent dans cet Iframe. c'est pas très esthétique. Une idée de la façon de ne faire appraitre que le texte des cgv ? Link to comment Share on other sites More sharing options...
yvanb Posted June 10, 2014 Author Share Posted June 10, 2014 Concernant le formulaire de rétractation, je crois qu'il faut qu'il soit disponible en ligne sur le site marchand, pour donner le choix au client, donc le fait de l'envoyer par email ne suffit pas. Sans faire de la pub, n'y ayant aucun intérêt ce module http://addons.prestashop.com/fr/modules-processus-de-commande/16774-hamon-standard-gestion-de-retractation.html fait déjà le job. Oui, c'est justement pour ça que je tente de proposer une solution alternative GRATUITE.... En ce qui concerne le formulaire de rétractation, rien n'est précisé : http://www.journaldunet.com/ebusiness/commerce/loi-hamon-sur-l-e-commerce.shtml On peut, soit le fournir au client, soit, effectivement le mettre en place sur le site voir même les deux. Question de mise en place sur le site, une simple page CMS avec un formulaire de chez http://www.wufoo.com/ (service gratuit) et le tour est joué, vous avez un formulaire de rétractation.... Je rencontre un problème avec le code pour l'Iframe des cgv. Le pied de page est présent dans cet Iframe. c'est pas très esthétique. Une idée de la façon de ne faire appraitre que le texte des cgv ? Je vais regarder ceci, mais je pense que c'est une class CSS qui doit faire "crotter" votre iframe... Link to comment Share on other sites More sharing options...
tresorsdargan Posted June 10, 2014 Share Posted June 10, 2014 Bonjour, Perso, j'ai modifié le bout de code et mis à la place: <div id="tos_option" style="font-size:17px"> <div class="tos_title">{l s='Terms of service'}</div> <div class="clear"></div> <div style="height:230px;margin:5px;padding:5px;border:1px solid #E0E0E0"> <iframe id="fancybox-frame" width="100%" height="100%" frameborder="0" hspace="0" scrolling="auto" src="{$link->getCMSLink('3', 'conditions-generales-de-vente?content_only=1')}"></iframe> </div></div> <div class="clear"></div> ce qui me permet d'afficher en permanent les CGV et uniquement le contenu de la CMS dans l'Iframe. Olivier Link to comment Share on other sites More sharing options...
laurens Posted June 10, 2014 Share Posted June 10, 2014 Bonsoir, j'ai bien les cgv en pièce jointe lors de la confirmation de commande, mais comment ajouter aussi la feuille de rétactation Merci Link to comment Share on other sites More sharing options...
yvanb Posted June 10, 2014 Author Share Posted June 10, 2014 (edited) Bonjour, Perso, j'ai modifié le bout de code et mis à la place: <div id="tos_option" style="font-size:17px"> <div class="tos_title">{l s='Terms of service'}</div> <div class="clear"></div> <div style="height:230px;margin:5px;padding:5px;border:1px solid #E0E0E0"> <iframe id="fancybox-frame" width="100%" height="100%" frameborder="0" hspace="0" scrolling="auto" src="{$link->getCMSLink('3', 'conditions-generales-de-vente?content_only=1')}"></iframe> </div></div> <div class="clear"></div> ce qui me permet d'afficher en permanent les CGV et uniquement le contenu de la CMS dans l'Iframe. Olivier Oui c'est une bonne solution également, mais ne pas oublier de mettre la bonne page de CMS : {$link->getCMSLink('3', 'MA-PAGE-CMS?content_only=1')} Par contre, je pense que cela ne marchera pas si le client utilise une autre langue...(pas testé) Donc une solution, au cas où, en utilisant mon code, est de modifier ceci : {$link_conditions} Par ceci : {$link_conditions}?content_only=1 Comme cela, on spécifie de n'afficher que le contenu de la page tout en conservant la bonne page, gestion de la langue comprise. Bonsoir, j'ai bien les cgv en pièce jointe lors de la confirmation de commande, mais comment ajouter aussi la feuille de rétactation Merci Il faut simplement rajouter ceci, par exemple et donc placer les fichiers retractation_fr.pdf dans le dossier /docs/ tout comme les CGV : if (substr($template,3) == "order_conf" && file_exists(_PS_ROOT_DIR_.'/docs/retractation_'.$iso.'.pdf')) { $message->attach(new Swift_Message_Attachment(new Swift_File(_PS_ROOT_DIR_.'/docs/retractation_'.$iso.'.pdf'), 'Retractation.pdf', 'application/pdf')); } Edited June 10, 2014 by yvanb (see edit history) Link to comment Share on other sites More sharing options...
yvanb Posted June 10, 2014 Author Share Posted June 10, 2014 (edited) Pensez également à modifier la traduction du bouton Continuer (terme d'origine : Proceed to checkout sur 1.6.0.6 et Next sur 1.4.9) qui se trouve dans order_carrier par la mention : Commande avec obligation de paiement Pour ce faire, rendez-vous dans la traduction du front office de votre thème. Pour rappel le texte de se bouton n'est pas encore réellement définie, ceci est le texte qui à été évoquer. Edited June 10, 2014 by yvanb (see edit history) Link to comment Share on other sites More sharing options...
jujutte24 Posted June 11, 2014 Share Posted June 11, 2014 Oui c'est une bonne solution également, mais ne pas oublier de mettre la bonne page de CMS : {$link->getCMSLink('3', 'MA-PAGE-CMS?content_only=1')} Par contre, je pense que cela ne marchera pas si le client utilise une autre langue...(pas testé) Donc une solution, au cas où, en utilisant mon code, est de modifier ceci : {$link_conditions} Par ceci : {$link_conditions}?content_only=1 Comme cela, on spécifie de n'afficher que le contenu de la page tout en conservant la bonne page, gestion de la langue comprise. Salut, bon, je viens d'essayer, mais ça ne fonctionne toujours pas. Avec la solution de tresordargan j'ai un panneau blanc, sans les CGV. Même en ayant modifié le chemin de la CMS. Avec votre solution, même modifiée, j'ai toujours le pied de page intégré aux cgv. J'utilise aussi Zopim, et le bloc de chat apparait aussi dans cet Iframe. Est-ce qu'il est possible d'intégrer l'url directe de la cms ? Je tourne en rond... Link to comment Share on other sites More sharing options...
tresorsdargan Posted June 11, 2014 Share Posted June 11, 2014 (edited) oui je confirme que cela fonctionne parfaitement, j'avais en fait modifié ce bout de code car pour une raison encore inconnue lorsque je coche les CGV en back office (préférence->commande), le bouton CGV à cocher en front office apparait bien mais ne fais pas apparaitre les modes de paiements disponibles, donc retour back office et désactivation des CGV puis rajouté le code dans order-carrier.tpl au dessus de ceux d'origine, ce qui donne: <div id="tos_option" style="font-size:17px"> <div class="tos_title">{l s='Terms of service'}</div> <div class="clear"></div> <div style="height:230px;margin:5px;padding:5px;border:1px solid #E0E0E0"> <iframe id="fancybox-frame" width="100%" height="100%" frameborder="0" hspace="0" scrolling="auto" src="{$link->getCMSLink('3', 'conditions-generales-de-vente?content_only=1')}"></iframe> </div></div> <div class="clear"></div> {if $conditions AND $cms_id} <div id="tos_option" style="font-size:17px"> <div class="tos_title">{l s='Terms of service'}</div> <div class="clear"></div> <div style="height:230px;margin:5px;padding:5px;border:1px solid #E0E0E0"> <iframe id="fancybox-frame" width="100%" height="100%" frameborder="0" hspace="0" scrolling="auto" src="{$link_conditions|escape:'html':'UTF-8'}"></iframe> </div> <div class="clear"></div> <div class="checkbox" style="margin-top:20px"> <input type="checkbox" name="cgv" id="cgv" value="1" {if $checkedTOS}checked="checked"{/if} /> <label for="cgv"><span style="font-size:14px">{l s='I agree to the terms of service and will adhere to them unconditionally.'}</span></label> </div> </div> {/if} Edited June 21, 2014 by tresorsdargan (see edit history) Link to comment Share on other sites More sharing options...
kidoshop Posted June 12, 2014 Share Posted June 12, 2014 bonjour petite questions un peu bete je suis debutant , pourriez vous me dire ou trouver order-carrier.tpl je suis en 1.4.6.2 merci Link to comment Share on other sites More sharing options...
jujutte24 Posted June 13, 2014 Share Posted June 13, 2014 Dans ton dossier /themes/tontheme/order-carrier.tpl Link to comment Share on other sites More sharing options...
pjerome Posted June 16, 2014 Share Posted June 16, 2014 Salut, Tout d'abord merci à tous pour nous aider à nous mettre en conformité avec cette ******* loi Hamon. Dans mon fichier order-carrier.tpl , a quelle endroit dois je coller le code modifier pour faire apparaitre les CGV ? Merci Link to comment Share on other sites More sharing options...
yvanb Posted June 18, 2014 Author Share Posted June 18, 2014 Bonjour, regardez bien le source code que j'ai/nous avons indiqué, il y a les N° de ligne en face du code. Cela vous permet de savoir où ce met le code. Link to comment Share on other sites More sharing options...
kokoon Posted June 23, 2014 Share Posted June 23, 2014 Bonjour et merci de partager vos connaissances Après avoir modifié le fichier order-carrier.tpl, si j’oublie de cliquer sur "J'accepte les CGV...." je n'ai aucun rappel du genre "vous devez accepter les CGV ..." , vous aussi ? Sinon tout le reste fonctionne, la frame avec les CGV apparait, le texte passe bien en fond vert etc ... Link to comment Share on other sites More sharing options...
houin Posted July 11, 2014 Share Posted July 11, 2014 Bonjour à tous. Je suis sur le point de passer de PS 1.4.9 à PS 1.6 tous en adaptant ma boutique à la loi Hamon. J'ai donc fait un petit bout de code permettant aux clients de lire les CGV directement sur la page des transporteurs, mais la différence c'est qu'a la place de la case à cocher, j'ai mis un bouton qui devient vert quand on clique dessus, et donc qui fait accepter les CGV. Je crois, d'après ce que j'ai lu sur cette loi, que les cases à cocher deviennent interdites sur le processus de commande et même comme options dans le panier. Ce code à été testé et fonctionne sur PS 1.4.9 et sur PS 1.6.0.6 Recherchez dans order-carrier.tpl : {if $conditions AND $cms_id} <p class="carrier_title">{l s='Terms of service'}</p> <p class="checkbox"> <input type="checkbox" name="cgv" id="cgv" value="1" {if $checkedTOS}checked="checked"{/if} /> <label for="cgv">{l s='I agree to the terms of service and will adhere to them unconditionally.'}</label> <a href="{$link_conditions|escape:'html':'UTF-8'}" class="iframe" rel="nofollow">{l s='(Read the Terms of Service)'}</a> </p> {/if} et remplacez par ceci : <!-- Code pour afficher les CGV avec un bouton à cliquer --> {if $conditions AND $cms_id} <p class="carrier_title">{l s='Terms of service'}</p> <div class="clear"></div> <div style="height:200px;margin:5px;padding:5px;border:1px solid #E0E0E0"> <iframe id="fancybox-frame" width="100%" height="100%" frameborder="0" hspace="0" scrolling="auto" src="{$link_conditions}?content_only=1""></iframe> </div> <div class="clear"></div> <p class="checkbox"> <input type="checkbox" name="cgv" id="cgv" value="1" {if $checkedTOS}checked="checked"{/if} style="display:none;" /> <button type="button" onclick="check(this, '#20D00C');" >{l s='I agree to the terms of service and will adhere to them unconditionally.'}</button> <script type="text/javascript"> $('a.iframe').fancybox(); function check(btn, color) { document.getElementById("cgv").checked = true; btn.style.backgroundColor = color; } </script> </p> {/if} <!-- Code pour afficher les CGV avec un bouton à cliquer --> Question résultat, voici ce que cela donne quand le client clique : cgv.jpg Je continuerais ce topic pour intégrer l'envoi des CGV en PDF dans l'email de confirmation... J'aime l'idée de PS en Open Source, c'est pour cela que je tente de proposer des solutions alternatives gratuites, surtout quand cela dépend des lois. [EDIT] Chose promise, chose dû, voici le code pour envoyer les CGV aux clients dans le mail de confirmation. (Ce n'est pas moi l'auteur de ce code, je l'ai trouver sur ce forum, mais je ne sais plus où....). Par contre, je l'ai testé avec succès sur PS 1.4.9 et sur PS 1.6.0.6. Ouvrez classes/Mail.php, et recherchez cette ligne : /* Send mail */ Ajoutez juste au dessus ce code-ci : if (substr($template,3) == "order_conf" && file_exists(_PS_ROOT_DIR_.'/docs/CGV_'.$iso.'.pdf')) { $CGVcms = new CMS((int)(Configuration::get('PS_CONDITIONS_CMS_ID')), (int)$id_lang); $message->attach(new Swift_Message_Attachment(new Swift_File(_PS_ROOT_DIR_.'/docs/CGV_'.$iso.'.pdf'), $CGVcms->meta_title.'.pdf', 'application/pdf')); } Il ne vous reste plus qu'à placer vos fichiers CGV_fr.pdf, CGV_en.pdf, un par langue, dans le dossier docs/ qui se situe à la racine de votre Prestashop. Si une âme charitable passe dans le coin et sait comment faire pour transformer la page CMS directement en pdf, je suis preneur. En attendant, ce code fonctionne et nous permet d'être "aux normes"... [/EDIT] Bonjour je suis un peux novice en programmation et je ne comprends pas comment créer le fichier cgv_pdf. Pouvez vous m'expliquer .Merci beaucoup Link to comment Share on other sites More sharing options...
yvanb Posted February 3, 2015 Author Share Posted February 3, 2015 Bonjour et désoler pour ma réponse super tardive. Je pense que mon topic est devenu obsolète à partir du moment, où, okom3pom à fait son module gratuit Loi Hamon, disponible ici compatible 1.5 et 1.6. Merci à lui Je reste quand même dispo si vous préférez, ou continuez, à utiliser ma méthode "barbare", que j'utilise toujours personnellement avec quelques améliorations, notamment en utilisant l'override pour éviter de tout refaire à chaque MAJ de PS. @houin, le fichier cgv_fr.pdf (et/ou cgv_en.pdf), doivent être créées à la main puis déposer dans le dossier /docs/ Link to comment Share on other sites More sharing options...
Cyrius91 Posted March 25, 2015 Share Posted March 25, 2015 Bonjour, merci pour ta contribution , il me semble que les cases à cocher sont toujours autorisée mais ce qui est interdit c'est les cases pré-cochées Tout d'abord merci à yvanb pour ce partage bien utile. J'ai apporté deux trois modif esthétique et mis en place le fait que le bouton ne soit pas toujours coché. Je post le code d'yvanb modifié. Dite moi ce que vous en pensez. Encore merci à toi <!-- Code pour afficher les CGV avec un bouton à cliquer --> {if $conditions AND $cms_id} <h3 class="condition_title">{l s='Terms of service'}</h3> <div class="clear"></div> <div style="height:200px;margin:5px;padding:5px;border:1px solid #E0E0E0"> <iframe id="fancybox-frame" width="100%" height="100%" frameborder="0" hspace="0" scrolling="auto" src="{$link_conditions}?content_only=1""></iframe> </div> <div class="clear"></div> <p class="checkbox"> <input type="checkbox" name="cgv" id="cgv" value="1" {if $checkedTOS}{/if} style="display:none;" /> </p> <p style="text-align: center;"> <button style="background-color:mistyrose"; type="button" onclick="check(this, '#98FB98');" ><label for="cgv">{l s='I agree to the terms of service and adhere to them unconditionally.'}</label></button> </p> <script type="text/javascript"> $('a.iframe').fancybox(); function check(btn, color) { document.getElementById("cgv").checked = true; btn.style.backgroundColor = color; } </script> {/if} <!-- Code pour afficher les CGV avec un bouton à cliquer --> Link to comment Share on other sites More sharing options...
Cyrius91 Posted May 2, 2015 Share Posted May 2, 2015 Je rencontre un probleme sur chrome (tout fonctionne sur Firefox et IE par exemple), lorsque l'on clique sur le bouton il change bien d'état mais lorsque l'on clique sur suivant le pop up apparait pour nous dire de valider avant de passer a l'étape suivante..... auriez vous une idée? Link to comment Share on other sites More sharing options...
Cyrius91 Posted May 15, 2015 Share Posted May 15, 2015 Le problème était présent aussi sur Opéra. Le problème est maintenant résolu. Encore merci au créateur de ce post. 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