PEEL Shopping
Open source ecommerce : PEEL Shopping
emails.php
Go to the documentation of this file.
1 <?php
2 // This file should be in UTF8 without BOM - Accents examples: éèê
3 // +----------------------------------------------------------------------+
4 // | Copyright (c) 2004-2015 Advisto SAS, service PEEL - contact@peel.fr |
5 // +----------------------------------------------------------------------+
6 // | This file is part of PEEL Shopping 8.0.0, which is subject to an |
7 // | opensource GPL license: you are allowed to customize the code |
8 // | for your own needs, but must keep your changes under GPL |
9 // | More information: https://www.peel.fr/lire/licence-gpl-70.html |
10 // +----------------------------------------------------------------------+
11 // | Author: Advisto SAS, RCS 479 205 452, France, https://www.peel.fr/ |
12 // +----------------------------------------------------------------------+
13 // $Id: emails.php 46935 2015-09-18 08:49:48Z gboussin $
14 if (!defined('IN_PEEL')) {
15  die();
16 }
17 
38 function send_email($to, $mail_subject = '', $mail_content = '', $template_technical_code = null, $template_tags = null, $format = null, $sender = null, $html_add_structure = true, $html_correct_conformity = false, $html_convert_url_to_links = true, $reply_to = null, $attached_files_infos_array = null, $lang = null, $additional_infos_array = array(), $attachment_not_sent_by_email = false)
39 {
40  // Suivant les hébergements, on peut remplacer \r\n par \n
41  $eol = "\r\n";
42  // $eol = PHP_EOL;
43  // $eol = "\n";
44  if(empty($lang) || !in_array($lang, $GLOBALS['admin_lang_codes'])){
45  $lang = $_SESSION['session_langue'];
46  }
47  if (empty($format)) {
48  $format = vb($GLOBALS['site_parameters']['email_sending_format_default'], 'html');
49  }
50  if (defined('IN_PEEL_ADMIN') && a_priv('demo')) {
51  echo $GLOBALS['tplEngine']->createTemplate('global_error.tpl', array('message' => $GLOBALS['STR_ADMIN_DEMO_EMAILS_DEACTIVATED']))->fetch();
52  return false;
53  }
54  if(is_array($sender)) {
55  $from = $sender['email'];
56  } else {
57  $from = $sender;
58  }
59  if (empty($from) && !empty($GLOBALS['support'])) {
60  $from = $GLOBALS['support'];
61  }
62  $used_template_technical_code = null;
63  if (!empty($template_technical_code)) {
64  if(!is_array($template_technical_code)) {
65  $template_technical_code = array($template_technical_code);
66  }
67  foreach($template_technical_code as $this_template_technical_code) {
68  $template_infos = getTextAndTitleFromEmailTemplateLang($this_template_technical_code, $lang);
69  if (!empty($template_infos)) {
70  // Si l'on envoie un email avec un sujet, un message et un template d'email, le template n'est pas prioritaire.
71  // Ce fonctionnement est utile au module webmail lors de l'envoi d'email depuis le site.
72  if (empty($mail_subject)) {
73  $mail_subject = $template_infos['subject'];
74  }
75  if (empty($mail_content)) {
76  $mail_content = $template_infos['text'];
77  }
78  if (!empty($mail_content)) {
79  if (!empty($template_infos["default_signature_code"])) {
80  // Récupération du technical code de la signature associé au template
81  $signature = $template_infos["default_signature_code"];
82  } else {
83  $signature = 'signature';
84  }
85  $signature_infos = getTextAndTitleFromEmailTemplateLang($signature, $lang);
86  if (!empty($signature_infos)) {
87  $mail_content .= $signature_infos['text'];
88  }
89  }
90  $used_template_technical_code = $this_template_technical_code;
91  break;
92  }
93  }
94  }
95  if (empty($mail_subject) && empty($mail_content)) {
96  return false;
97  }
98  $mail_header = "Content-Transfer-Encoding: 8bit" . $eol;
99  $mail_header .= "MIME-Version: 1.0" . $eol;
100  if (!empty($from)) {
101  // Au cas où $from ait plusieurs adresses emails (variable support par exemple)
102  if ($from == $GLOBALS['support'] && !empty($GLOBALS['site_parameters']['nom_expediteur'])) {
103  $email_name_rules = array("\r" => '', "\n" => '', "\t" => '', '"' => "'", ',' => '', '<' => '[', '>' => ']');
104  $nom_expediteur = strtr($GLOBALS['site_parameters']['nom_expediteur'], $email_name_rules);
105  } else {
106  $nom_expediteur = '';
107  }
108  $temp = explode(',', str_replace(';', ',', $from));
109  $from = trim($temp[0]);
110  // création du header de l'email
111  if (!empty($nom_expediteur)) {
112  $mail_header .= 'From: "' . $nom_expediteur . '" <' . $from . '>' . $eol;
113  } else {
114  $mail_header .= 'From: ' . $from . $eol;
115  }
116  if (!empty($reply_to)) {
117  // Au cas où $reply_to ait plusieurs adresses emails (variable support par exemple)
118  $reply_to_array = explode(',', str_replace(';', ',', $reply_to));
119  $reply_to = trim($reply_to_array[0]);
120  $mail_header .= "Reply-To: " . $reply_to . "" . $eol;
121  } else {
122  $mail_header .= "Reply-To: " . $from . "" . $eol;
123  }
124  $mail_header .= "Return-Path:" . $from . "" . $eol;
125  }
126  if ($format != "text") {
127  // On traite le modèle d'email avant de remplacer les tags car le modèle est peut-être en texte brut contrairement aux tags
128  if (strip_tags($mail_content) != $mail_content) {
129  // On passe le contenu de l'email en HTML si ce n'est pas déjà le cas
130  // Par exemple si on a mis des balises <b> ou <u> dans email sans mettre de <br /> nulle part, on rajoute <br /> en fin de ligne
131  $mail_content = String::nl2br_if_needed($mail_content);
132  } else {
133  // Email de texte qu'on va envoyer en HTML, et pour avoir une source d'email lisible on garde le \n à la fin
134  // NB : il faut faire le replace en 2 fois pour éviter que le \n après le <br /> soit à nouveau remplacé !
135  $mail_content = str_replace(array("\n"), "<br />\n", str_replace(array("\r\n", "\r"), array("\n", "\n"), $mail_content));
136  }
137  }
138  // Traitement des tags dans les templates. Même si $template_tags est vide il faut le faire pour gérer les tags génériques
139  // NB : Si on veut du HTML avec $format='html', le contenu de ces tags est converti par template_tags_replace en HTML
140  $mail_content = template_tags_replace($mail_content, $template_tags, false, $format, $lang);
141  $mail_subject = template_tags_replace(String::strip_tags($mail_subject), $template_tags, false, 'text', $lang);
142  if ($format == "text") {
143  // On force le format en texte sans HTML
144  $mail_content = trim(String::html_entity_decode(String::strip_tags($mail_content)));
145  if (empty($attached_files_infos_array)) {
146  // Pas de fichier attaché : on n'a pas besoin de déclarer des sections MIME
147  $mail_header .= "Content-Type: text/plain; charset=" . GENERAL_ENCODING . "" . $eol;
148  }
149  $mail_body = $mail_content;
150  } else {
151  // Dans tous les cas, si les & ne sont pas encodés, on les encode.
152  // Sinon, problème avec certaines messageries qui croient que dans une URL, &currency est une entité pour laquelle il manque le point virgule
153  // Si les & sont déjà encodés en &amp; la fonction suivante va les garder
154  $mail_content = String::htmlentities($mail_content, null, GENERAL_ENCODING, false, true, false);
155  if ($html_correct_conformity) {
156  // On corrige le HTML si demandé
157  $mail_content = String::getCleanHTML($mail_content, null, true, true, true, null, false);
158  }
159  if (empty($attached_files_infos_array)) {
160  // Pas de fichier attaché : on n'a pas besoin de déclarer des sections MIME
161  $mail_header .= "Content-Type: text/html; charset=" . GENERAL_ENCODING . "" . $eol;
162  }
163  // On transforme les liens [link=] ... [/link] en balises HTML <a>
164  $mail_content = linkFormat($mail_content);
165  if ($html_convert_url_to_links) {
166  // On rend cliquables les URL qui étaient bruts
167  $mail_content = url2Link($mail_content);
168  }
169  if (String::strpos(String::strtolower($mail_content), '<body') === false && String::strpos($mail_content, '<!DOCTYPE') === false) {
170  $mail_body = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
171 <html>
172 <head>
173  <meta http-equiv="Content-Type" content="text/html; charset=' . GENERAL_ENCODING . '">
174  <title>' . $mail_subject . '</title>
175 </head>
176 <body>
177 ' . $mail_content . '
178 </body>
179 </html>';
180  } else {
181  $mail_body = $mail_content;
182  }
183  }
184  // Ajout de fichiers attachés
185  if (!empty($attached_files_infos_array) && !$attachment_not_sent_by_email) {
186  $main_document_attached = $attached_files_infos_array['path_file_attachment'][0] . $attached_files_infos_array['name'][0];
187  $mime_boundary_main = md5(uniqid() . 'iéhf|ao5225izah%0g'.mt_rand(1,1000000));
188  $mime_boundary_html_or_plain = md5(mt_rand(1,1000000).'iéhf|ao5225izah%0g' . uniqid());
189  // multipart/alternative
190  $mail_header .= "Content-Type: multipart/mixed; boundary=\"" . $mime_boundary_main . "\"" . "" . $eol;
191 
192  $msg = "--" . $mime_boundary_main . "" . $eol;
193  $msg .= "Content-Type: multipart/alternative; boundary=\"" . $mime_boundary_html_or_plain . "\"" . $eol . $eol;
194 
195  $msg .= "--" . $mime_boundary_html_or_plain . "" . $eol;
196  $msg .= "Content-Type: text/plain; charset=" . GENERAL_ENCODING . "" . $eol;
197  $msg .= "Content-Transfer-Encoding: 8bit" . "" . $eol . $eol;
198  $msg .= trim(String::strip_tags($mail_body)) . $eol;
199  if ($format == "html") {
200  // SI on envoie en HTML, on met en texte brut d'abord, et en HTML ensuite
201  $msg .= "--" . $mime_boundary_html_or_plain . "" . $eol;
202  $msg .= "Content-Type: text/html; charset=" . GENERAL_ENCODING . "" . $eol;
203  $msg .= "Content-Transfer-Encoding: 8bit" . $eol . $eol;
204  $msg .= $mail_body . $eol;
205  }
206  $msg .= "--".$mime_boundary_html_or_plain."--" . "" . $eol . $eol;
207  for($j = 0;$j < count($attached_files_infos_array['name']); $j++) {
208  if(!empty($attached_files_infos_array['content'][$j])) {
209  $fichier = $attached_files_infos_array['content'][$j];
210  } else {
211  $fichier = file_get_contents($attached_files_infos_array['path_file_attachment'][$j] . $attached_files_infos_array['name'][$j]);
212  }
213  $msg .= "--" . $mime_boundary_main . "" . $eol;
214  $msg .= "Content-Type: " . $attached_files_infos_array['type-mime'][$j] . "; name=\"" . $attached_files_infos_array['name'][$j] . "\"" . "" . $eol;
215  $msg .= "Content-Transfer-Encoding: base64" . "" . $eol;
216  $msg .= "Content-Disposition: attachment; filename=\"" . $attached_files_infos_array['name'][$j] . "\"" . "" . $eol . $eol;
217  $msg .= chunk_split(base64_encode($fichier)) . "" . $eol . $eol;
218  }
219  $msg .= "--" . $mime_boundary_main . "--" . "" . $eol . $eol;
220  $mail_body = $msg;
221  }
222  $recipient_array = explode(',', str_replace(';', ',', $to));
223  $result = false;
224  $i = 0;
225  foreach($recipient_array as $this_email) {
226  $this_email = trim($this_email);
227  if(empty($used_template_technical_code) || !in_array($used_template_technical_code, vb($GLOBALS['site_parameters']['send_email_technical_codes_no_email'], array()))) {
228  if (empty($this_email) || $i > 10) {
229  // Limitation à 10 destinataires en même temps par sécurité
230  continue;
231  }
232  if (((strpos($GLOBALS['wwwroot'], '://localhost')===false && strpos($GLOBALS['wwwroot'], '://127.0.0.1')===false) || !empty($GLOBALS['site_parameters']['localhost_send_email_active'])) && !empty($GLOBALS['site_parameters']['send_email_active'])) {
233  if(EmailOK($this_email)){
234  if (String::strtolower(GENERAL_ENCODING) != 'iso-8859-1') {
235  $result = mail($this_email, '=?' . String::strtoupper(GENERAL_ENCODING) . '?B?' . base64_encode($mail_subject) . '?=', $mail_body, $mail_header);
236  } else {
237  $result = mail($this_email, $mail_subject, $mail_body, $mail_header);
238  }
239  if(!empty($GLOBALS['site_parameters']['trigger_user_notice_email_sent']) && empty($GLOBALS['display_errors'])) {
240  trigger_error('Email sent to ' . $this_email . ' : ' . $mail_subject, E_USER_NOTICE);
241  }
242  }else{
243  trigger_error('Email invalide : ' . $this_email, E_USER_NOTICE);
244  }
245  } else {
246  if(!IN_INSTALLATION) {
247  // On n'affiche le message de désactivation des envois qu'à l'extérieur de l'installation
248  echo $GLOBALS['tplEngine']->createTemplate('global_success.tpl', array('message' => sprintf($GLOBALS['STR_EMAIL_SENDING_DEACTIVATED'], $mail_subject)))->fetch();
249  }
250  }
251  }
252  if(is_array($sender)) {
253  $params = $sender;
254  } else {
255  $params = array();
256  }
257  $params = array_merge($params, array('recipient_array' => array($this_email), 'from' => $from, 'mail_subject' => $mail_subject, 'mail_content' => $mail_content, 'technical_code' => $used_template_technical_code, 'document' => vb($main_document_attached)), $additional_infos_array);
258  if(empty($params['id_expediteur']) && !empty($from)) {
259  if(!empty($params['id_utilisateur'])) {
260  $params['id_expediteur'] = $params['id_utilisateur'];
261  } else {
262  $query = query('SELECT id_utilisateur
263  FROM peel_utilisateurs
264  WHERE email="' . real_escape_string($from) . '"');
265  if($result = fetch_assoc($query)) {
266  $params['id_expediteur'] = $result['id_utilisateur'];
267  }
268  }
269  }
270  call_module_hook('send_email', $params);
271  $i++;
272  }
273  return $result;
274 }
275 
282 function EmailOK($email)
283 {
284  // return(preg('^[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+' . '@' . '[-!#$%&\'*+\\/0-9=?A-Z^_`a-z{|}~]+\.' . '[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+$', $email));
285  return(preg_match('/^[[:alnum:]]*((\.|_|-)[[:alnum:]]+)*@[[:alnum:]]*((\.|-)[[:alnum:]]+)*(\.[[:alpha:]]{2,})/i', $email));
286 }
287 
295 function prepare_email_tags($user_id, $order_id)
296 {
297  if (!empty($user_id)) {
298  $sql_additional_fields = '';
299  $q = 'SELECT *' . $sql_additional_fields . '
300  FROM peel_users
301  WHERE id_utilisateur="' . intval($user_id) . '"';
302  $result = query($q);
303  if ($row_account = fetch_assoc($result)) {
304  foreach($row_account as $key => $value) {
305  if ($key != 'mot_passe') {
306  $template_tags[String::strtoupper($key)] = $value;
307  }
308  }
309  }
310  }
311  if (!empty($order_id)) {
312  $q = 'SELECT o.code_facture
313  FROM peel_commandes o
314  WHERE o.id="' . intval($order_id) . '" AND ' . get_filter_site_cond('commandes', 'o') . '';
315  $result_orders = query($q);
316  $row_orders = fetch_assoc($result_orders);
317  $template_tags['ORDER'] = '';
318  $template_tags['ORDER_LINK'] = '[link="' . $GLOBALS['wwwroot'] . '/factures/commande_pdf.php?code_facture=' . urlencode($row_orders['code_facture']) . '&amp;mode=facture"]Facture n°' . urlencode($_POST['form_order']) . '[/link]';
319  }
320  return $template_tags;
321 }
322 
331 function getTextAndTitleFromEmailTemplateLang($template_technical_code, $template_lang, $template_technical_id = null)
332 {
333  // Dans le cas de la newsletter, le titre ne doit pas être celui du template, mais le titre renseigné dans la liste des newsletters.
334  $sql = 'SELECT *
335  FROM peel_email_template
336  WHERE active="TRUE" AND ' . get_filter_site_cond('email_template', null);
337  if(!empty($template_technical_id)) {
338  $sql .= ' AND id="' . intval($template_technical_id) . '"';
339  } else {
340  $sql .= ' AND technical_code="' . nohtml_real_escape_string($template_technical_code) . '" AND (lang="' . word_real_escape_string($template_lang) . '" OR lang="")';
341  }
342  $sql .= 'LIMIT 1';
343  $query_template = query($sql);
344  if ($this_template = fetch_assoc($query_template)) {
345  if(!empty($this_template['lang'])) {
346  $this_lang = $this_template['lang'];
347  } elseif(!empty($template_lang)) {
348  $this_lang = $template_lang;
349  } else {
350  $this_lang = $_SESSION['session_langue'];
351  }
352  if ($this_template['technical_code'] != 'layout') {
353  $generic_layout_infos = getTextAndTitleFromEmailTemplateLang('layout', $this_lang, null);
354  if(!empty($generic_layout_infos['text'])) {
355  // Lors de la fusion des templates, on passe en HTML les sauts de ligne si nécessaire pour chaque template
356  $this_template['text'] = str_replace('[TEMPLATE]', String::nl2br_if_needed($this_template['text']), String::nl2br_if_needed($generic_layout_infos['text']));
357  }
358  }
359  if (String::strpos($this_template['text'], '[NEWSLETTER]') !== false) {
360  // Le template contient une newsletter, on donne au template le sujet de la newsletter
361  $news_infos = get_last_newsletter(null, $this_lang);
362  if(!empty($news_infos['sujet_' . $this_lang])) {
363  $this_template['subject'] = $news_infos['sujet_' . $this_lang];
364  }
365  // NB : Le contenu du tag [NEWSLETTER] sera remplacé comme tous les autres tags plus tard lors de l'appel à la fonction template_tags_replace
366  }
367  return $this_template;
368  } else {
369  return null;
370  }
371 }
372 
380 function get_last_newsletter($id = null, $lang = null) {
381  if(!empty($id)) {
382  $sql_cond_array[] = "id='".intval($id)."'";
383  }
384  if(!empty($lang) && empty($id)) {
385  // On cherche une newsletter non vide pour la langue cherchée
386  $sql_cond_array[] = "(sujet_".$lang."!='' OR message_".$lang."!='')";
387  }
388  if(empty($sql_cond_array)) {
389  $sql_cond_array[] = 1;
390  }
391  $sql = "SELECT id, date, format, template_technical_code, statut, sujet_".$lang.", message_".$lang."
392  FROM peel_newsletter
393  WHERE " . implode(' AND ', $sql_cond_array) . " AND " . get_filter_site_cond('newsletter') . "
394  ORDER BY id DESC
395  LIMIT 1";
396  $res = query($sql);
397  return fetch_assoc($res);
398 }
static strtoupper($string)
Returns string with all alphabetic characters converted to uppercase.
Definition: String.php:154
url2Link($string)
url2Link()
Definition: format.php:135
static strip_tags($string, $allowed_tags=null)
String::strip_tags()
Definition: String.php:548
$lang
Definition: spellchecker.php:9
static htmlentities($string, $flags=ENT_COMPAT, $charset=GENERAL_ENCODING, $suppr_endline=false, $encode_only_isolated_amperstands=false, $decode_html_entities_first=false)
Convert all applicable characters to HTML entities Cette fonction sert si on veut afficher du contenu...
Definition: String.php:411
$result
static strpos($haystack, $needle, $offset=0)
Returns the numeric position of the first occurrence of needle in the haystack string.
Definition: String.php:54
static getCleanHTML($text, $max_width=null, $allow_form=false, $allow_object=false, $allow_class=false, $additional_config=null, $safe=true, $additional_elements=null, $max_caracters_length=50000, $max_octets_length=59000, $max_word_and_url_length=100)
Fonction qui nettoie le HTML.
Definition: String.php:651
word_real_escape_string($value)
Applique real_escape_string dans le cas où on n'insère qu'un seul mot, de moins de 30 caractères...
Definition: database.php:424
get_last_newsletter($id=null, $lang=null)
Récupère les informations de la newsletter de l'id demandée, ou de la dernière newsletter dans une la...
Definition: emails.php:380
static strtolower($string)
Returns string with all alphabetic characters converted to lowercase.
Definition: String.php:135
nohtml_real_escape_string($value, $allowed_tags=null)
Protège les données pour insertion dans MySQL ET supprime les tags HTML pour protéger de toute sorte ...
Definition: database.php:400
real_escape_string($value)
real_escape_string()
Definition: database.php:374
const IN_INSTALLATION
Definition: bdd.php:14
get_filter_site_cond($table_technical_code, $table_alias=null, $use_strict_rights_if_in_admin=false, $specific_site_id=null, $exclude_public_items=false, $admin_force_multisite_if_allowed=false)
Retourne la condition SQL permettant de filtrer les données pour une table.
Definition: fonctions.php:4643
query($query, $die_if_error=false, $database_object=null, $silent_if_error=false, $security_sql_filter=true)
The query() function is meant to be called anywhere you want to make a query.
Definition: database.php:158
vb(&$var, $default=null)
Variable blanche if $var n'est pas défini, retourne $default, sinon retourne $var.
Definition: format.php:97
if(strlen($date2)== '10') if($type== 'users-by-age'&&a_priv('admin_users', true)) elseif($type== 'forums-count'&&a_priv('admin_content', true)) elseif($type== 'forums-categories'&&a_priv('admin_content', true)) elseif($type== 'users-count'&&a_priv('admin_users', true)) elseif($type== 'product-categories'&&a_priv('admin_products', true)) elseif($type== 'users-by-sex'&&a_priv('admin_users', true)) elseif($type== 'users-by-country'&&a_priv('admin_users', true)) elseif($type== 'sales'&&a_priv('admin_sales', true))
Definition: chart-data.php:160
EmailOK($email)
Vérification du format d'adresse email trouvée sur http://www.phpinfo.net/?p=trucs&rub=astuces.
Definition: emails.php:282
if(!defined('IN_PEEL')) send_email($to, $mail_subject= '', $mail_content= '', $template_technical_code=null, $template_tags=null, $format=null, $sender=null, $html_add_structure=true, $html_correct_conformity=false, $html_convert_url_to_links=true, $reply_to=null, $attached_files_infos_array=null, $lang=null, $additional_infos_array=array(), $attachment_not_sent_by_email=false)
Envoi d'un email à un utilisateur.
Definition: emails.php:38
fetch_assoc($query_result)
fetch_assoc()
Definition: database.php:283
call_module_hook($hook, $params, $mode= 'boolean')
Appelle la fonction correspondant au $hook pour chaque module installé La fonction doit s'appeler : [...
$GLOBALS['page_columns_count']
getTextAndTitleFromEmailTemplateLang($template_technical_code, $template_lang, $template_technical_id=null)
getTextAndTitleFromEmailTemplateLang()
Definition: emails.php:331
linkFormat($text)
linkFormat()
Definition: format.php:150
a_priv($requested_priv, $demo_allowed=false, $site_configuration_modification=false, $user_id=null)
Renvoie true si l'utilisateur de la session a le privilège $requested_priv ou un droit supérieur Des ...
Definition: user.php:63
static html_entity_decode($string, $quote_style=ENT_COMPAT, $charset=GENERAL_ENCODING)
String::html_entity_decode()
Definition: String.php:517
$id
Definition: articles.php:22
prepare_email_tags($user_id, $order_id)
Création d'un tableau contenant la correspondance entre nom des tags et valeur à utiliser.
Definition: emails.php:295
template_tags_replace($text, $custom_template_tags=array(), $replace_only_custom_tags=false, $format=null, $lang=null, $avoid_load_urls=false)
Remplace les tags d'un texte au format [TAG] par les valeurs correspondantes.
Definition: format.php:599
static nl2br_if_needed($string)
Fonction de compatibilité avec de vieilles versions de PEEL ou du contenu qui vient d'ailleurs...
Definition: String.php:559
if(defined('IN_PEEL_ADMIN')||IN_INSTALLATION) $_SESSION['session_langue']

This documentation for Open ecommerce PEEL Shopping and PEEL.fr has been generated by Doxygen on Thu Oct 15 2015 14:30:26 - Peel ecommerce is a product of Agence web Advisto SAS. All rights reserved.