Jump to content

[Dev] Loi Hamon - Code pour être conforme


Recommended Posts

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 :

post-21246-0-62217100-1402155642_thumb.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]

Edited by yvanb (see edit history)
  • Like 1
Link to comment
Share on other sites

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 :

attachicon.gifcgv.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". :rolleyes:

Link to comment
Share on other sites

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 by yvanb (see edit history)
Link to comment
Share on other sites

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

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

 

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

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

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.

  • Like 1
Link to comment
Share on other sites

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 by yvanb (see edit history)
Link to comment
Share on other sites

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

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

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

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 by yvanb (see edit history)
Link to comment
Share on other sites

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 by yvanb (see edit history)
Link to comment
Share on other sites

 

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

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 by tresorsdargan (see edit history)
Link to comment
Share on other sites

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

Bonjour et merci de partager vos connaissances B)

 

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 ... :rolleyes:

Link to comment
Share on other sites

  • 3 weeks later...

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 :

attachicon.gifcgv.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

  • 6 months later...

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

  • 1 month later...

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 :D

 

    <!-- 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

  • 1 month later...

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

  • 2 weeks later...

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...