PEEL Shopping
Open source ecommerce : PEEL Shopping
fonctions.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: fonctions.php 47305 2015-10-12 10:14:59Z gboussin $
14 if (!defined('IN_PEEL')) {
15  die();
16 }
17 
24  if (vn($GLOBALS['site_parameters']['display_prices_with_taxes']) == '0' || (check_if_module_active('reseller') && a_priv('reve') && !empty($GLOBALS['site_parameters']['force_display_reseller_prices_without_taxes']))) {
25  return false;
26  } else {
27  return true;
28  }
29 }
30 
36 function unique_id()
37 {
38  mt_srand(microtime_float() * 1000000);
39  return substr(sha256($GLOBALS['site_parameters']['sha256_encoding_salt'] . mt_rand(0, 9999999)), 0, 32);
40 }
41 
49 function MDP($chrs = 8)
50 {
51  $pwd = "";
52  mt_srand(microtime_float() * 1000000);
53  while (String::strlen($pwd) < $chrs) {
54  $chr = chr(mt_rand(0, 255));
55  // on évite les 1, i, I, o, O et 0
56  if (preg_match("/^[a-hj-km-np-zA-HJ-KM-NP-Z2-9]$/i", $chr)) {
57  $pwd = $pwd . $chr;
58  }
59  }
60  return $pwd;
61 }
62 
70 function generate_token($name = 'general', $use_existing_token = true)
71 {
72  if ($use_existing_token && !empty($_SESSION['token_' . $name])) {
73  $_SESSION['token_time_' . $name] = time();
74  } else {
75  srand(microtime_float() * 1000000);
76  $_SESSION['token_' . $name] = md5(uniqid(mt_rand()));
77  $_SESSION['token_time_' . $name] = time();
78  }
79  $_SESSION['token_referer_' . $name] = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
80  if (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') {
81  $_SESSION['token_referer_' . $name] = str_replace('http://', 'https://', $_SESSION['token_referer_' . $name]);
82  }
83  return $_SESSION['token_' . $name];
84 }
85 
94 function get_form_token_input($name = 'general', $use_existing_token = true, $return_as_input_form = true)
95 {
96  $token = generate_token($name, $use_existing_token);
97  if ($return_as_input_form) {
98  return '<input type="hidden" name="token" value="' . String::str_form_value($token) . '" />';
99  } else {
100  return $token;
101  }
102 }
103 
118 function verify_token($name = 'general', $delay_in_minutes = 60, $check_referer_if_set_by_server = true, $cancel_token = true, $minimum_wait_in_seconds_before_use = 0)
119 {
120  if (!empty($_POST['token'])) {
121  $user_token = $_POST['token'];
122  } elseif (!empty($_GET['token'])) {
123  $user_token = $_GET['token'];
124  }
125 
126  $result = false;
127  if (isset($_SESSION['token_' . $name]) && isset($_SESSION['token_time_' . $name]) && !empty($user_token)) {
128  if ($_SESSION['token_' . $name] == $user_token && $_SESSION['token_time_' . $name] + $delay_in_minutes * 60 >= time() && $_SESSION['token_time_' . $name] + $minimum_wait_in_seconds_before_use <= time()) {
129  if (!$check_referer_if_set_by_server || !isset($_SERVER['HTTP_REFERER']) || $_SERVER['HTTP_REFERER'] == $_SESSION['token_referer_' . $name]) {
130  $result = true;
131  }
132  }
133  }
134  if ($cancel_token) {
135  unset($_SESSION['token_' . $name], $_SESSION['token_time_' . $name], $_SESSION['token_referer_' . $name]);
136  }
137  return $result;
138 }
139 
148 function get_sons_cat($all_parents_with_ordered_direct_sons_array, $catid, $ids_array = array())
149 {
150  // On met une protection au cas où une catégorie parente ait un enfant direct ou indirect qui est son propre parent
151  static $studied_cats_array;
152  $hash = md5(serialize($all_parents_with_ordered_direct_sons_array));
153  if(!count($ids_array)) {
154  // Si on relance la fonction avec la même liste $all_parents_with_ordered_direct_sons_array
155  unset($studied_cats_array[$hash]);
156  }
157  if(empty($studied_cats_array[$hash][$catid])) {
158  $studied_cats_array[$hash][$catid] = true;
159  foreach ($all_parents_with_ordered_direct_sons_array[$catid] as $son_catid) {
160  $ids_array[] = $son_catid;
161  if (!empty($all_parents_with_ordered_direct_sons_array[$son_catid])) {
162  $ids_array = get_sons_cat($all_parents_with_ordered_direct_sons_array, $son_catid, $ids_array);
163  }
164  }
165  }
166  return $ids_array;
167 }
168 
176 function calcul_nbprod_parcat($catid, $all_parents_with_ordered_direct_sons_array)
177 {
178  $cache_id = 'calcul_nbprod_parcat_' . $catid . '_' . $GLOBALS['site_parameters']['category_count_method'] . '_' . $GLOBALS['site_id'];
179  if (!empty($all_parents_with_ordered_direct_sons_array) && !empty($all_parents_with_ordered_direct_sons_array[$catid])) {
180  $cache_id .= '_' . md5(serialize($all_parents_with_ordered_direct_sons_array[$catid]));
181  }
182  $this_cache_object = new Cache($cache_id, array('group' => 'data'));
183  if ($this_cache_object->testTime(900, true)) {
184  $results_count = $this_cache_object->get();
185  } else {
186  if ($GLOBALS['site_parameters']['category_count_method'] == 'global' && !empty($all_parents_with_ordered_direct_sons_array) && !empty($all_parents_with_ordered_direct_sons_array[$catid])) {
187  // En mode global, on compte le nombre d'annonce des catégories et sous-catégories
188  $ids_array = get_sons_cat($all_parents_with_ordered_direct_sons_array, $catid);
189  }
190  if(empty($ids_array)) {
191  // Dans ce cas, on compte uniquement le nombre d'annonces de categories
192  $ids_array = array($catid);
193  }
194  $sql = "SELECT COUNT(*) AS this_count
195  FROM peel_produits p
196  INNER JOIN peel_produits_categories pc ON pc.produit_id = p.id
197  WHERE pc.categorie_id IN (" . nohtml_real_escape_string(implode(',', $ids_array)) . ") AND p.etat='1' AND " . get_filter_site_cond('produits', 'p') . "";
198  $query = query($sql);
199  if ($this_count = fetch_assoc($query)) {
200  $results_count = $this_count['this_count'];
201  } else {
202  $results_count = null;
203  }
204  $this_cache_object->save($results_count);
205  }
206  unset($this_cache_object);
207  return $results_count;
208 }
209 
216 function calcul_nbarti_parrub($rub)
217 {
218  $resCount = query("SELECT COUNT(*) AS this_count
219  FROM peel_articles p
220  INNER JOIN peel_articles_rubriques pa ON pa.article_id = p.id
221  WHERE pa.rubrique_id = '" . intval($rub) . "' AND p.etat='1' AND " . get_filter_site_cond('articles', 'p') . "");
222  $count = fetch_assoc($resCount);
223  return $count['this_count'];
224 }
225 
242 function fprix($price, $display_currency = false, $currency_code_or_default = null, $convertion_needed_into_currency = true, $currency_rate = null, $display_iso_currency_code = false, $format = true, $force_format_separator = null, $add_rdfa_properties = false, $round_even_if_no_format = false)
243 {
244  static $currency_infos_by_code;
245  if(!empty($GLOBALS['site_parameters']['price_hide_if_not_loggued']) && !defined('IN_IPN') && (!est_identifie() || (!a_priv('util') && !a_priv('admin*') && !a_priv('reve')))) {
246  return '-';
247  }
248 
249  if (!empty($currency_code_or_default)) {
250  if (!isset($currency_infos_by_code[$currency_code_or_default])) {
251  // Si on a demandé le prix dans le code ISO d'une devise, alors on va chercher le taux de conversion associé
252  $req = "SELECT code, conversion, symbole, symbole_place
253  FROM peel_devises
254  WHERE code = '" . nohtml_real_escape_string($currency_code_or_default) . "' AND " . get_filter_site_cond('devises') . "";
255  $res = query($req);
256  $currency_infos_by_code[$currency_code_or_default] = fetch_assoc($res);
257  }
258  if (!empty($currency_infos_by_code[$currency_code_or_default])) {
259  $currency_code = $currency_infos_by_code[$currency_code_or_default]['code'];
260  $currency_symbole = String::html_entity_decode(str_replace('&euro;', '€', $currency_infos_by_code[$currency_code_or_default]['symbole']));
261  $currency_rate_item = $currency_infos_by_code[$currency_code_or_default]['conversion'];
262  $symbole_place = $currency_infos_by_code[$currency_code_or_default]['symbole_place'];
263  }
264  }
265  if (empty($currency_symbole)) {
266  // Par défaut ou si on ne recupère aucun symbole de devise alors on utilise le symbole et le taux de conversion de session
267  $currency_code = $_SESSION['session_devise']['code'];
268  $currency_symbole = $_SESSION['session_devise']['symbole'];
269  $currency_rate_item = $_SESSION['session_devise']['conversion'];
270  $symbole_place = $_SESSION['session_devise']['symbole_place'];
271  }
272  if (!empty($currency_rate)) {
273  // Si on veut forcer le taux de change, alors on l'applique à la place de celui qu'on a récupéré en BDD ou en session
274  $currency_rate_item = $currency_rate;
275  }
276  if (!empty($convertion_needed_into_currency)) {
277  // Par défaut, on effectue une conversion du montant
278  $price_displayed = $price * $currency_rate_item;
279  } else {
280  // Sinon on affiche le prix sans aucune conversion
281  $price_displayed = $price;
282  }
283  if(!empty($GLOBALS['site_parameters']['prices_precision']) && is_array($GLOBALS['site_parameters']['prices_precision']) && isset($GLOBALS['site_parameters']['prices_precision'][$currency_code])) {
284  $prices_precision = $GLOBALS['site_parameters']['prices_precision'][$currency_code];
285  } else {
286  $prices_precision = vb($GLOBALS['site_parameters']['prices_precision'], 2);
287  }
288  if($force_format_separator) {
289  $prices_decimal_separator = $force_format_separator;
290  } else {
291  if(!empty($GLOBALS['site_parameters']['prices_decimal_separator']) && is_array($GLOBALS['site_parameters']['prices_decimal_separator']) && isset($GLOBALS['site_parameters']['prices_decimal_separator'][$currency_code])) {
292  $prices_decimal_separator = $GLOBALS['site_parameters']['prices_decimal_separator'][$currency_code];
293  } else {
294  $prices_decimal_separator = vb($GLOBALS['site_parameters']['prices_decimal_separator'], ',');
295  }
296  }
297  if(!empty($GLOBALS['site_parameters']['prices_thousands_separator']) && is_array($GLOBALS['site_parameters']['prices_thousands_separator']) && isset($GLOBALS['site_parameters']['prices_thousands_separator'][$currency_code])) {
298  $prices_thousands_separator = $GLOBALS['site_parameters']['prices_thousands_separator'][$currency_code];
299  } else {
300  $prices_thousands_separator = vb($GLOBALS['site_parameters']['prices_thousands_separator'], ' ');
301  }
302 
303  if (round($price_displayed, $prices_precision) == 0 && $price_displayed < 0) {
304  // On veut éviter que le résultat affiché soit -0,00 => on force à un réel 0
305  $price_displayed = 0;
306  }
307  if ($format) {
308  // On formatte le prix pour l'affichage
309  // Seuls les float sont admis dans la fonction number_format():
310  if (is_numeric($price_displayed)) {
311  if(!empty($GLOBALS['site_parameters']['prices_show_rounded_if_possible']) && round($price_displayed) == round($price_displayed, $prices_precision)) {
312  $prices_precision = 0;
313  }
314  $price_displayed = number_format($price_displayed, $prices_precision, $prices_decimal_separator, $prices_thousands_separator);
315  }
316  if($add_rdfa_properties) {
317  $price_displayed = '<span property="price">'.$price_displayed.'</span>';
318  }
319  if ($display_iso_currency_code) {
320  if($add_rdfa_properties) {
321  $currency_code = '<span property="priceCurrency">'.$currency_code.'</span>';
322  }
323  $price_displayed .= ' ' . $currency_code;
324  } elseif ($display_currency) {
325  // Si on veut afficher le symbole de la devise (Par défaut, on affiche uniquement le montant)
326  if ($symbole_place == 1) {
327  $price_displayed .= $GLOBALS['STR_BEFORE_TWO_POINTS'] . $currency_symbole;
328  } else {
329  $price_displayed = $currency_symbole . ' ' . $price_displayed;
330  }
331  /*if($add_rdfa_properties) {
332  $price_displayed .= ' <span class="hidden" property="priceCurrency">'.$currency_code.'</span>';
333  }*/
334  }
335  } elseif($round_even_if_no_format) {
336  $price_displayed = round($price_displayed, $prices_precision);
337  } else {
338  // Etant donné le fonctionnement du stockage des float, il peut y avoir des nombres qui apparaissent en tant que X.49999 au lieu de X.50000 par exemple
339  // Donc même si on ne formatte pas, on veut afficher le prix corrigé de ce défaut (sinon, on n'aurait pas fait appel à la fonction fprix si on ne voulait pas un minimum de traitement)
340  if(abs($price_displayed-round($price_displayed, $prices_precision))<0.0001 == $price_displayed) {
341  $price_displayed = number_format($price_displayed, $prices_precision, '.', '');
342  }
343  }
344  return $price_displayed;
345 }
346 
355 {
356  if (!empty($currency) && !is_numeric($currency)) {
357  $_SESSION['session_curr']['EUR'] = 1;
358  $_SESSION['session_curr']['FRF'] = 6.55957;
359  if (isset($_SESSION['session_curr'][$currency]) && is_numeric($_SESSION['session_curr'][$currency])) {
360  $rate = $_SESSION['session_curr'][$currency];
361  } else {
362  $sql_query = "
363  SELECT `conversion`
364  FROM `peel_devises`
365  WHERE `code`='" . nohtml_real_escape_string($currency) . "' AND " . get_filter_site_cond('devises') . "
366  LIMIT 1";
367  // echo $sql_query;
368  query($sql_query);
369  while ($result = fetch_object()) {
370  $rate = $result->conversion;
371  $_SESSION['session_curr'][$currency] = $rate;
372  }
373  if (count($_SESSION['session_curr']) > 30) {
374  // On retire le premier élément du tableau si on a atteint la limite de taille du tableau
375  // NB : current() ne peut focntionner car il ne retourne pas de référence mais une copie
376  unset($_SESSION['session_curr'][key($_SESSION['session_curr'])]);
377  }
378  }
379  }
380  if (isset($rate) && is_numeric($rate)) {
381  return $rate;
382  } else {
383  return null;
384  }
385 }
386 
394 function charge_article($id, $show_all_etat_if_admin = true)
395 {
396  $qid = query("SELECT
397  a.id
398  ,a.surtitre_" . $_SESSION['session_langue'] . " AS surtitre
399  ,a.titre_" . $_SESSION['session_langue'] . " AS titre
400  ,a.date_insere
401  ,a.texte_" . $_SESSION['session_langue'] . " AS texte
402  ,a.chapo_" . $_SESSION['session_langue'] . " AS chapo
403  ,a.image1
404  ,a.etat
405  ,a.on_special
406  ,ar.rubrique_id
407  FROM peel_articles a
408  INNER JOIN peel_articles_rubriques ar ON a.id = ar.article_id
409  WHERE a.id='" . intval($id) . "' AND " . get_filter_site_cond('articles', 'a') . " " . ($show_all_etat_if_admin && a_priv("admin_content", false) ? '' : "AND a.etat = '1' AND (a.titre_" . $_SESSION['session_langue'] . "!='' OR a.texte_" . $_SESSION['session_langue'] . "!='' OR a.chapo_" . $_SESSION['session_langue'] . "!='' OR a.surtitre_" . $_SESSION['session_langue'] . "!='')") . "");
410  return fetch_assoc($qid);
411 }
412 
421 function get_discount_text($remise_valeur, $remise_percent, $is_remise_valeur_including_taxe)
422 {
423  $remise_displayed = array();
424  $remise_valeur = floatval($remise_valeur);
425  $remise_percent = floatval($remise_percent);
426  if (!empty($remise_valeur)) {
427  $remise_displayed[] = fprix($remise_valeur, true, $GLOBALS['site_parameters']['code'], false);
428  }
429  if (!empty($remise_percent)) {
430  $remise_displayed[] = sprintf("%0.2f", $remise_percent) . '% ' . ($is_remise_valeur_including_taxe ? $GLOBALS['STR_TTC'] : $GLOBALS['STR_HT']);
431  }
432 
433  return implode(' / ', $remise_displayed);
434 }
435 
442 {
443  if (!empty($GLOBALS['site_parameters']['tag_analytics'])) {
444  if (!empty($GLOBALS['site_parameters']['no_display_tag_analytics_for_ip'])) {
445  foreach(explode(',', str_replace(array(' ', ';'), array(',', ','), $GLOBALS['site_parameters']['no_display_tag_analytics_for_ip'])) as $this_ip_part) {
446  if (!empty($this_ip_part) && ($this_ip_part == '*' || strpos($_SERVER['REMOTE_ADDR'], $this_ip_part) === 0)) {
447  // IP utilisée détectée comme commençant par une IP listée dans no_display_tag_analytics_for_ip
448  return false;
449  }
450  }
451  }
452  return $GLOBALS['site_parameters']['tag_analytics'];
453  } else {
454  return false;
455  }
456 }
457 
469 function get_modules_array($only_active = false, $location = null, $technical_code = null, $force_update_cache_information = false, $specific_site_id = null, $exclude_public_items = false)
470 {
471  static $modules_array;
472  $static_hash = '';
473  if ($only_active) {
474  $static_hash .= 'only_active';
475  }
476  // On ajoute wwwroot dans le hash, en cas de configuration multisite certaines données sont différentes en fonction du site.
477  $static_hash .= $location . '_' . $technical_code . '_' . vb($GLOBALS['page_columns_count']). '_' . vb($GLOBALS['wwwroot']);
478  if (!isset($modules_array[$static_hash]) || $force_update_cache_information) {
479  $modules = array();
480  // defined('IN_PEEL_ADMIN') pour get_filter_site_cond : Cette fonction est appelée en front office pour l'affichage des modules mais aussi en back office pour l'administration des modules.
481  // Pour l'édition des modules on exclut (ou pas) les éléments publiques en fonction de la configuration de l'administrateur.
482  $sql = 'SELECT *
483  FROM peel_modules
484  WHERE ' . get_filter_site_cond('modules', null, defined('IN_PEEL_ADMIN'), $specific_site_id, $exclude_public_items) . ' AND ' . ($location == 'header' && vn($GLOBALS['page_columns_count']) == 2 ?'(':'') . '(1' . ($technical_code ? ' AND technical_code="' . nohtml_real_escape_string($technical_code) . '"' : '') . ($location ? ' AND location="' . nohtml_real_escape_string($location) . '"' : '') . ')' . ($location == 'header' && vn($GLOBALS['page_columns_count']) == 2 ? ' OR (technical_code="caddie" AND location="below_middle")' : '') . ($location == 'header' && vn($GLOBALS['page_columns_count']) == 2 ?')':'') . ($only_active ? ' AND etat="1"' : '') . '
485  ORDER BY position, id';
486  $query = query($sql);
487  while ($this_module = fetch_assoc($query)) {
488  if(!empty($GLOBALS['site_parameters']['modules_disabled_array']) && in_array($this_module['technical_code'], $GLOBALS['site_parameters']['modules_disabled_array'])) {
489  // Permet de désactiver un modèle dans un contexte particulier que ne permet pas la table peel_modules
490  continue;
491  }
492  if(!empty($GLOBALS['site_parameters']['modules_only_if_constant_defined']) && !empty($GLOBALS['site_parameters']['modules_only_if_constant_defined'][$this_module['technical_code']])) {
493  $ok = false;
494  foreach(explode(',', $GLOBALS['site_parameters']['modules_only_if_constant_defined'][$this_module['technical_code']]) as $this_constant) {
495  if(defined(trim($this_constant))) {
496  $ok = true;
497  break;
498  }
499  }
500  if(empty($ok)) {
501  continue;
502  }
503  unset($ok);
504  }
505  // Traitement spécifique
506  if ($this_module['location'] == 'below_middle' && vn($GLOBALS['page_columns_count']) == 2 && $this_module['technical_code'] == 'caddie') {
507  // On déplace le module de droite vers le haut pour l'afficher quand même
508  if ((empty($location) || $location == 'header') && empty($GLOBALS['site_parameters']['bootstrap_enabled'])) {
509  $this_module['location'] = 'header';
510  $this_module['display_mode'] = '';
511  } else {
512  continue;
513  }
514  } else {
515  $this_module['location'] = str_replace(array('left_annonce', 'right_annonce'), array('left', 'right'), $this_module['location']);
516  }
517  // On prend cet élément éventuellement modifié
518  // Si le module est défini pour être afficher uniquement sur la home, alors on vérifie si on est sur la page Home, sinon on ne l'affiche pas.
519  if (empty($this_module['in_home']) || (!empty($this_module['in_home']) && defined('IN_HOME'))) {
520  $modules[$this_module['id']] = $this_module;
521  }
522  }
523  $modules_array[$static_hash] = $modules;
524  }
525  // Traitement spécifique
526  return $modules_array[$static_hash];
527 }
528 
543 function get_modules($location, $return_mode = false, $technical_code = null, $id_categorie = null, $this_annonce_number = 0, $return_array_with_raw_information = false, $criterias = null)
544 {
545  if (empty($criterias)) {
546  $criterias = $_GET;
547  }
548  // Ne pas mettre upsell dans la liste ci-après car un cache est déjà mis en place à l'intérieur du module
549  $allowing_cache_modules_technical_codes = array('annonces' => 4500, 'tagcloud' => 120);
550  // Pour annonces, si module de crons activé, le cron toutes les heures regénère les fichiers de cache pour éviter que ce soit un utilisateur qui le déclenche
551  $output = '';
552  $output_array = array();
553  $modules_array = get_modules_array(true, $location, $technical_code);
554 
555  $i = 0;
556  foreach ($modules_array as $this_module) {
557  $load_module = true;
558  $this_block_style = '';
559  $this_module_output = '';
560  if (!empty($id_categorie)) {
561  $display_catalog_allowed = extra_catalogue_condition($id_categorie);
562  } else {
563  $display_catalog_allowed = true;
564  }
565  if (!empty($allowing_cache_modules_technical_codes[$this_module['technical_code']]) && !a_priv('admin*')) {
566  $cache_id = $this_module['technical_code'] . '_' . $_SESSION['session_langue'] . '_' . vn($criterias['catid']) . '_' . $GLOBALS['site_id'] . '_' . vn($_SESSION['session_admin_multisite']);
567  $this_module_output_cache_object = new Cache($cache_id, array('group' => 'html_block'));
568  if ($this_module_output_cache_object->testTime($allowing_cache_modules_technical_codes[$this_module['technical_code']], true)) {
569  $this_module_output = $this_module_output_cache_object->get();
570  $load_module = false;
571  }
572  }
573  if ($load_module) {
574  if ($this_module['technical_code'] == 'catalogue') {
575  if($display_catalog_allowed) {
576  if (function_exists('affiche_menu_catalogue')) {
577  // Test sur la présence de affiche_menu_catalogue qui est l'ancienne fonction pour l'affichage du catalogue. L'utilisation est permise ici pour des raions de compatibilité avec d'anciens templates, dans le cas où la fonction est définie dans display_custom.php
578  $this_module_output = affiche_menu_catalogue($this_module['location'], true, true);
579  } else {
580  $this_module_output = get_categories_output($this_module['location'], 'categories', vn($_GET['catid']), ($this_module['location']=='footer'?'div':''), null);
581  }
582  $tpl = $GLOBALS['tplEngine']->createTemplate('menu_catalogue.tpl');
583  $tpl->assign('menu', $this_module_output);
584  $tpl->assign('add_ul_if_result', true);
585  $this_module_output = $tpl->fetch();
586  }
587  } elseif ($this_module['technical_code'] == 'tagcloud' && check_if_module_active('tagcloud')) {
588  $this_module_output = affiche_tagcloud(true);
589  } elseif ($this_module['technical_code'] == 'search') {
590  if(!empty($this_module['technical_code'])){
591  $this_module_output = affiche_menu_recherche(true, $this_module['location']);
592  }
593  } elseif ($this_module['technical_code'] == 'guide') {
594  $this_module_output = affiche_guide($this_module['location'], true, true);
595  } elseif ($this_module['technical_code'] == 'guide_simplified') {
596  $this_module_output = affiche_guide($this_module['location'], true, false);
597  } elseif ($this_module['technical_code'] == 'caddie') {
598  // Le caddie est affiché en mode condensé si dans le header, ou détaillé sinon
599  $this_module_output = affiche_mini_caddie($this_module['location'] != 'header', true);
600  } elseif ($this_module['technical_code'] == 'account') {
601  $this_module_output = affiche_compte(true, $this_module['location']);
602  } elseif ($this_module['technical_code'] == 'best_seller') {
603  if (check_if_module_active('best_seller')) {
604  $this_module_output = affiche_best_seller_produit_colonne(true, $this_module['location']);
605  $width_class = '';
606  }
607  } elseif ($this_module['technical_code'] == 'brand') {
608  // affiche du block marque
609  $this_module_output = get_brand_link_html(null, true, true, $this_module['location']);
610  } elseif ($this_module['technical_code'] == 'last_views') {
611  if (check_if_module_active('last_views')) {
612  $this_module_output = affiche_last_views($this_module['location']);
613  }
614  } elseif ($this_module['technical_code'] == 'quick_access') {
615  if (function_exists('get_quick_access')) {
616  $this_module_output = get_quick_access($this_module['location'], true);
617  }
618  } elseif ($this_module['technical_code'] == 'news' || $this_module['technical_code'] == 'articles_rollover') {
619  if (check_if_module_active('menus')) {
620  if($this_module['technical_code'] == 'news') {
621  $items_html_array = get_on_rollover_products_html();
622  } else {
623  $items_html_array = get_on_rollover_articles_html();
624  }
625  if (vn($GLOBALS['site_parameters']['type_rollover']) == 1) {
626  $this_module_output = affiche_menu_deroulant_1('scrollerdiv_' . $this_module['technical_code'], $items_html_array);
627  } elseif (vn($GLOBALS['site_parameters']['type_rollover']) == 2) {
628  $this_module_output = affiche_menu_deroulant_2('scrollerdiv_' . $this_module['technical_code'], $items_html_array);
629  }
630  }
631  } elseif (String::substr($this_module['technical_code'], 0, String::strlen('advertising')) == 'advertising' && check_if_module_active('banner')) {
632  /* Explication du fonctionnement des bannières publicitaires */
633 
634  // A NE PAS CONFONDRE
635  // Location : Correspond à l'emplacement 'physique' de la fonction get_module sur la page (left, top, right, etc ...). Cette valeur est administrable dans la page d'administration des modules, via des boutons radios qui représente chaque emplacement prévu dans le site. Ce paramètre est utilisé par get_module seulement.
636  // Espace : C'est un emplacement publicitaire, qui est administrable en back office. Ce chiffre permet de faire le lien entre le module de la table peel_modules et la bannière pub. Dans peel_modules, le numéro de l'espace pour la bannière pub est concaténé avec code technique du module dans le champ technical_code.
637  // ATTENTION => l'espace est stocké dans le champ POSITION de peel_banniere ! Il faudra refondre le module pour rendre tout ça cohérent.
638  // Position : La position d'une bannière est défini par le champ 'rang' de peel_banniere. Cela permet de trier les bannières entre elles dans un même espace publicitaire.
639 
640  // ROLE DE GET_MODULE POUR L'AFFICHAGE DES PUB
641  // Défini l'emplacement sur la page où la publicité s'affichera. La fonction récupère dans un premier temps les modules dont la 'location' choisi par l'administrateur en back office est égal au paramètre location get_module
642  // Pour chaque résultat, un technical_code indique la fonction associé au module. Pour les pubs ce technical_code commence par advertising
643 
644  // UTILITE DE LA VALEUR TECHNICAL_CODE DE PEEL_MODULES
645  // => cette valeur est une association de deux valeurs :
646  // - advertising, qui indique que le module doit afficher une pub
647  // - l'espace, qui permet de faire le lien avec la bannière publicitaire lié au module.
648 
649  // ROLE DE AFFICHE_BANNER
650  // affiche_banner rècupère l'espace publicitaire qui a été fourni par le technical_code du module. La fonction retourne la(les) bannière(s) associée(s) à cet espace par l'administrateur en back office, en plus des critères de dates, de contrainte sur les pages, etc....
651  // Exemple : advertising5 affiche la publicité en position 5
652 
653  // Définition du type de page pour ne sélectionner que les bannières adéquates
654  if (defined('IN_HOME')) {
655  $page_type = 'home_page';
656  } elseif ((defined('IN_CATALOGUE') || defined('IN_CATALOGUE_ANNONCE')) && (empty($criterias['page']) || $criterias['page'] === '0' || $criterias['page'] == 1)) {
657  $page_type = 'first_page_category';
658  } elseif ((defined('IN_CATALOGUE') || defined('IN_CATALOGUE_ANNONCE')) && $criterias['page'] > 1) {
659  $page_type = 'other_page_category';
660  } elseif (defined('IN_CATALOGUE_ANNONCE_DETAILS')) {
661  $page_type = 'ad_page_details';
662  } elseif (defined('IN_SEARCH')) {
663  $page_type = 'search_engine_page';
664  } elseif (defined('IN_AD_CREATION')) {
665  $page_type = 'ad_creation_page';
666  } else {
667  $page_type = 'other_page';
668  }
669  if (!empty($keywords_array)) {
670  $sql_cond .= ' AND ' . build_terms_clause($keywords_array, array('keywords'), 2);
671  }
672  $this_module_output = affiche_banner(String::substr($this_module['technical_code'], strlen('advertising')), true, (isset($criterias['page'])?$criterias['page']:null), $id_categorie, $this_annonce_number, $page_type, (isset($criterias['search'])?explode(' ', $criterias['search']):null), $_SESSION['session_langue'], $return_array_with_raw_information, (isset($criterias['ref'])?$criterias['ref']:null), vn($GLOBALS['page_related_to_user_id']));
673  } elseif ($this_module['technical_code'] == 'menu') {
674  $this_block_style = ' ';
675  foreach ($modules_array as $this_module2) {
676  if ($this_module2['technical_code'] == 'caddie' && $this_module['location'] == 'header' && empty($GLOBALS['site_parameters']['bootstrap_enabled'])) {
677  $this_block_style = ' style="width:80%"';
678  }
679  }
680  $this_module_output = get_menu(vb($GLOBALS['main_div_id']));
681  } elseif ($this_module['technical_code'] == 'ariane') {
682  $this_module_output = affiche_ariane(true);
683  } elseif ($this_module['technical_code'] == 'paiement_secu') {
684  $this_module_output = get_modules_paiement_secu();
685  } elseif ($this_module['technical_code'] == 'newsletter_in_column') {
686  // $this_module_output = get_newsletter_in_column();
687  } elseif ($this_module['technical_code'] == 'subscribe_newsletter') {
688  $this_module_output = get_newsletter_form($this_module['location'], true);
689  } elseif ($this_module['technical_code'] == 'contact') {
690  $this_module_output = get_contact_sideblock($this_module['location'], true);
691  } elseif ($this_module['technical_code'] == 'annonces' && check_if_module_active('annonces')) {
692  $this_module_output = affiche_menu_annonce($this_module['location'], true, true);
693  } elseif ($this_module['technical_code'] == 'become_verified' && check_if_module_active('abonnement')) {
694  $this_module_output = get_verified_sideblock_link($this_module['location'], true);
695  } elseif ($this_module['technical_code'] == 'upsell' && check_if_module_active('abonnement')) {
696  $this_module_output = getVerifiedAdsList();
697  } elseif ($this_module['technical_code'] == 'search_by_list' && check_if_module_active('annonces')) {
698  $this_module_output = get_annonces_in_box('search_by_list', $this_module['location'], true);
699  $this_module['sliding_mode'] = false;
700  } elseif ($this_module['technical_code'] == 'product_new') {
701  if (check_if_module_active('annonces')) {
702  $this_module_output = get_annonces_in_box('last', $this_module['location'], true);
703  $this_module['sliding_mode'] = false;
704  } else {
705  $this_module_output = get_product_new_list($this_module['location'], true);
706  }
707  } elseif ($this_module['technical_code'] == 'last_forum_posts' && check_if_module_active('forum')) {
708  $this_module_output = getForumLastMessages($_SESSION['session_langue']);
709  } elseif ($this_module['technical_code'] == 'new_members_list' && check_if_module_active('groups_advanced')) {
710  $this_module_output = get_new_members_list();
711  } elseif ($this_module['technical_code'] == 'birthday_members_list' && check_if_module_active('groups_advanced')) {
712  $this_module_output = get_birthday_members_list();
713  } elseif ($this_module['technical_code'] == 'agenda_datepicker' && check_if_module_active('agenda')) {
714  $this_module_output = display_agenda();
715  } elseif ($this_module['technical_code'] == 'get_search_product_form' ) {
716  $this_module_output = get_search_form($_GET, vb($_GET['search']), vb($_GET['match']), null, 'module_products');
717  } elseif ($this_module['technical_code'] == 'get_search_ads_form' ) {
718  $this_module_output = get_search_form($_GET, vb($_GET['search']), vb($_GET['match']), null, 'module_ads');
719  } elseif ($this_module['technical_code'] == 'get_search_member_form' && check_if_module_active('groups_advanced')) {
720  $this_module_output = get_search_user_form("module");
721  } elseif ($this_module['technical_code'] == 'next_product_flash' && check_if_module_active('flash')) {
722  $this_module_output = get_next_product_flash();
723  } elseif ($this_module['technical_code'] == 'references' && check_if_module_active('carrousel')) {
724  $this_module_output = Carrousel::display('references', true);
725  } elseif ($this_module['technical_code'] == 'partenaires' && check_if_module_active('carrousel')) {
726  $this_module_output = Carrousel::display('partenaires', true);
727  }elseif ($this_module['technical_code'] == 'forum_rss') {
728  $this_module_output = get_xml_value($GLOBALS['site_parameters']['forum_rss_url'], $GLOBALS['site_parameters']['forum_rss_filter_string'], 9, 90);
729  }elseif (function_exists('get_'.$this_module['technical_code'].'_module')) {
730  $this_module_output = call_user_func('get_'.$this_module['technical_code'].'_module');
731  }
732  if (!empty($this_module_output_cache_object)) {
733  // Si le module est mis en cache, on sauvegarde son contenu
734  $this_module_output_cache_object->save($this_module_output);
735  }
736  }
737  unset($this_module_output_cache_object);
738 
739  if (!empty($this_module_output)) {
740  // On remplace d'éventuels tags par leurs valeurs (exemple : [WWWROOT])
741  $this_module_output = template_tags_replace($this_module_output);
742  if (!empty($return_array_with_raw_information)) {
743  $output_array[] = $this_module_output;
744  } else {
745  $block_class = $this_module['display_mode'] . '_' . $this_module['technical_code'];
746  if(!empty($GLOBALS['site_parameters']['modules_block_class_by_technical_code_array']) && !empty($GLOBALS['site_parameters']['modules_block_class_by_technical_code_array'][$this_module['technical_code']])) {
747  $block_class .= ' ' . $GLOBALS['site_parameters']['modules_block_class_by_technical_code_array'][$this_module['technical_code']];
748  } elseif(!empty($GLOBALS['site_parameters']['modules_block_class_by_display_mode_array']) && !empty($GLOBALS['site_parameters']['modules_block_class_by_display_mode_array'][$this_module['display_mode']])) {
749  $block_class .= ' ' . $GLOBALS['site_parameters']['modules_block_class_by_display_mode_array'][$this_module['display_mode']];
750  } elseif(in_array($this_module['location'], vb($GLOBALS['site_parameters']['modules_no_class_location_array'], array('left', 'right', 'left_annonce', 'right_annonce')))) {
751  $block_class .= '';
752  } elseif(isset($width_class)) {
753  $block_class .= ' ' . $width_class;
754  } elseif($this_module['location'] != 'header' && String::substr($this_module['technical_code'], 0, String::strlen('advertising')) != 'advertising') {
755  $block_class .= ' col-md-4';
756  }
757  if ($this_module['display_mode'] == 'sideblocktitle' && $this_module['location'] != 'header' && $this_module['location'] != 'footer' && $this_module['location'] != 'middle') {
758  $output .= affiche_sideblocktitle(vb($this_module['title_' . $_SESSION['session_langue']]), $this_module_output, $block_class, true);
759  } elseif ($this_module['display_mode'] == 'sideblock' && $this_module['location'] != 'header' && $this_module['location'] != 'footer' && $this_module['location'] != 'middle') {
760  $output .= affiche_sideblock(vb($this_module['title_' . $_SESSION['session_langue']]), $this_module_output, $block_class, true);
761  } else {
762  if (!empty($this_module['sliding_mode'])) {
763  $output .= affiche_block($this_module['display_mode'], $this_module['location'], $this_module['technical_code'], vb($this_module['title_' . $_SESSION['session_langue']]), $this_module_output, $this_module['display_mode'] . '_' . $this_module['technical_code'], $this_block_style, true, true);
764  } else {
765  $block_class .= ' ' . $this_module['display_mode'] . ' ' . $this_module['location'] . '_basicblock ' . $this_module['location'] . '_' . $this_module['technical_code'] . ' ' . $this_module['technical_code'] . '_' . $_SESSION['session_langue'];
766  if (($this_module['display_mode'] == 'sideblocktitle' || $this_module['display_mode'] == 'sideblock') && $this_module['location'] == 'footer') {
767  $extra_class = true;
768  } else {
769  $extra_class = false;
770  }
771  $output .= affiche_block($this_module['display_mode'], $this_module['location'], $this_module['technical_code'], vb($this_module['title_' . $_SESSION['session_langue']]), $this_module_output, $block_class, $this_block_style, true, true, true, vb($extra_class));
772  }
773  }
774  }
775  }
776  if ($location == 'center_middle_home') {
777  if($i % 2 == 0) {
778  $output .= '<div class="clearfix"></div>';
779  }
780  // Ne pas incrementer le compteur pour les bannières qui prennent toutes la largeur du contenu
781  if ($this_module['display_mode'] != 'banner_up') {
782  $i++;
783  }
784  }
785  }
786 
787  if ($return_array_with_raw_information) {
788  return $output_array;
789  } elseif ($return_mode) {
790  return $output;
791  } elseif (!empty($output)) {
792  echo $output;
793  } else {
794  return false;
795  }
796 }
797 
805 function insere_ticket(&$frm)
806 {
807  if (check_if_module_active('webmail')) {
809  }
810  if ((String::strpos(vb($frm['sujet']), '/24') !== false || String::strpos(vb($frm['sujet']), '24/') !== false) && !empty($GLOBALS['site_parameters']['email_emergency'])) {
811  $recipient_email = $GLOBALS['site_parameters']['email_emergency'];
812  } else {
813  $recipient_email = $GLOBALS['support_sav_client'];
814  }
815  if (!empty($recipient_email)) {
816  unset($custom_template_tags);
817  $custom_template_tags['DATE'] = get_formatted_date(time(), 'short', 'long');
818  $custom_template_tags['NOM_FAMILLE'] = vb($frm['nom']);
819  $custom_template_tags['SOCIETE'] = vb($frm['societe']);
820  $custom_template_tags['TELEPHONE'] = vb($frm['telephone']);
821  $custom_template_tags['ADRESSE'] = vb($frm['adresse']) . ' ' . vb($frm['code_postal']) . ' ' . vb($frm['ville']) . ' ' . vb($frm['pays']);
822  $custom_template_tags['EMAIL'] = vb($frm['email']);
823  $custom_template_tags['DISPO'] = vb($frm['dispo']);
824  $custom_template_tags['TEXTE'] = vb($frm['texte']);
825  $custom_template_tags['SUJET'] = ((!empty($frm['commande_id'])) ? "[" . $GLOBALS['STR_ORDER_NAME'] . " " . $frm['commande_id'] . "] " : "") . vb($frm['sujet']);
826  $custom_template_tags['PRENOM'] = vb($frm['prenom']);
827  send_email($recipient_email, '', '', 'insere_ticket', $custom_template_tags, null, $GLOBALS['support'], true, false, false, vb($frm['email']));
828  }
829 }
830 
840 function getFlashBannerHTML($url, $width = 680, $height = 250, $mode_transparent = false)
841 {
842  $tpl = $GLOBALS['tplEngine']->createTemplate('FlashBannerHTML.tpl');
843  $tpl->assign('url', $url);
844  $tpl->assign('width', $width);
845  $tpl->assign('height', $height);
846  $tpl->assign('mode_transparent', $mode_transparent);
847  return $tpl->fetch();
848 }
849 
857 {
858  if(strpos($id, ',') !== false) {
859  $site_country_array = array();
860  foreach(explode(',', $id) as $this_id) {
861  $site_country_array[] = get_country_name($this_id);
862  }
863  return implode(', ', $site_country_array);
864  } elseif($id === null || $id === '') {
865  return null;
866  }
867  $id = intval($id);
868  if($id == 0) {
869  return $GLOBALS['STR_WORLD'];
870  } else {
871  $sql = 'SELECT pays_' . $_SESSION['session_langue'] . '
872  FROM peel_pays
873  WHERE id="' . intval($id) . '"';
874  $q = query($sql);
875  if ($result = fetch_assoc($q)) {
876  return String::html_entity_decode_if_needed($result['pays_' . $_SESSION['session_langue']]);
877  } else {
878  return false;
879  }
880  }
881 }
882 
889 function get_country_id($country_name)
890 {
891  $sql = 'SELECT id
892  FROM peel_pays
893  WHERE pays_' . $_SESSION['session_langue'] . '="' . nohtml_real_escape_string($country_id_or_name) . '" AND ' . get_filter_site_cond('pays') . '
894  LIMIT 1';
895  $query = query($sql);
896  if ($obj = fetch_object($query)) {
897  $result = $obj->id;
898  }
899  if (!empty($result)) {
900  return $result;
901  } else {
902  return false;
903  }
904 }
905 
913 {
914  $sql = 'SELECT nom_' . $_SESSION['session_langue'] . ' AS name
915  FROM peel_categories c
916  WHERE id="' . intval($id) . '" AND ' . get_filter_site_cond('categories', 'c') . '';
917  $q = query($sql);
918  if ($result = fetch_assoc($q)) {
920  } else {
921  return false;
922  }
923 }
924 
933 function get_category_tree_and_itself($id_or_ids_array, $mode = 'sons', $table_to_use = 'categories')
934 {
935  static $result_array;
936  static $first_depth_results_array;
937  if(empty($first_depth_results_array[$mode][$table_to_use])) {
938  if ($mode == 'sons') {
939  $select_field = 'id';
940  $condition_field = 'parent_id';
941  } elseif ($mode == 'parents') {
942  $select_field = 'parent_id AS id';
943  $condition_field = 'id';
944  } else {
945  // erreur de paramétrage
946  return false;
947  }
948  $site_cond = "";
949  if ($table_to_use == 'rubriques') {
950  $table = 'peel_rubriques';
951  $site_cond .= " AND " . get_filter_site_cond($table_to_use) . "";
952  } elseif ($table_to_use == 'categories') {
953  $table = 'peel_categories';
954  $site_cond .= " AND " . get_filter_site_cond($table_to_use) . "";
955  } elseif ($table_to_use == 'annonces') {
956  $table = 'peel_categories_annonces';
957  } else {
958  // erreur de paramétrage
959  return false;
960  }
961  $sql = 'SELECT id, parent_id
962  FROM ' . $table . '
963  WHERE etat=1 '.$site_cond.'
964  ORDER BY position ASC';
965  $qid = query($sql);
966  while ($cat = fetch_assoc($qid)) {
967  $first_depth_results_array[$mode][$table_to_use][$cat[$condition_field]][] = $cat[$select_field];
968  }
969  }
970  if (is_array($id_or_ids_array)) {
971  $ids_list = implode(',', $id_or_ids_array);
972  } else {
973  $ids_list = $id_or_ids_array;
974  }
975  if (empty($result_array[$mode][$table_to_use][$ids_list])) {
976  if (is_array($id_or_ids_array)) {
977  $result_array[$mode][$table_to_use][$ids_list] = $id_or_ids_array;
978  } else {
979  $result_array[$mode][$table_to_use][$ids_list][] = $id_or_ids_array;
980  }
981  foreach(explode(',', $ids_list) as $this_condition_id) {
982  if(!empty($first_depth_results_array[$mode][$table_to_use][$this_condition_id])) {
983  foreach($first_depth_results_array[$mode][$table_to_use][$this_condition_id] as $this_found_id) {
984  $result_array[$mode][$table_to_use][$ids_list] = array_merge($result_array[$mode][$table_to_use][$ids_list], get_category_tree_and_itself($this_found_id, $mode, $table_to_use));
985  }
986  }
987  }
988  }
989  return $result_array[$mode][$table_to_use][$ids_list];
990 }
991 
1005 function get_country_select_options($selected_country_name = null, $selected_country_id = null, $option_value = 'name', $display_inactive_country = false, $allowed_zone_id = null, $preselect_shop_country_if_none_selected = true, $selected_country_lang = null, $allowed_ids = null)
1006 {
1007  $output = '';
1008  $sql_condition = '';
1009  if ($preselect_shop_country_if_none_selected && empty($selected_country_name) && empty($selected_country_id)) {
1010  if(!empty($_SESSION['session_country_detected'])) {
1011  $selected_country_id = vn($_SESSION['session_country_detected']);
1012  } else {
1013  $selected_country_id = vn($GLOBALS['site_parameters']['default_country_id']);
1014  }
1015  }
1016  if (empty($selected_country_lang)) {
1017  $sql_select_add_fields = '';
1018  $selected_country_lang = $_SESSION['session_langue'];
1019  } else {
1020  $sql_select_add_fields = ', pays_' . $selected_country_lang;
1021  }
1022  if (!$display_inactive_country) {
1023  $sql_condition .= ' AND etat = "1"';
1024  }
1025  if (!empty($allowed_zone_id)) {
1026  $sql_condition .= ' AND zone = "' . intval($allowed_zone_id) . '"';
1027  }
1028  if (!empty($allowed_ids)) {
1029  $sql_condition .= ' AND id IN ("' . implode('","', real_escape_string($allowed_ids)) . '")';
1030  }
1031  $sql_pays = 'SELECT id, pays_' . $_SESSION['session_langue'] . ' ' . $sql_select_add_fields . '
1032  FROM peel_pays
1033  WHERE 1 ' . $sql_condition . ' AND ' . get_filter_site_cond('pays') . '
1034  ORDER BY position, pays_' . $_SESSION['session_langue'];
1035 
1036  $res_pays = query($sql_pays);
1037  $tpl = $GLOBALS['tplEngine']->createTemplate('select_options.tpl');
1038  $tpl_options = array();
1039  while ($tab_pays = fetch_assoc($res_pays)) {
1040  if ($option_value == 'name') {
1041  $value = $tab_pays['pays_' . $selected_country_lang];
1042  } elseif ($option_value == 'id') {
1043  $value = $tab_pays['id'];
1044  }
1045  $tpl_options[] = array(
1046  'value' => $value,
1047  'name' => $tab_pays['pays_' . $_SESSION['session_langue']],
1048  'issel' => (vb($selected_country_name) == $tab_pays['pays_' . $selected_country_lang] || vb($selected_country_id) == $tab_pays['id'])
1049  );
1050  }
1051  $tpl->assign('options', $tpl_options);
1052  $output .= $tpl->fetch();
1053  return $output;
1054 }
1055 
1063 function get_all_site_countries_array($admin_force_multisite_if_allowed = false, $exclude_public_items = false, $show_only_site_country_allowed_array = false) {
1064  $sites_name_array = array();
1065  $sql_where = '';
1066  if($show_only_site_country_allowed_array) {
1067  $sql_where .= ' AND id IN ("' . implode('","', vb($GLOBALS['site_parameters']['site_country_allowed_array'])) . '")';
1068  }
1069  $sql_pays = 'SELECT id, pays_' . $_SESSION['session_langue'] . ' AS name
1070  FROM peel_pays
1071  WHERE etat=1 ' . $sql_where . ' AND ' . get_filter_site_cond('pays', null, false, null, $exclude_public_items, $admin_force_multisite_if_allowed) . '
1072  ORDER BY position, pays_' . $_SESSION['session_langue'];
1073  $res_pays = query($sql_pays);
1074  while($result = fetch_assoc($res_pays)) {
1075  $sites_name_array[$result['id']] = $result['name'];
1076  }
1077  return $sites_name_array;
1078 }
1079 
1087  $result_array = get_all_site_countries_array();
1088  if($mode == 'id') {
1089  return implode(',', array_keys($result_array));
1090  } else {
1091  return implode(',', $result_array);
1092  }
1093 }
1094 
1102 }
1103 
1110 function get_delivery_type_options($selected_delivery_type_id_or_name = null)
1111 {
1112  $output = '';
1113  $sql_type = "SELECT id, nom_" . $_SESSION['session_langue'] . ", site_id
1114  FROM peel_types
1115  WHERE etat = 1 AND " . get_filter_site_cond('types') . " AND (nom_" . $_SESSION['session_langue'] . "!=''".(!empty($selected_delivery_type_id_or_name)?" OR id='" . real_escape_string($selected_delivery_type_id_or_name) . "'":"").")
1116  ORDER BY position ASC, nom_" . $_SESSION['session_langue'] . " ASC";
1117  $res_type = query($sql_type);
1118 
1119  $tpl = $GLOBALS['tplEngine']->createTemplate('delivery_type_options.tpl');
1120  $tpl_options = array();
1121  while ($tab_type = fetch_assoc($res_type)) {
1122  $tpl_options[] = array(
1123  'value' => intval($tab_type['id']),
1124  'name' => get_site_info($tab_type).$tab_type['nom_' . $_SESSION['session_langue']],
1125  'issel' => ($tab_type['id'] == $selected_delivery_type_id_or_name || $tab_type['nom_' . $_SESSION['session_langue']] === $selected_delivery_type_id_or_name)
1126  );
1127  }
1128  $tpl->assign('options', $tpl_options);
1129  $output .= $tpl->fetch();
1130  return $output;
1131 }
1132 
1133 
1140 function is_delivery_address_necessary_for_delivery_type($selected_delivery_type_id = null)
1141 {
1142  $sql_type = "SELECT without_delivery_address
1143  FROM peel_types
1144  WHERE id='" . intval($selected_delivery_type_id) . "' AND " . get_filter_site_cond('types') . "";
1145  $res_type = query($sql_type);
1146 
1147  if ($type = fetch_assoc($res_type)) {
1148  return (!$type['without_delivery_address']);
1149  } else {
1150  return null;
1151  }
1152 }
1153 
1160 function set_paiement(&$frm)
1161 {
1162  if (!empty($frm['payment_technical_code'])) {
1163  $sql = "SELECT nom_" . $_SESSION['session_langue'] . " as paiement, tarif, tarif_percent, tva
1164  FROM peel_paiement
1165  WHERE technical_code = '" . nohtml_real_escape_string($frm['payment_technical_code']) . "' AND " . get_filter_site_cond('paiement') . "";
1166  $query = query($sql);
1167  if ($obj = fetch_object($query)) {
1168  $frm['tarif_paiement_ht'] = $frm['sub_total_ht'] * ($obj->tarif_percent / 100) + $obj->tarif;
1169  $frm['tarif_paiement'] = $frm['sub_total'] * ($obj->tarif_percent / 100) + $obj->tarif;
1170  $frm['tva_tarif_paiement'] = $frm['tarif_paiement'] - $frm['tarif_paiement_ht'];
1171  }
1172  } else {
1173  $frm['tarif_paiement'] = 0;
1174  $frm['tarif_paiement_ht'] = 0;
1175  $frm['tva_tarif_paiement'] = 0;
1176  }
1177 }
1178 
1187 function get_payment_select($selected_payment_technical_code = null, $show_selected_even_if_not_available = false, $show_site_info_if_needed = false)
1188 {
1189  $output = '';
1190  $where = 'WHERE ' . get_filter_site_cond('paiement', 'p') . ' AND (totalmin<=' . floatval($_SESSION['session_caddie']->total) . ' OR totalmin=0) AND (totalmax>=' . floatval($_SESSION['session_caddie']->total) . ' OR totalmax=0)';
1191 
1192  if (check_if_module_active('payment_by_product')) {
1193  $where = payment_by_product_condition();
1194  }
1195 
1196  $sql_paiement = 'SELECT p.*
1197  FROM peel_paiement p
1198  ' . $where . '
1199  ORDER BY p.position';
1200  $res_paiement = query($sql_paiement);
1201  $results_count = num_rows($res_paiement);
1202  while ($tab_paiement = fetch_assoc($res_paiement)) {
1203  $payment_complement_informations = '';
1204  if((empty($tab_paiement['etat']) || empty($tab_paiement['nom_' . $_SESSION['session_langue']])) && (!$show_selected_even_if_not_available || $tab_paiement['technical_code'] != $selected_payment_technical_code)){
1205  // On ne prend que les moyens de paiement actifs, ou ceux qui ont pour code technique $selected_payment_technical_code si $show_selected_even_if_not_available = true
1206  // Dans les autres cas, on passe au suivant
1207  continue;
1208  }
1209  if (($tab_paiement['technical_code'] == 'kwixo' && ($_SESSION['session_caddie']->zone_technical_code != 'france_mainland' && $_SESSION['session_caddie']->zone_technical_code != 'france_and_overseas')) || $tab_paiement['technical_code'] == 'kwixo_credit' && ($_SESSION['session_caddie']->montant >= 150 && $_SESSION['session_caddie']->montant <= 4000)) {
1210  // Fianet n'autorise que les paiement en france et DOM
1211  // Le paiement à crédit FIANET est possible entre 150 et 4000 €
1212  continue;
1213  }
1214  if (!defined('IN_PEEL_ADMIN') && !empty($GLOBALS['site_parameters']['payment_disable_display_on_payment_select_page']) && in_array($tab_paiement['technical_code'], $GLOBALS['site_parameters']['payment_disable_display_on_payment_select_page'])) {
1215  // On ne veut pas afficher ce moyen de paiement en front office. Il sera disponible uniquement dans l'administration.
1216  continue;
1217  }
1218  if (($tab_paiement['technical_code'] != 'paypal' || !empty($GLOBALS['site_parameters']['email_paypal'])) && ($tab_paiement['technical_code'] != 'moneybookers' || !empty($GLOBALS['site_parameters']['email_moneybookers']))) {
1219  if (String::strpos($tab_paiement['technical_code'], 'kwixo') !== false) {
1220  if ($tab_paiement['technical_code'] == 'kwixo_credit') {
1221  // Popup popuprnp3x et popuprnp1xrnp défini dans ' . $GLOBALS['wwwroot'] . '/modules/fianet/lib/js/fianet.js
1222  $payment_complement_informations .= '<a onclick="popuprnp3x();return false;" href="#" title="kwixo3x">';
1223  } elseif($tab_paiement['technical_code'] == 'kwixo') {
1224  $payment_complement_informations .= '<a onclick="popuprnp1xrnp();return false;" href="#" title="kwixo1x">';
1225  }
1226  if(file_exists($GLOBALS['dirroot'].'/modules/fianet/images/' . $tab_paiement['technical_code'] .'_mini.png')) {
1227  $payment_complement_informations .= '
1228  <img src="'.$GLOBALS['wwwroot'].'/modules/fianet/images/' . $tab_paiement['technical_code'] .'_mini.png" alt="'.String::str_form_value($tab_paiement['nom_' . $_SESSION['session_langue']]).'" />
1229 ';
1230  }
1231  $payment_complement_informations .= $GLOBALS['STR_MORE_DETAILS'] . '</a></td>';
1232  }
1233  $tpl = $GLOBALS['tplEngine']->createTemplate('payment_select.tpl');
1234  $tpl->assign('technical_code', $tab_paiement['technical_code']);
1235  $tpl->assign('nom', ($show_site_info_if_needed?get_site_info($tab_paiement):'') . $tab_paiement['nom_' . $_SESSION['session_langue']]);
1236  $tpl->assign('issel', (vb($selected_payment_technical_code) == $tab_paiement['technical_code'] || $results_count == 1));
1237  if ($tab_paiement['tarif'] != 0) {
1238  $tpl->assign('fprix_tarif', fprix($tab_paiement['tarif'], true));
1239  }
1240  if ($tab_paiement['tarif_percent'] != 0) {
1241  $tpl->assign('tarif_percent', $tab_paiement['tarif_percent']);
1242  }
1243  $tpl->assign('isempty_moneybookers_payment_methods', empty($_SESSION['session_commande']['moneybookers_payment_methods']));
1244  $tpl->assign('moneybookers_payment_methods', vb($_SESSION['session_commande']['moneybookers_payment_methods']));
1245  $tpl->assign('isempty_email_moneybookers', empty($GLOBALS['site_parameters']['email_moneybookers']));
1246  if (!empty($payment_complement_informations)) {
1247  $tpl->assign('payment_complement_informations', $payment_complement_informations);
1248  }
1249  $tpl->assign('STR_BEFORE_TWO_POINTS', $GLOBALS['STR_BEFORE_TWO_POINTS']);
1250  $tpl->assign('STR_TRANSFER', $GLOBALS['STR_TRANSFER']);
1251  $output .= $tpl->fetch();
1252  }
1253  }
1254  return $output;
1255 }
1256 
1257 
1275 function get_javascript_output($async = false, $minify = false, $output_only_script_loading = false, $js_filenames_array = array('js_files', 'js_files_pageonly', 'js_files_nominify', 'js_files_noasync', 'js_files_nominify_noasync'))
1276 {
1277  static $already_loaded = false;
1278  if($already_loaded) {
1279  // Si on affiche du javascript en haut de page, et qu'il y a quand même des scripts pour le bas de page, on ne minify pas le bas de page
1280  $minify = false;
1281  }
1282  $already_loaded = true;
1283  $js_content = '';
1284  $output = '';
1285  if(!empty($GLOBALS['site_parameters']['load_site_specific_js_files'])) {
1286  if(!empty($GLOBALS['js_files'])) {
1287  ksort($GLOBALS['js_files']);
1288  }
1289  $GLOBALS['js_files'] = array_merge(vb($GLOBALS['js_files'], array()), $GLOBALS['site_parameters']['load_site_specific_js_files']);
1290  }
1291  if(!empty($GLOBALS['site_parameters']['load_site_specific_js_content_array'])) {
1292  $GLOBALS['js_content_array'] = array_merge(vb($GLOBALS['js_content_array'], array()), $GLOBALS['site_parameters']['load_site_specific_js_content_array']);
1293  }
1294  if(!empty($GLOBALS['site_parameters']['load_site_specific_js_ready_content_array'])) {
1295  $GLOBALS['js_ready_content_array'] = array_merge(vb($GLOBALS['js_ready_content_array'], array()), $GLOBALS['site_parameters']['load_site_specific_js_ready_content_array']);
1296  }
1297  foreach($js_filenames_array as $this_js_array_name) {
1298  if(!empty($GLOBALS[$this_js_array_name])) {
1299  ksort($GLOBALS[$this_js_array_name]);
1300  if(count($GLOBALS[$this_js_array_name])>1 && $minify && String::strpos($this_js_array_name, 'nominify') === false) {
1301  $GLOBALS[$this_js_array_name] = get_minified_src($GLOBALS[$this_js_array_name], 'js', 10800);
1302  }elseif(!empty($_GET['update']) && $_GET['update'] == 1) {
1303  foreach($GLOBALS[$this_js_array_name] as $this_key => $this_js_file) {
1304  $GLOBALS[$this_js_array_name][$this_key] = $this_js_file . (String::strpos($this_js_file, '?')!==false?'&':'?') . time();
1305  }
1306  }
1307  }
1308  }
1309  if(!empty($GLOBALS['js_ready_content_array'])) {
1310  if(!$async) {
1311  $GLOBALS['js_content_array'][] = '
1312  (function($) {
1313  $(document).ready(function() {
1314  ' . implode("\n", $GLOBALS['js_ready_content_array']) . '
1315  });
1316  })(jQuery);
1317  ';
1318  } else {
1319  // On a déjà attendu le DOM loaded avant, pas besoin de réattendre le ready (qui se produit au onload dans Firefox)
1320  $GLOBALS['js_content_array'][] = '
1321  (function($) {
1322  ' . implode("\n", $GLOBALS['js_ready_content_array']) . '
1323  })(jQuery);
1324  ';
1325  }
1326  }
1327  if(!empty($GLOBALS['js_content_array'])) {
1328  $js_content .= implode("\n", $GLOBALS['js_content_array']);
1329  }
1330  if(!$async) {
1331  $noasync_js_filenames_array = $js_filenames_array;
1332  } else {
1333  foreach($js_filenames_array as $this_key => $this_js_array_name) {
1334  if(!empty($GLOBALS[$this_js_array_name]) && String::strpos($this_js_array_name, 'noasync') !== false) {
1335  $noasync_js_filenames_array[] = $this_js_array_name;
1336  unset($js_filenames_array[$this_key]);
1337  }
1338  }
1339  }
1340  if(!empty($noasync_js_filenames_array)) {
1341  foreach($noasync_js_filenames_array as $this_js_array_name) {
1342  if(!empty($GLOBALS[$this_js_array_name])) {
1343  ksort($GLOBALS[$this_js_array_name]);
1344  foreach($GLOBALS[$this_js_array_name] as $js_href) {
1345  $output .= '<script src="' . String::str_form_value($js_href) . '"></script>
1346 ';
1347  }
1348  }
1349  if($output_only_script_loading) {
1350  $GLOBALS[$this_js_array_name] = array();
1351  }
1352  }
1353  }
1354  if(!$async) {
1355  if($output_only_script_loading) {
1356  return $output;
1357  }
1358  }
1359  if($async) {
1360  krsort($js_filenames_array);
1361  foreach($js_filenames_array as $this_js_array_name) {
1362  if(!empty($GLOBALS[$this_js_array_name])) {
1363  krsort($GLOBALS[$this_js_array_name]);
1364  foreach($GLOBALS[$this_js_array_name] as $this_filename) {
1365  // On appelle le javascript de manière récursive, si plusieurs fichiers doivent être chargés avant l'exécution du script en ligne
1366  if(String::substr($this_filename, 0, 2) == '//') {
1367  // Gestion des chemins de fichiers http/https automatiques
1368  if(strpos($GLOBALS['wwwroot'], 'https') === 0) {
1369  $this_filename = 'https:'.$this_filename;
1370  } else {
1371  $this_filename = 'http:'.$this_filename;
1372  }
1373  }
1374  $js_content = '
1375  loadScript("'.String::html_entity_decode($this_filename).'", function(){
1376  '.$js_content.'
1377  });
1378 ';
1379  }
1380  }
1381  }
1382  $js_content = '
1383  function loadScript(url,callback){
1384  var script = document.createElement("script");
1385  if(typeof document.attachEvent === "object"){
1386  // IE<=8
1387  script.onreadystatechange = function(){
1388  //once the script is loaded, run the callback
1389  if (script.readyState === "loaded" || script.readyState=="complete"){
1390  script.onreadystatechange = null;
1391  if (callback){callback()};
1392  };
1393  };
1394  } else {
1395  // All other browsers
1396  script.onload = function(){
1397  //once the script is loaded, run the callback
1398  script.onload = null;
1399  if (callback){callback()};
1400  };
1401  };
1402  script.src = url;
1403  document.getElementsByTagName("head")[0].appendChild(script);
1404  };
1405  function downloadJSAtOnload() {
1406  if(async_launched) {
1407  return false;
1408  }
1409  async_launched = true;
1410  ' . $js_content . '
1411  }
1412  // Different browsers
1413  var async_launched = false;
1414  if(document.addEventListener) document.addEventListener("DOMContentLoaded", downloadJSAtOnload, false);
1415  else if (window.addEventListener) window.addEventListener("load", downloadJSAtOnload, false);
1416  else if (window.attachEvent) window.attachEvent("onload", downloadJSAtOnload);
1417  else window.onload = downloadJSAtOnload;
1418  // Si onload trop retardé par chargement d\'un site extérieur
1419  setTimeout(downloadJSAtOnload, 10000);
1420  ';
1421  }
1422  if(!empty($js_content)) {
1423  $output .= '
1424  <script><!--//--><![CDATA[//><!--
1425  ' . $js_content . '
1426  //--><!]]></script>
1427 ';
1428  }
1429  foreach($js_filenames_array as $this_js_array_name) {
1430  $GLOBALS[$this_js_array_name] = array();
1431  }
1432  $GLOBALS['js_content_array'] = array();
1433  $GLOBALS['js_ready_content_array'] = array();
1434  return $output;
1435 }
1436 
1437 
1443 function get_datepicker_javascript($load_timepicker = false)
1444 {
1445  $datepicker_format = str_replace(array('%d','%m','%Y','%y'), array('dd','mm','yy','y'), $GLOBALS['date_format_short']);
1446  $output = '
1447  $(".datepicker").datepicker({
1448  dateFormat: "' . $datepicker_format . '",
1449  changeMonth: true,
1450  changeYear: true,
1451  yearRange: "1902:2037",
1452  beforeShow: function() {
1453  setTimeout(function(){
1454  $(".ui-datepicker").css("z-index", 9999999);
1455  }, 0);
1456  }
1457  });
1458  $(".datepicker").attr("placeholder","'.str_replace(array('d', 'm', 'y'), array(String::substr(String::strtolower($GLOBALS['strDays']), 0, 1), String::substr(String::strtolower($GLOBALS['strMonths']), 0, 1), String::substr(String::strtolower($GLOBALS['strYears']), 0, 1)), str_replace('y', 'yy', $datepicker_format)).'");
1459 ';
1460  if(!empty($_SERVER['HTTP_USER_AGENT']) && (strstr($_SERVER['HTTP_USER_AGENT'],'iPhone') || strstr($_SERVER['HTTP_USER_AGENT'],'iPod') || strstr($_SERVER['HTTP_USER_AGENT'],'iPad'))) {
1461  // Quand on rentre la date on ne veut pas avoir le clavier qui s'affiche car on se sert du datepicker
1462  $GLOBALS['js_ready_content_array'][] = '
1463  $(".datepicker").prop("readonly", true);
1464  $(".datepicker").css("background-color", "white");
1465 ';
1466  }
1467  if(!empty($load_timepicker)) {
1468  $GLOBALS['js_files'][] = $GLOBALS['wwwroot_in_admin'] . '/lib/js/jquery-ui-timepicker-addon.js';
1469  if(file_exists($GLOBALS['dirroot'] . '/lib/js/jquery-ui-timepicker-'.$_SESSION['session_langue'].'.js')) {
1470  // Configuration pour une langue donnée
1471  $GLOBALS['js_files'][] = $GLOBALS['wwwroot_in_admin'] . '/lib/js/jquery-ui-timepicker-'.$_SESSION['session_langue'].'.js';
1472  }
1473  $datepicker_time_format = str_replace(array('h','%H','%M','%S'), array("'h'",'HH','mm','ss'), $GLOBALS['time_format_long']);
1474  $GLOBALS['js_ready_content_array'][] = '
1475  load_timepicker = true;
1476  $(".datetimepicker").datetimepicker({
1477  dateFormat: "'.$datepicker_format.'",
1478  changeMonth: true,
1479  changeYear: true,
1480  showTimePicker: true,
1481  showSecond: true,
1482  timeFormat: "'.$datepicker_time_format.'",
1483  yearRange: "2012:2037"
1484  });
1485  $(".datetimepicker").attr("placeholder","'.str_replace(array('HH', 'MM', 'ss', 'd', 'm', 'y', "'"), array('00', '00', '00', String::substr(String::strtolower($GLOBALS['strDays']), 0, 1), String::substr(String::strtolower($GLOBALS['strMonths']), 0, 1), String::substr(String::strtolower($GLOBALS['strYears']), 0, 1), ""), str_replace('y', 'yy', $datepicker_format . ' ' . str_replace('mm', 'MM', $datepicker_time_format))).'");
1486 ';
1487  if(!empty($_SERVER['HTTP_USER_AGENT']) && (strstr($_SERVER['HTTP_USER_AGENT'],'iPhone') || strstr($_SERVER['HTTP_USER_AGENT'],'iPod') || strstr($_SERVER['HTTP_USER_AGENT'],'iPad'))) {
1488  // Quand on rentre la date on ne veut pas avoir le clavier qui s'affiche car on se sert du datepicker
1489  $GLOBALS['js_ready_content_array'][] = '
1490  $(".datetimepicker").prop("readonly", true);
1491  $(".datetimepicker").css("background-color", "white");
1492 ';
1493  }
1494  }
1495  return $output;
1496 }
1497 
1504 function get_css_files_to_load($minify = false)
1505 {
1506  ksort($GLOBALS['css_files']);
1507  $GLOBALS['css_files'] = array_unique($GLOBALS['css_files']);
1508  if($minify) {
1509  $GLOBALS['css_files'] = get_minified_src($GLOBALS['css_files'], 'css', 10800);
1510  ksort($GLOBALS['css_files']);
1511  } elseif(!empty($_GET['update']) && $_GET['update'] == 1) {
1512  foreach($GLOBALS['css_files'] as $this_key => $this_css_file) {
1513  $GLOBALS['css_files'][$this_key] = $this_css_file . (String::strpos($this_css_file, '?')!==false?'&':'?') . time();
1514  }
1515  }
1516  $temp = $GLOBALS['css_files'];
1517  $GLOBALS['css_files'] = array();
1518  return $temp;
1519 }
1520 
1528 function output_general_http_header($page_encoding = null, $cache_duration_in_seconds = null) {
1529  if(empty($page_encoding)) {
1530  $page_encoding = GENERAL_ENCODING;
1531  }
1532  header('Content-type: text/html; charset=' . $page_encoding);
1533  if (!empty($_SERVER['HTTP_USER_AGENT']) && strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE')!== false) {
1534  // Demande à IE de ne pas se mettre dans un mode de compatibilité => permet de bénéficier des dernières avancées de la version utilisée
1535  header('X-UA-Compatible: IE=edge,chrome=1');
1536  }
1537  if(!empty($cache_duration_in_seconds)) {
1538  header('Pragma: public');
1539  header('Cache-Control: public, max-age=' . $cache_duration_in_seconds . ', must-revalidate');
1540  }
1541 }
1542 
1551 function redirect_and_die($url, $permanent_redirection = false, $avoid_loop = false)
1552 {
1553  if($avoid_loop && empty($_POST) && $url == get_current_url(true, false)) {
1554  return false;
1555  }
1556  header("Location: " . $url);
1557  if ($permanent_redirection) {
1558  header(String::substr(vb($_SERVER['SERVER_PROTOCOL'], 'HTTP/1.0'), 0 , 10) . " 301 Moved Permanently");
1559  }
1560  header('Connection: close');
1561  die();
1562 }
1563 
1575 function necessite_priv($priv, $demo_allowed = true, $configuration_modification = false)
1576 {
1577  if (!a_priv($priv, $demo_allowed, $configuration_modification)) {
1578  if(String::strpos(get_current_url(true),'chart-data.php')===false){
1579  $_SESSION['session_redirect_after_login'] = get_current_url(true);
1580  }
1581  if(String::strpos($priv, 'admin') === 0 && a_priv("admin*")) {
1582  redirect_and_die($GLOBALS['administrer_url'] . '/?error=admin_rights');
1583  } elseif (est_identifie()) {
1584  redirect_and_die($GLOBALS['wwwroot'] . '/compte.php?error=admin_rights');
1585  } else {
1586  redirect_and_die($GLOBALS['wwwroot'] . '/membre.php?error=admin_rights');
1587  }
1588  }
1589 }
1590 
1597 {
1598  if (!est_identifie()) {
1599  $_SESSION['session_redirect_after_login'] = get_current_url(true);
1600  redirect_and_die($GLOBALS['wwwroot'] . '/membre.php?error=login_rights');
1601  }
1602 }
1603 
1611 function get_identified_lang($langs_array = array())
1612 {
1613  if (!empty($_GET['langue']) && String::strlen($_GET['langue']) == 2) {
1614  $return_lang = String::strtolower(trim($_GET['langue']));
1615  } elseif (empty($_SESSION['session_langue']) || empty($GLOBALS['get_lang_rewrited_wwwroot'][$_SESSION['session_langue']]) || $GLOBALS['get_lang_rewrited_wwwroot'][$_SESSION['session_langue']] != $GLOBALS['detected_wwwroot']) {
1616  // Au cas où on doit définir la langue à partir de l'URL, donc si on n'est pas dans une logique de langue par repértoire
1617  // mais de langue par domaine ou sous-domaine, on prend la première trouvée (celle qui a la variable "position" la plus faible)
1618  // NB : On veut pouvoir détecter des URL du type http://xxxxx.en.domain.com pour des sous-domaines
1619  foreach ($langs_array as $this_lang) {
1620  if ((!empty($GLOBALS['get_lang_rewrited_wwwroot'][$this_lang]) && $GLOBALS['get_lang_rewrited_wwwroot'][$this_lang] == $GLOBALS['detected_wwwroot']) || (!empty($GLOBALS['get_lang_rewrited_wwwroot']) && !in_array($GLOBALS['detected_wwwroot'], $GLOBALS['get_lang_rewrited_wwwroot']) && substr_count(str_replace(array('http://', 'https://', 'www.'), '', $GLOBALS['detected_wwwroot']), '.') <= 1 + substr_count(str_replace(array('http://', 'https://', 'www.'), '', $GLOBALS['get_lang_rewrited_wwwroot'][$this_lang]), '.') && strpos(str_replace(array('http://', 'https://', 'www.'), '', $GLOBALS['detected_wwwroot']), str_replace(array('http://', 'https://', 'www.'), '', $GLOBALS['get_lang_rewrited_wwwroot'][$this_lang])) !== false)) {
1621  $return_lang = $this_lang;
1622  break;
1623  }
1624  }
1625  }
1626  if (empty($return_lang) && !empty($_SESSION['session_langue'])) {
1627  // On n'a pas trouvé la langue par défaut proposée (fr) ou on n'a pas trouvé une et une seule langue qui corresponde à l'URL => on force la langue à partir de l'URL
1628  // La langue de session est applicable dans tous les autres cas
1629  $return_lang = $_SESSION['session_langue'];
1630  } elseif (empty($return_lang) && !empty($langs_array)) {
1631  // Par défaut on prend la langue du navigateur
1632  $temp = explode(',', vb($_SERVER['HTTP_ACCEPT_LANGUAGE']));
1633  $return_lang = String::strtolower(String::substr(trim($temp[0]), 0, 2));
1634  if(!in_array($return_lang, $langs_array)) {
1635  // A défaut on prend l'anglais
1636  $return_lang = 'en';
1637  }
1638  if(!in_array($return_lang, $langs_array)) {
1639  // Si on ne trouve aucune langue, on prendra la première langue du site trouvée par défaut
1640  $return_lang = $langs_array[0];
1641  }
1642  } elseif (empty($return_lang)) {
1643  // Aucune langue configurée : on force l'anglais pour éviter langue vide
1644  $return_lang = 'en';
1645  }
1646  $return_lang = check_language($return_lang, $langs_array);
1647  return String::substr($return_lang, 0, 2);
1648 }
1649 
1657 function check_language($this_lang, $langs_array)
1658 {
1659  if (!in_array($this_lang, $langs_array) || empty($GLOBALS['lang_etat'][$this_lang]) || !file_exists($GLOBALS['dirroot'] . "/lib/lang/" . $this_lang . ".php")) {
1660  // The language asked in the URL is not available
1661  // We redirect to the equivalent page in the default language
1662  foreach ($langs_array as $this_new_lang) {
1663  if ($this_new_lang != $this_lang && !empty($GLOBALS['lang_etat'][$this_new_lang]) && get_current_url() != get_current_url_in_other_language($this_new_lang)) {
1665  }
1666  }
1667  // No redirection already done => there was a problem in lang detection => we force a correct language
1668  $this_lang = current($langs_array);
1669  }
1670  return $this_lang;
1671 }
1672 
1681 {
1682  $this_url_lang = $_SERVER['REQUEST_URI'];
1683  if (!empty($_GET['langue'])) {
1684  $original_lang = $_GET['langue'];
1685  $this_url_lang = str_replace(array('&langue=' . $_GET['langue'], '?langue=' . $_GET['langue'].'&', '?langue=' . $_GET['langue'], 'langue=' . $_GET['langue']), array('', '?', '', ''), $this_url_lang);
1686  } elseif (!empty($_SESSION['session_langue'])) {
1687  $original_lang = $_SESSION['session_langue'];
1688  } else {
1689  $original_lang = $this_lang;
1690  }
1691 
1692  $original_lang = strtolower($original_lang);
1693 
1694  if (!check_if_module_active('url_rewriting') || (!empty($GLOBALS['get_lang_rewrited_wwwroot'][$this_lang]) && !empty($GLOBALS['langs_array_by_wwwroot'][$GLOBALS['get_lang_rewrited_wwwroot'][$this_lang]]) && count($GLOBALS['langs_array_by_wwwroot'][$GLOBALS['get_lang_rewrited_wwwroot'][$this_lang]]) > 1)) {
1695  // Comme le chemin pour une page dans cette langue n'est pas spécifique, alors on doit préciser la langue quand on veut changer de page
1696  // Il ne faut pas compter les GET pour savoir si on rajoute ? ou &, car les GET peuvent venir du décodage de l'URL Rewriting => il faut regarder uniquement REQUEST_URI
1697  if (String::strpos($this_url_lang, '?') === false) {
1698  $this_url_lang .= '?';
1699  } else {
1700  $this_url_lang .= '&';
1701  }
1702  $this_url_lang .= 'langue=' . $this_lang;
1703  }
1704  if (defined('IN_404_ERROR_PAGE')) {
1705  // Si on est sur une URL qui n'existe pas, il ne faut pas créer de liens dans d'autres langues vers cette URL
1706  $this_url_lang = '/';
1707  }
1708  if (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') {
1709  $this_url_lang = 'https://' . $_SERVER['HTTP_HOST'] . $this_url_lang;
1710  } else {
1711  $this_url_lang = 'http://' . $_SERVER['HTTP_HOST'] . $this_url_lang;
1712  }
1713  $this_url_lang = str_replace($GLOBALS['wwwroot'], $GLOBALS['wwwroot_main'], $this_url_lang);
1714  if (!empty($GLOBALS['get_lang_rewrited_wwwroot'][$original_lang])) {
1715  $this_url_lang = str_replace($GLOBALS['get_lang_rewrited_wwwroot'][$original_lang], $GLOBALS['wwwroot_main'], $this_url_lang);
1716  } else {
1717  $this_url_lang = str_replace($GLOBALS['wwwroot_main'] . '/' . $original_lang, $GLOBALS['wwwroot_main'], $this_url_lang);
1718  }
1719  if (defined('USER_SUBDOMAIN') && $GLOBALS['detected_wwwroot'] != $GLOBALS['wwwroot']) {
1720  // URL du type http://xxxx.domain.com/x.html => on veut retiter les xxx et les remettre après
1721  $subdomain_array = explode('.', $_SERVER['HTTP_HOST']);
1722  $subdomain = $subdomain_array[0];
1723  $this_url_lang = str_replace(array('http://' . $_SERVER['HTTP_HOST'], 'https://' . $_SERVER['HTTP_HOST']), $GLOBALS['wwwroot_main'], $this_url_lang);
1724  }
1725  if (!empty($GLOBALS['get_lang_rewrited_wwwroot'][$this_lang])) {
1726  $this_url_lang = str_replace($GLOBALS['wwwroot_main'], $GLOBALS['get_lang_rewrited_wwwroot'][$this_lang], $this_url_lang);
1727  }
1728  if (!empty($subdomain) && $subdomain != 'www' && $subdomain != $original_lang) {
1729  // On remet le sous-domaine si nécessaire
1730  $this_url_lang = str_replace(array('://', 'www.'), array('://' . $subdomain . '.', ''), $this_url_lang);
1731  }
1732  return $this_url_lang;
1733 }
1734 
1743 function get_current_url($with_get = true, $get_short_url = false, $take_away_get_args_array = null)
1744 {
1745  if(defined('IN_CRON')) {
1746  // get_current_url ne doit pas être utilisée dans un cron, aucune URL n'appelle la page dans ce cas.
1747  return null;
1748  }
1749  $url = '';
1750  if (!$get_short_url) {
1751  if (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') {
1752  $url .= 'https://';
1753  } else {
1754  $url .= 'http://';
1755  }
1756  $url .= $_SERVER['HTTP_HOST'];
1757  }
1758  $url .= $_SERVER['REQUEST_URI'];
1759  if (!$with_get && String::strpos($url, '?') !== false) {
1761  } elseif(!empty($take_away_get_args_array)) {
1762  // On évite par exemple les problèmes de parenthèses encodées par PHP mais pas par apache
1763  $entities = array('%21', '%2A', '%27', '%28', '%29', '%3B', '%3A', '%40', '%26', '%3D', '%2B', '%24', '%2C', '%2F', '%3F', '%25', '%23', '%5B', '%5D');
1764  $replacements = array('!', '*', "'", "(", ")", ";", ":", "@", "&", "=", "+", "$", ",", "/", "?", "%", "#", "[", "]");
1765  foreach($take_away_get_args_array as $key) {
1766  if (!empty($_GET[$key])) {
1767  $this_value = $_GET[$key];
1768  if(is_array($this_value)) {
1769  continue;
1770  }
1771  $url = str_replace(array(urlencode($key).'='.urlencode($this_value), urlencode($key).'='.str_replace($entities, $replacements, urlencode($this_value)), $key.'='.$this_value), '', $url);
1772  $url = str_replace(array('?&', '&&'), array('?','&'), $url);
1773  }
1774  }
1775  if (String::substr($url, - 1) == '?' || String::substr($url, - 1) == '&') {
1777  }
1778  }
1779  return $url;
1780 }
1781 
1782 
1789 {
1790  static $uri_array;
1791  $params = $_GET;
1792  $cache_key = md5(serialize($params));
1793  if (empty($uri_array[$cache_key])) {
1794  $queryString = array();
1795  $uri = get_current_url(false);
1796  $excluded_get[] = 'page';
1797  $excluded_get[] = 'multipage';
1798  $excluded_get[] = 'nombre';
1799  $excluded_get[] = 'update';
1800  if(!empty($params['type']) && $params['type']=='error404') {
1801  $excluded_get[] = 'type';
1802  }
1803  if (check_if_module_active('url_rewriting')) {
1804  // Si le module d'URL Rewriting est activé, ces données GET sont déjà comprises dans les URL
1805  // et doivent donc être exclues ici
1806  if (strpos($_SERVER['PHP_SELF'], 'lire/index.php') !== false) {
1807  $excluded_get[] = 'rubid';
1808  } elseif (strpos($_SERVER['PHP_SELF'], 'lire/article_details.php') !== false) {
1809  $excluded_get[] = 'id';
1810  $excluded_get[] = 'rubid';
1811  } elseif (strpos($_SERVER['PHP_SELF'], 'achat/index.php') !== false) {
1812  $excluded_get[] = 'catid';
1813  } elseif (strpos($_SERVER['PHP_SELF'], 'achat/produit_details.php') !== false) {
1814  $excluded_get[] = 'id';
1815  $excluded_get[] = 'catid';
1816  }
1817  if (check_if_module_active('annonces') && !empty($_GET['catid']) && defined('IN_CATALOGUE_ANNONCE')) {
1818  // Page de catégorie d'annonces
1819  $excluded_get[] = 'catid';
1820  $uri = str_replace('-' . String::rawurlencode(vn($_GET['page'])) . '-' . String::rawurlencode(vn($_GET['catid'])) . '.html', '-[PAGE]-' . String::rawurlencode(vn($_GET['catid'])) . '.html', $uri);
1821  } elseif (check_if_module_active('vitrine') && get_current_url(false, true) == '/' . vn($_GET['page']) . '.html') {
1822  // Page de boutique
1823  $uri = str_replace('/' . String::rawurlencode(vn($_GET['page'])) . '.html', '/[PAGE]' . '.html', $uri);
1824  } elseif (check_if_module_active('vitrine') && get_current_url(false, true) == '/') {
1825  // Page de boutique : accueil
1826  $uri .= '[PAGE].html';
1827  } elseif (check_if_module_active('vitrine') && String::rawurldecode(get_current_url(false, true)) == String::rawurldecode('/' . $GLOBALS['STR_MODULE_ANNONCES_URL_BUY'] . '/' . $GLOBALS['STR_MODULE_ANNONCES_URL_LIST_SHOWCASE'] . '-' . String::rawurlencode(vn($_GET['page'])) . '.html')) {
1828  // Page de liste des vitrines
1829  $uri = str_replace('-' . String::rawurlencode(vn($_GET['page'])) . '.html', '-[PAGE].html', $uri);
1830  } elseif (check_if_module_active('vitrine') && strpos(get_current_url(false, true), '/'.$GLOBALS['STR_MODULE_ANNONCES_URL_VITRINE'].'-')===0) {
1831  // Page de boutique non verified
1832  $excluded_get[] = 'bt';
1833  $uri = str_replace('/'.$GLOBALS['STR_MODULE_ANNONCES_URL_VITRINE'].'-'.String::rawurlencode(vn($_GET['page'])), '/'.$GLOBALS['STR_MODULE_ANNONCES_URL_VITRINE'].'', $uri);
1834  // On fait le remplacement en deux étapes pour bien capter les URL STR_MODULE_ANNONCES_URL_VITRINE-... et STR_MODULE_ANNONCES_URL_VITRINE tout court
1835  $uri = str_replace('/'.$GLOBALS['STR_MODULE_ANNONCES_URL_VITRINE'], '/'.$GLOBALS['STR_MODULE_ANNONCES_URL_VITRINE'].'-[PAGE]', $uri);
1836  } elseif (check_if_module_active('vitrine') && strpos(get_current_url(false, true), '/'.$GLOBALS['STR_MODULE_ANNONCES_URL_VITRINE'].'-'.String::rawurlencode(vn($_GET['page'])) . '-')===0) {
1837  // Page de boutique non verified
1838  $excluded_get[] = 'bt';
1839  $uri = str_replace('/'.$GLOBALS['STR_MODULE_ANNONCES_URL_VITRINE'].'-'.String::rawurlencode(vn($_GET['page'])), '/'.$GLOBALS['STR_MODULE_ANNONCES_URL_VITRINE'].'-[PAGE]', $uri);
1840  } elseif (String::rawurldecode(get_current_url(false, true)) == String::rawurldecode('/produits/' . String::rawurlencode(vb($_GET['search'])) . '.html')) {
1841  $excluded_get[] = 'search';
1842  $uri = str_replace('.html', '-[PAGE].html', $uri);
1843  } elseif (String::rawurldecode(get_current_url(false, true)) == String::rawurldecode('/produits/' . String::rawurlencode(vb($_GET['search'])) . '-' . String::rawurlencode(vn($_GET['page'])) . '.html')) {
1844  $excluded_get[] = 'search';
1845  $uri = str_replace('-' . String::rawurlencode(vn($_GET['page'])) . '.html', '-[PAGE].html', $uri);
1846  } elseif (check_if_module_active('annonces') && !empty($_GET['country']) && strpos(get_current_url(false, true),'-' . String::rawurlencode(vb($_GET['country'])) . '.html') !== false) {
1847  // Page de liste des vitrines
1848  $excluded_get[] = 'country';
1849  }
1850  if (check_if_module_active('annonces')) {
1851  foreach(array('/' . $GLOBALS['STR_MODULE_ANNONCES_URL_BUY'] . '/'.$GLOBALS['STR_MODULE_PREMIUM_URL_ADS_BY_KEYWORD'].'-', '/kopen/supplier-research-', '/kaufen/supplier-research-', '/buy/supplier-research-', '/buy/supplier-research-', '/acheter/recherche-fournisseur-', '/comprar/busqueda-proveedor-') as $this_url_rewriting_main_expression) {
1852  if( String::rawurldecode(get_current_url(false, true)) == String::rawurldecode($this_url_rewriting_main_expression . String::rawurlencode(vn($_GET['page'])) . '-' . String::rawurlencode(vb($_GET['search'])) . '.html')
1853  || String::rawurldecode(get_current_url(false, true)) == String::rawurldecode($this_url_rewriting_main_expression . String::rawurlencode(vn($_GET['page'])) . '-' . String::rawurlencode(urlencode(vb($_GET['search']))) . '.html')) {
1854  $excluded_get[] = 'search';
1855  // Si l'URL contient un +, pas encodé ou encodé en %2B, il faut le gérer quoiqu'il arrive => on a deux possibilités dans le str_replace
1856  // La troisième est là pour couvrir des URL du type : /acheter/recherche-fournisseur-54-pc+.html?search=pc+
1857  // Rappel : dans une URL réécrite, la partie en dehors du GET est gérée du type String::rawurlencode (et + vaut normalement %2B), et la partie GET est gérée par urlencode (et espace vaut +)
1858  $uri = str_replace($this_url_rewriting_main_expression, '/' . $GLOBALS['STR_MODULE_ANNONCES_URL_BUY'] . '/'.$GLOBALS['STR_MODULE_PREMIUM_URL_ADS_BY_KEYWORD'].'-', str_replace(array('-' . String::rawurlencode(vn($_GET['page'])) . '-' . String::rawurlencode(vb($_GET['search'])) . '.html', '-' . vn($_GET['page']) . '-' . vb($_GET['search']) . '.html', '-' . vn($_GET['page']) . '-' . urlencode(vb($_GET['search'])) . '.html'), '-[PAGE]-' . String::rawurlencode(vb($_GET['search'])) . '.html', $uri));
1859  break;
1860  }
1861  }
1862  }
1863  // Compatibilité anciennes URL
1864  $excluded_get[] = 'subdomain';
1865  $excluded_get[] = 'pageNum_rs1';
1866  }
1867  foreach ($params as $key => $value) {
1868  if (!in_array($key, $excluded_get) && (!empty($value) || $value==='0')) {
1869  if(is_array($value)){
1870  foreach($value as $this_key => $this_value){
1871  $queryString[] = $key . '[' . $this_key . ']=' . urlencode($this_value);
1872  }
1873  }else{
1874  $queryString[] = $key . '=' . urlencode($value);
1875  }
1876  }
1877  }
1878  if (count($queryString) > 0) {
1879  $uri .= '?' . implode('&', $queryString);
1880  }
1881  $uri_array[$cache_key] = $uri;
1882  }
1883  return $uri_array[$cache_key];
1884 }
1885 
1893 {
1894  $sql = 'SELECT nom_' . $_SESSION['session_langue'] . '
1895  FROM peel_tailles
1896  WHERE id ="' . intval($size_id) . '" AND ' . get_filter_site_cond('tailles');
1897  $query = query($sql);
1898 
1899  if ($size = fetch_assoc($query)) {
1900  $return = $size['nom_' . $_SESSION['session_langue']];
1901  } else {
1902  $return = "";
1903  }
1904 
1905  return $return;
1906 }
1907 
1914 function get_color_name($color_id)
1915 {
1916  $sql = "SELECT c.*
1917  FROM peel_couleurs c
1918  WHERE c.id = '" . intval(vn($color_id)) . "' AND " . get_filter_site_cond('couleurs', 'c');
1919  $query = query($sql);
1920 
1921  if ($this_color = fetch_assoc($query)) {
1922  $couleur = $this_color['nom_' . $_SESSION['session_langue']];
1923  } else {
1924  $couleur = "";
1925  }
1926  return $couleur;
1927 }
1928 
1941 function set_lang_configuration_and_texts($lang, $load_default_lang_files_before_main_lang_array = null, $general_setup = true, $load_modules_files = true, $load_general_admin_files = true, $exclude_empty_string = true, $skip_load_files = false)
1942 {
1943  if (empty($lang) && !empty($GLOBALS['lang_codes'])) {
1944  // pas de langue passé en paramètre. Il faut récupérer la langue principal du site. $GLOBALS['lang_codes'] est rempli selon les contraintes du site en cours, et dans le bon ordre. On peut prendre le premier éléments de ce tableau.
1945  $lang = $GLOBALS['lang_codes'][0];
1946  }
1947  if($general_setup) {
1948  // On redéfinit wwwroot proprement à partir du wwwroot théorique et des règles d'URL rewriting.
1949  $GLOBALS['wwwroot'] = get_lang_rewrited_wwwroot($lang);
1950  if(!empty($GLOBALS['site_parameters']['avoid_lang_folders_in_minified_css']) && !empty($GLOBALS['lang_url_rewriting'][$_SESSION['session_langue']]) && strpos($GLOBALS['lang_url_rewriting'][$_SESSION['session_langue']], '//') === false && strpos($GLOBALS['lang_url_rewriting'][$_SESSION['session_langue']], '.') === false) {
1951  // Si on veut dans le minify avoir des liens vers les fichiers sans les dossiers de langue
1952  $GLOBALS['apparent_folder'] = $GLOBALS['apparent_folder_main'] . $GLOBALS['lang_url_rewriting'][$_SESSION['session_langue']];
1953  }
1954  // Maintenant que wwwroot est paramétré définitivement, on peut définir les derniers répertoires
1955  if (!empty($GLOBALS['site_parameters']['admin_force_ssl']) || (defined('IN_PEEL_ADMIN') && (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off'))) {
1956  // L'administrateur consulte la page en https dans l'administration => Les liens dans la page doivent être en https également.
1957  $GLOBALS['wwwroot_in_admin'] = str_replace('http://', 'https://', $GLOBALS['wwwroot']);
1958  } else {
1959  $GLOBALS['wwwroot_in_admin'] = $GLOBALS['wwwroot'];
1960  }
1961  $GLOBALS['administrer_url'] = $GLOBALS['wwwroot_in_admin'] . "/" . vb($GLOBALS['site_parameters']['backoffice_directory_name']);
1962  // Attention : $GLOBALS['repertoire_modele'] est avec dirroot et non pas wwwroot, n'est pas forcément encore défini quand on passe ici, il ne faut donc pas l'utiliser
1963  $GLOBALS['repertoire_css'] = get_wwwroot_cdn('repertoire_css') . "/modeles/" . vb($GLOBALS['site_parameters']['template_directory']) . "/css";
1964  $GLOBALS['repertoire_images'] = get_wwwroot_cdn('repertoire_images') . "/modeles/" . vb($GLOBALS['site_parameters']['template_directory']) . "/images";
1965  $GLOBALS['repertoire_upload'] = get_wwwroot_cdn('repertoire_upload') . "/upload";
1966  $GLOBALS['repertoire_mp3'] = get_wwwroot_cdn('repertoire_mp3') . "/mp3";
1967  $GLOBALS['repertoire_mp3_extrait'] = get_wwwroot_cdn('repertoire_mp3_extrait') . "/mp3_extrait";
1968  // Paramétrage des formats de date pour les fonctions strftime()
1969  $main_langs = array('en' => 'en_US', 'fr' => 'fr_FR', 'de' => 'de_DE', 'es' => 'es_ES', 'it' => 'it_IT', 'pt' => 'pt_PT', 'ar' => 'ar_SA', 'el' => 'el', 'fi' => 'fi',
1970  'hu' => 'hu', 'bg' => 'bg', 'zh' => 'zh_cn', 'no' => 'no_no');
1971  if (empty($main_langs[$lang])) {
1972  $main_langs[$lang] = String::strtolower($lang) . '_' . String::strtoupper($lang);
1973  }
1974  // Gestion de setlocale sous windows : pour gérer les langues sous windows il faut mettre la langue sous format 3 lettres ou l'écrire en anglais
1975  // Voir http://www.w3schools.com/vbscript/func_setlocale.asp
1976  // lang_TERRITORY.codeset
1977  // - language is an ISO 639 language code
1978  // - territory is an ISO 3166 country code
1979  // - codeset is a character set or encoding identifier like ISO-8859-1 or UTF-8
1980  $variations_langs = array('en' => 'english', 'fr' => 'french', 'de' => 'german', 'es' => 'spanish', 'pt' => 'portuguese', 'it' => 'italian', 'zh' => 'chinese-simplified',
1981  'ja' => 'japanese', 'ru' => 'russian', 'nl' => 'dutch');
1982  $variations_langs2 = array('zh' => 'chi');
1983  setlocale(LC_TIME, $main_langs[$lang] . '.UTF8', String::strtolower($lang) . '.UTF8', vb($variations_langs[$lang], String::strtolower($lang)) . '.utf8', vb($variations_langs2[$lang], String::strtolower($lang)) . '.utf8', $main_langs[$lang], String::strtolower($lang), vb($variations_langs[$lang], String::strtolower($lang)), vb($variations_langs2[$lang], String::strtolower($lang)));
1984  // Déclaration du nom de la boutique
1985  $GLOBALS['site'] = vb($GLOBALS['site_parameters']['nom_' . $lang]);
1986  if (empty($GLOBALS['site'])) {
1987  $GLOBALS['site'] = $GLOBALS['wwwroot'];
1988  }
1989  }
1990  if(!$skip_load_files) {
1991  if(!empty($load_default_lang_files_before_main_lang_array)){
1992  $successive_loads = $load_default_lang_files_before_main_lang_array;
1993  }
1994  $successive_loads[] = $lang;
1995  foreach(array_unique($successive_loads) as $this_lang) {
1996  if($exclude_empty_string && count($successive_loads)>1 && $this_lang != $successive_loads[0]){
1997  foreach($GLOBALS as $this_global => $this_value) {
1998  // On ne copie pas GLOBALS simplement car sinon ça fait une copie par référence. Or on veut les valeurs et surtout pas les références
1999  if($this_value !== '' && substr($this_global, 0, 4) == 'STR_') {
2000  // On récupère les variables de langue non vides
2001  $temp_globals[$this_global] = $this_value;
2002  }
2003  }
2004  }
2005  if($general_setup) {
2006  if(file_exists($GLOBALS['dirroot'] . "/lib/lang/datetime_" . $this_lang . ".php")) {
2007  include($GLOBALS['dirroot'] . "/lib/lang/datetime_" . $this_lang . ".php");
2008  }
2009  if(file_exists($GLOBALS['dirroot'] . "/lib/lang/" . $this_lang . ".php")) {
2010  include($GLOBALS['dirroot'] . "/lib/lang/" . $this_lang . ".php");
2011  }
2012  if(file_exists($GLOBALS['dirroot'] . "/lib/lang/meta_" . $this_lang . ".php")) {
2013  include($GLOBALS['dirroot'] . "/lib/lang/meta_" . $this_lang . ".php");
2014  }
2015  }
2016  if($load_general_admin_files) {
2017  if(file_exists($GLOBALS['dirroot'] . "/lib/lang/admin_" . $this_lang . ".php")) {
2018  include($GLOBALS['dirroot'] . "/lib/lang/admin_" . $this_lang . ".php");
2019  }
2020  }
2021  if(IN_INSTALLATION || !empty($GLOBALS['installation_folder_active'])) {
2022  include($GLOBALS['dirroot'] . "/lib/lang/admin_install_" . $this_lang . ".php");
2023  }
2024  if($load_modules_files && !empty($GLOBALS['modules_lang_folders_to_load_array'])){
2025  // Les variables de langue dans les modules sont plus prioritaires que celles de lib/lang/
2026  // => la surcharge des valeurs STR_XXX par défaut est possible
2027  $default_lang_if_file_not_found = 'en';
2028  ksort($GLOBALS['modules_lang_folders_to_load_array']);
2029  foreach($GLOBALS['modules_lang_folders_to_load_array'] as $this_directory) {
2030  if(String::strpos($this_directory, $GLOBALS['dirroot']) === false) {
2031  $this_directory = $GLOBALS['dirroot'] . $this_directory;
2032  }
2033  if(file_exists($this_directory . $this_lang . ".php")) {
2034  include($this_directory . $this_lang . ".php");
2035  } elseif(file_exists($this_directory . $default_lang_if_file_not_found . ".php")) {
2036  include($this_directory . $default_lang_if_file_not_found . ".php");
2037  }
2038  }
2039  }
2040  if($exclude_empty_string && count($successive_loads)>1 && $this_lang != $successive_loads[0]) {
2041  foreach($GLOBALS as $this_global => $this_value) {
2042  // Le test ci-dessous doit être très rapide, car on a plus de mille passages ici à chaque fois
2043  // Rappel : si un test renvoie false, la suite && ... n'est pas exécuté => commencer tests par le plus discrimant et le plus rapide
2044  if($this_value === '' && substr($this_global, 0, 4) == 'STR_' && !empty($temp_globals[$this_global]) && $this_global != 'STR_BEFORE_TWO_POINTS') {
2045  // On récupère les variables de langue non vides
2046  $GLOBALS[$this_global] = $temp_globals[$this_global];
2047  }
2048  }
2049  }
2050  // Chargement des variables de langue venant de la BDD
2051  // On charge d'abord les variables de langue s'appliquant à toutes les langues (lang='') puis celles spécifiques à la langue donnée
2052  if ($general_setup && !IN_INSTALLATION && empty($GLOBALS['installation_folder_active'])) {
2053  load_site_parameters($this_lang, true);
2054  }
2055  }
2056  foreach($GLOBALS as $this_global => $this_value) {
2057  if(substr($this_global, 0, 4) == 'STR_') {
2058  if(strpos($this_global, '_URL_') === false) {
2059  $this_config = 'replace_words_in_lang_files';
2060  } else {
2061  $this_config = 'replace_url_words_in_lang_files';
2062  }
2063  if(!empty($GLOBALS['site_parameters'][$this_config]) && is_array($GLOBALS['site_parameters'][$this_config])) {
2064  // Remplacement de mots clés par des versions personnalisées pour le site
2065  foreach($GLOBALS['site_parameters'][$this_config] as $replaced=>$new) {
2066  if(strpos($this_value, $replaced) !== false) {
2067  $GLOBALS['before_replace_words_in_lang_files'][$this_global] = $this_value;
2068  $this_value = str_replace($replaced, $new, $this_value);
2069  $this_value = str_replace('/'.$new, '/'.$replaced, $this_value);
2070  $GLOBALS[$this_global] = $this_value;
2071  }
2072  }
2073  }
2074  // Préparation d'un tableau de variables de langue pour Smarty => facilite intégrations graphiques de pouvoir intégrer facilement les textes directement
2075  $GLOBALS['LANG'][$this_global] = $this_value;
2076  }
2077  }
2078  // Gestion des ids correspondant à contact commercial et autres
2079  // A modifier manuellement suivant configuration du site - Par défaut: choix 5 et 7
2080  $i = 0;
2081  while (isset($GLOBALS['STR_USER_ORIGIN_OPTIONS_' . ($i+1)])) {
2082  $i++;
2083  }
2084  $GLOBALS['origin_other_ids'] = array($i - 2, $i);
2085  if(!isset($GLOBALS['site_parameters']['user_mandatory_fields'])) {
2086  $GLOBALS['site_parameters']['user_mandatory_fields'] = array(
2087  'prenom' => 'STR_ERR_FIRSTNAME',
2088  'nom_famille' => 'STR_ERR_NAME',
2089  'adresse' => 'STR_ERR_ADDRESS',
2090  'code_postal' => 'STR_ERR_ZIP',
2091  'ville' => 'STR_ERR_TOWN',
2092  'pays' => 'STR_ERR_COUNTRY',
2093  'telephone' => 'STR_ERR_TEL',
2094  'email' => 'STR_ERR_EMAIL',
2095  'pseudo' => 'STR_ERR_PSEUDO',
2096  'token' => 'STR_INVALID_TOKEN');
2097  if(check_if_module_active('annonces')) {
2098  if(vb($GLOBALS['site_parameters']['type_affichage_user_favorite_id_categories']) == 'checkbox') {
2099  $GLOBALS['site_parameters']['user_mandatory_fields']['id_categories'] = 'STR_ERR_FIRST_CHOICE';
2100  } elseif (vb($GLOBALS['site_parameters']['type_affichage_user_favorite_id_categories']) == 'select') {
2101  $GLOBALS['site_parameters']['user_mandatory_fields']['id_cat_1'] = 'STR_ERR_FIRST_CHOICE';
2102  }
2103  $GLOBALS['site_parameters']['user_mandatory_fields']['cgv_confirm'] = 'STR_ERR_CGV';
2104  $GLOBALS['site_parameters']['user_mandatory_fields']['mot_passe_confirm'] = 'STR_ERR_PASS_CONFIRM';
2105  }
2106  if(!empty($GLOBALS['site_parameters']['add_b2b_form_inputs'])) {
2107  $GLOBALS['site_parameters']['user_mandatory_fields']['societe'] = 'STR_ERR_SOCIETY';
2108  $GLOBALS['site_parameters']['user_mandatory_fields']['type'] = 'STR_ERR_YOU_ARE';
2109  $GLOBALS['site_parameters']['user_mandatory_fields']['activity'] = 'STR_ERR_ACTIVITY';
2110  $GLOBALS['site_parameters']['user_mandatory_fields']['siret'] = 'STR_ERR_SIREN';
2111  }
2112  }
2113  if (preg_match('/msie 6./i', $_SERVER['HTTP_USER_AGENT']) || preg_match('/msie 7./i', $_SERVER['HTTP_USER_AGENT']) || preg_match('/msie 8./i', $_SERVER['HTTP_USER_AGENT'])) {
2114  // NB : Fineuploader est désactivé pour IE <=8
2115  $GLOBALS['site_parameters']['used_uploader'] = 'html';
2116  }
2117  if (preg_match('/msie 6./i', $_SERVER['HTTP_USER_AGENT']) || preg_match('/msie 7./i', $_SERVER['HTTP_USER_AGENT'])) {
2118  // NB : aucun support de IE6 ou 7, mais ça permet tout de même d'accéder à la homepage de l'administration sans bug javascript
2119  $GLOBALS['site_parameters']['chart_product'] = 'flash';
2120  }
2121  }
2122 }
2123 
2130 function load_active_languages_list($site_id = null)
2131 {
2132  // loaded_once ne sert que pour l'installation.
2133  static $loaded_once;
2134  if (!IN_INSTALLATION && empty($GLOBALS['installation_folder_active'])) {
2135  unset($GLOBALS['lang_codes'], $GLOBALS['admin_lang_codes'], $GLOBALS['lang_flags'], $GLOBALS['lang_names'], $GLOBALS['lang_etat'], $GLOBALS['lang_url_rewriting'], $GLOBALS['load_default_lang_files_before_main_lang_array_by_lang'], $GLOBALS['get_lang_rewrited_wwwroot'], $GLOBALS['langs_array_by_wwwroot']);
2136  $select = '';
2137  if(!empty($site_id)) {
2138  // D'abord on récupère les langues actives
2139  $sql_or_array[] = get_filter_site_cond('langues');
2140  if(defined('IN_PEEL_ADMIN')) {
2141  // On récupère la liste des langues administrables (ce sera avec un OR par rapport à la condition ci-dessus des langues actives)
2142  $sql_or_array[] = get_filter_site_cond('langues', null, true);
2143  // Si une langue est sélectionnée du fait des droits sur le site administré, elle ne doit pas pour autant être autorisée en etat=1 => on recalcule la variable etat
2144  // Par ailleurs une langue qui est active sur le site en cours d'utilisation ne doit pas se retrouver dans la liste des langues administrables (du fait qu'on administre à ce moment-là un autre site)
2145  $select .= ", ".(!empty($site_id)?"IF(etat=1 AND NOT (" . get_filter_site_cond('langues') . "), -1, etat)":"etat") . " AS etat, IF(NOT (".get_filter_site_cond('langues', null, true). "), 1, 0) AS admin_disallowed";
2146  }
2147  if(empty($sql_or_array)) {
2148  $sql_or_array[] = "1";
2149  }
2150  } else {
2151  $sql_or_array[] = 1;
2152  }
2153  $sqlLng = "SELECT * ".$select."
2154  FROM peel_langues
2155  WHERE (" . implode(" OR ", $sql_or_array) . ")";
2156  if (!empty($GLOBALS['site_parameters']['restricted_languages_array'])) {
2157  // La requête va chercher toutes les langues disponibles selon la configuration en BDD. Il est possible avec restricted_languages_array de restreindre les langues retournées par la requête.
2158  // C'est pratique par exemple dans le cas d'un site multisite, et qu'il est nécessaire de configurer des langues pour certains sites. Il faut dans ce cas associer les langues pour 'Tous les sites' sur la page d'administration des langues, et définir la variable restricted_languages_array pour chaque site.
2159  $sqlLng .= " AND (lang IN ('" . implode("','", $GLOBALS['site_parameters']['restricted_languages_array']) . "'))";
2160  }
2161  $sqlLng .= "
2162  ORDER BY IF(etat = '1'". (!empty($_GET['langue'])?" OR lang='" . word_real_escape_string($_GET['langue']) . "'":'') . ", 1, 0) DESC, position ASC";
2163  $resLng = query($sqlLng);
2164  $GLOBALS['lang_etat'] = array();
2165  while ($lng = fetch_assoc($resLng)) {
2166  if($lng['etat'] == 1 || (!empty($_GET['langue']) && $lng['lang'] == $_GET['langue'])) {
2167  $GLOBALS['lang_codes'][] = $lng['lang'];
2168  $GLOBALS['admin_lang_codes'][] = $lng['lang'];
2169  if(empty($lng['admin_disallowed'])) {
2170  $GLOBALS['admin_lang_codes_with_modify_rights'][] = $lng['lang'];
2171  }
2172  } elseif($lng['etat'] == -1) {
2173  // Langue administrable mais pas en production
2174  $GLOBALS['admin_lang_codes'][] = $lng['lang'];
2175  if(empty($lng['admin_disallowed'])) {
2176  $GLOBALS['admin_lang_codes_with_modify_rights'][] = $lng['lang'];
2177  }
2178  }
2179  if(!isset($GLOBALS['lang_etat'][$lng['lang']])) {
2180  $GLOBALS['lang_flags'][$lng['lang']] = $lng['flag'];
2181  $GLOBALS['lang_names'][$lng['lang']] = $lng["nom_" . $lng['lang']];
2182  $GLOBALS['lang_etat'][$lng['lang']] = $lng['etat'];
2183  $GLOBALS['lang_url_rewriting'][$lng['lang']] = $lng["url_rewriting"];
2184  }
2185  if(!empty($lng['load_default_lang_files_before_main_lang'])) {
2186  $GLOBALS['load_default_lang_files_before_main_lang_array_by_lang'][$lng['lang']] = explode(',', $lng['load_default_lang_files_before_main_lang']);
2187  }
2188  }
2189  if(empty($GLOBALS['lang_codes'])){
2190  // Si on n'a pas trouvé au moins une langue, on prend les langues même inactives
2191  $GLOBALS['lang_codes'] = array_keys($GLOBALS['lang_etat']);
2192  }
2193  if(empty($GLOBALS['lang_codes'])){
2194  // Si on n'a toujours pas trouvé au moins une langue, on renseigne l'anglais par défaut
2195  $GLOBALS['lang_flags']['en'] = '/images/en.png';
2196  $GLOBALS['lang_names']['en'] = 'English';
2197  $GLOBALS['lang_etat']['en'] = 1;
2198  $GLOBALS['lang_url_rewriting']['en'] = '';
2199  $GLOBALS['lang_codes'][] = 'en';
2200  }
2201  if(empty($GLOBALS['admin_lang_codes'])){
2202  // Si on n'a pas trouvé au moins une langue, on prend les langues même inactives
2203  $GLOBALS['admin_lang_codes'] = $GLOBALS['lang_codes'];
2204  }
2205  $GLOBALS['lang_codes'] = array_unique($GLOBALS['lang_codes']);
2206  $GLOBALS['admin_lang_codes'] = array_unique($GLOBALS['admin_lang_codes']);
2207  if(!empty($GLOBALS['admin_lang_codes_with_modify_rights'])) {
2208  $GLOBALS['admin_lang_codes_with_modify_rights'] = array_unique($GLOBALS['admin_lang_codes_with_modify_rights']);
2209  }
2210  // Initialisation de la SESSION langue
2211  foreach($GLOBALS['lang_codes'] as $this_lang) {
2212  $GLOBALS['get_lang_rewrited_wwwroot'][$this_lang] = get_lang_rewrited_wwwroot($this_lang);
2213  $GLOBALS['langs_array_by_wwwroot'][$GLOBALS['get_lang_rewrited_wwwroot'][$this_lang]][] = $this_lang;
2214  }
2215  } elseif(empty($loaded_once)) {
2216  // Récupération des langues possibles pour l'installation
2217  $lang_dir = $GLOBALS['dirroot'] . "/lib/lang";
2218  if ($handle = opendir($lang_dir)) {
2219  while ($file = readdir($handle)) {
2220  if ($file != "." && $file != ".." && is_file($lang_dir . '/' . $file) && strtolower($file) == $file) {
2221  if (substr($file, 0, strlen('admin_install_')) == 'admin_install_' && substr($file, strlen('admin_install_')+2) == '.php') {
2222  $lng = substr($file, strlen('admin_install_'), 2);
2223  // Fichier du type admin_install_xx.php pour l'interface d'installation
2224  $GLOBALS['lang_codes'][] = $lng;
2225  if(!empty($GLOBALS['langs_flags_correspondance'][$lng])){
2226  $GLOBALS['lang_flags'][$lng] = $GLOBALS['langs_flags_correspondance'][$lng];
2227  } else {
2228  $GLOBALS['lang_flags'][$lng] = '/images/'.$lng.'.png';
2229  }
2230  if(file_exists($GLOBALS['dirroot'] . '/lib/lang/database_langues_'.$lng.'.php')) {
2231  include($GLOBALS['dirroot'] . '/lib/lang/database_langues_'.$lng.'.php');
2232  } else {
2233  include($GLOBALS['dirroot'] . '/lib/lang/database_langues_en.php');
2234  }
2235  if(!empty($peel_langues['nom']) && !empty($peel_langues['nom'][$lng])) {
2236  // Variable locale et non pas globale pour peel_langues car issue de @include($GLOBALS['dirroot'] . '/lib/lang/database_langues_'.$_SESSION['session_langue'].'.php');
2237  $GLOBALS['lang_names'][$lng] = $peel_langues['nom'][$lng];
2238  } else {
2239  $GLOBALS['lang_names'][$lng] = $lng;
2240  }
2241  $GLOBALS['admin_lang_codes'][$GLOBALS['lang_names'][$lng]] = $lng;
2242  $GLOBALS['lang_etat'][$lng] = 1;
2243  $GLOBALS['lang_url_rewriting'][$lng] = '';
2244  }elseif (substr($file, 2) == '.php') {
2245  $lng = substr($file, 0, 2);
2246  // Fichier du type xx.php pour savoir quelles langues on peut installer pour le site
2247  $GLOBALS['available_languages'][] = $lng;
2248  }
2249  }
2250  }
2251  }
2252  ksort($GLOBALS['admin_lang_codes']);
2253  }
2254  foreach($GLOBALS['lang_codes'] as $this_lang) {
2255  // Ajout des gros drapeaux
2256  if(file_exists($GLOBALS['dirroot'] . '/images/'.$this_lang.'_large.png')) {
2257  $GLOBALS['lang_flags_big'][$this_lang] = vb($GLOBALS['wwwroot']) . '/images/'.$this_lang.'_large.png';
2258  }
2259  }
2260  $loaded_once = true;
2261 }
2262 
2269  $formatted_dirroot = str_replace('\\', '/', $GLOBALS['dirroot']);
2270  $file_called_real_path = str_replace('\\', '/', @realpath('./'));
2271  if (!empty($_SERVER['SCRIPT_FILENAME']) && (empty($file_called_real_path) || (strpos($file_called_real_path, $formatted_dirroot) === false && strpos(str_replace('\\', '/', dirname($_SERVER['SCRIPT_FILENAME'])), $formatted_dirroot) !== false))) {
2272  // On gère les cas d'incohérences entre realpath et SCRIPT_FILENAME chez certains hébergeurs
2273  $file_called_real_path = str_replace('\\', '/', dirname($_SERVER['SCRIPT_FILENAME']));
2274  }
2275  if (strpos($file_called_real_path, 'public_html') === false && strpos($formatted_dirroot, 'public_html') !== false) {
2276  $file_called_real_path = str_replace('private_html/', 'public_html/', $file_called_real_path);
2277  }
2278  if (!empty($file_called_real_path) && strpos($file_called_real_path, $formatted_dirroot) !== false) {
2279  // Cas normal
2280  if ($formatted_dirroot == $file_called_real_path) {
2281  $peel_subfolder = '';
2282  } else {
2283  // CAS PARTICULIER : Sur 1&1 par exemple quand on est en multidomaine, le début de dirroot est /kunden/ alors que sinon il n'y a pas /kunden
2284  // Pour être le plus compatible possible, on commence donc par strpos($file_called_real_path, $formatted_dirroot)
2285  $peel_subfolder = substr($file_called_real_path, strpos($file_called_real_path, $formatted_dirroot) + strlen($formatted_dirroot));
2286  }
2287  } else {
2288  // Au cas où __FILE__ et SCRIPT_FILENAME ne seraient pas cohérents à cause d'alias de dossiers sur l'hébergement
2289  // Dans ce cas on considère arbitrairement qu'il n'y a pas de sous-dossier à prendre
2290  $peel_subfolder = '';
2291  }
2292  $file_called_relative_path = str_replace('\\', '/', dirname($_SERVER['PHP_SELF']));
2293  $apparent_folder = substr($file_called_relative_path, 0, strlen($file_called_relative_path) - strlen($peel_subfolder));
2294  if (empty($apparent_folder) || substr($apparent_folder, strlen($apparent_folder) - 1) != '/') {
2295  $apparent_folder .= '/';
2296  }
2297  if (substr($apparent_folder, 0, 1) != '/') {
2298  // Protection contre des requêtes de hackers du type GET http://xxxxx/ qui ne commencent anormalement pas par / et qui pourraient permettre d'inclure l'URL dans wwwroot
2299  $apparent_folder = '/' . $apparent_folder;
2300  }
2301  return $apparent_folder;
2302 }
2303 
2310 function get_wwwroot_cdn($subject) {
2311  if(!empty($GLOBALS['site_parameters']['cdn_specific_domains_array']) && !empty($GLOBALS['site_parameters']['cdn_specific_domains_array'][$subject])) {
2312  return $GLOBALS['site_parameters']['cdn_specific_domains_array'][$subject];
2313  } else if(!empty($GLOBALS['site_parameters']['cdn_generic_domain'])) {
2314  return $GLOBALS['site_parameters']['cdn_generic_domain'];
2315  } else {
2316  return $GLOBALS['wwwroot'];
2317  }
2318 }
2319 
2320 
2327  if (strval(floatval('1000.1')) != '1000.1') {
2328  // Homogénéisation des configurations serveur : avoir toujours une manipulation interne des décimales sous forme de point (évite notamment des problèmes lors d'insertions de float en SQL)
2329  @setlocale(LC_NUMERIC, 'C');
2330  }
2331  @ini_set('scream.enabled', false); // Désactivation de scream qui altère le fonctionnement normal de error_reporting
2332  @ini_set('default_socket_timeout', 4); // Eviter de bloquer sur la récupération d'une information venant d'un serveur extérieur
2333  @ini_set('display_errors', 1); // Cette valeur est ensuite modifiée quand on accède à la base de données suivant la configuration du site
2334  @ini_set("gd.jpeg_ignore_warning", 1); // Ignore les alertes créées par la fonction jpeg2wbmp() et la fonction imagecreatefromjpeg()
2335 
2336  // Configuration de l'affichage des var_dump. -1 => Supression de la limite des résultats retournés : http://xdebug.org/docs/display
2337  @ini_set('xdebug.var_display_max_depth','-1');
2338  @ini_set('xdebug.var_display_max_children','-1');
2339  @ini_set('xdebug.var_display_max_data','-1');
2340  // Sur 1and1 par exemple les fonctions ci-dessous ne sont pas fonctionnelles, c'est donc via les ini_set que ça marche ci-après
2341  if (function_exists('mb_internal_encoding')) {
2342  @mb_internal_encoding(GENERAL_ENCODING);
2343  }
2344  if (function_exists('mb_detect_order')) {
2345  @mb_detect_order(GENERAL_ENCODING);
2346  }
2347  if (function_exists('mb_http_input')) {
2348  @mb_http_input(GENERAL_ENCODING);
2349  }
2350  if (function_exists('mb_http_output')) {
2351  @mb_http_output(GENERAL_ENCODING);
2352  }
2353  // En PHP >= 5.6 les ini_set ci-dessous ne sont plus fonctionnels, il faut passer par default_charset ci-après
2354  @ini_set('mbstring.internal_encoding', GENERAL_ENCODING);
2355  @ini_set('mbstring.detect_order', GENERAL_ENCODING);
2356  @ini_set('mbstring.http_input', GENERAL_ENCODING);
2357  @ini_set('mbstring.http_output', GENERAL_ENCODING);
2358  @ini_set('mbstring.http_output', GENERAL_ENCODING);
2359  // Spécial PHP >= 5.6
2360  @ini_set('default_charset', GENERAL_ENCODING);
2361 
2362  // la fonction date_default_timezone_set existe depuis PHP 5.1.0
2363  if (version_compare(PHP_VERSION, '5.1.0', '>=')) {
2364  // Supprimer les warnings dans certains cas de configuration serveur en version PHP >= 5.3
2365  @date_default_timezone_set(@date_default_timezone_get());
2366  }
2367  @set_magic_quotes_runtime(0);
2368 }
2369 
2377  if(!empty($_SERVER['RAW_HTTP_COOKIE'])){
2378  // On complète les informations de cookie si le serveur envoie les cookies encryptés, et donc refuse les cookies provenant du navigateur par sécurité
2379  foreach(explode(';', $_SERVER['RAW_HTTP_COOKIE']) as $this_cookie){
2380  if(strpos($this_cookie, '=') !== false){
2381  list($key,$value) = explode('=', $this_cookie, 2);
2382  $key = rawurldecode(trim($key));
2383  if(!array_key_exists($key, $_COOKIE)){
2384  $_COOKIE[$key] = rawurldecode(trim($value));
2385  }
2386  }
2387  }
2388  }
2389  if (!function_exists('ini_get') || @ini_get('register_globals')) {
2390  // Code à laisser absolument en début de fichier
2391  // Protection si register_globals est à ON
2392  foreach (array('_POST', '_GET', '_COOKIE', '_REQUEST', '_SERVER', '_ENV', '_FILES') as $array_name) {
2393  foreach ($$array_name as $key => $value) {
2394  if (isset($GLOBALS[$key])) {
2395  unset($GLOBALS[$key]);
2396  }
2397  if (isset($$key)) {
2398  // Au cas où pour d'anciennes versions de PHP
2399  unset($$key);
2400  }
2401  }
2402  unset($key);
2403  unset($value);
2404  }
2405  }
2406 }
2407 
2414 function handle_template_engine_init($templates_force_compile = false) {
2415  // Chargement du moteur de template : Smarty ou Twig
2416  include($GLOBALS['dirroot'] . "/lib/templateEngines/EngineTpl.php");
2417  /* @var $GLOBALS['tplEngine'] EngineTpl */
2418  if(!in_array(vb($GLOBALS['site_parameters']['template_engine']), array('smarty', 'twig'))) {
2419  $GLOBALS['site_parameters']['template_engine'] = 'smarty';
2420  }
2421  if($GLOBALS['site_parameters']['template_engine'] == 'twig') {
2422  require $GLOBALS['dirroot'] . '/lib/templateEngines/twig/Autoloader.php';
2424  }
2425  $GLOBALS['tplEngine'] = EngineTpl::create($GLOBALS['site_parameters']['template_engine'], $GLOBALS['repertoire_modele'] . '/' . $GLOBALS['site_parameters']['template_engine'] . '/', $templates_force_compile, defined('DEBUG_TEMPLATES') && DEBUG_TEMPLATES);
2426 }
2427 
2434  if(!empty($GLOBALS['site_parameters']['site_suspended'])) {
2435  if (!empty($GLOBALS['site_parameters']['site_suspended_excluded_ips'])) {
2436  if($GLOBALS['site_parameters']['site_suspended_excluded_ips'] == 'display_errors_for_ips') {
2437  $GLOBALS['site_parameters']['site_suspended_excluded_ips'] = $GLOBALS['site_parameters']['display_errors_for_ips'];
2438  }
2439  foreach(explode(',', str_replace(array(' ', ';'), array(',', ','), $GLOBALS['site_parameters']['site_suspended_excluded_ips'])) as $this_ip_part) {
2440  if (!empty($this_ip_part) && ($this_ip_part == '*' || strpos($_SERVER['REMOTE_ADDR'], $this_ip_part) === 0)) {
2441  $allow_access_if_suspended = true;
2442  break;
2443  }
2444  }
2445  }
2446  if (!IN_INSTALLATION && !defined('IN_PATHFILE') && !defined('IN_IPN') && !defined('IN_PEEL_ADMIN') && !defined('IN_ACCES_ACCOUNT') && !defined('IN_GET_PASSWORD') && !a_priv('admin*', true) && empty($allow_access_if_suspended)) {
2447  header(String::substr(vb($_SERVER['SERVER_PROTOCOL'], 'HTTP/1.0'), 0 , 10) . " 503 Service Unavailable", true, 503);
2448  header('Status: 503 Service Unavailable');
2449  header('Retry-After: 7200');
2450  echo '<div style="text-align:center; font-size:20px; font-family: Arial,Helvetica Neue,Helvetica,sans-serif; "><br /><br /><b>' . $GLOBALS['STR_UPDATE_WEBSITE'] . '</b><br /><br /><img src="' . $GLOBALS['wwwroot'] . '/modeles/' . $GLOBALS['site_parameters']['template_directory'] . '/images/site_under_work.jpg" style="max-width:100%" /><br /><br />' . $GLOBALS['STR_THANKS_UNDERSTANDING'] . '</div>';
2451  die();
2452  }
2453  }
2454  return null;
2455 }
2456 
2462 function handle_setup_redirections($url, $mode = 'redirect') {
2463  // Redirections définies par variables de configuration
2464  static $tags_handled;
2465  if (!empty($GLOBALS['site_parameters']['redirections'])) {
2466  if(empty($tags_handled)) {
2467  $GLOBALS['site_parameters']['redirections'] = template_tags_replace($GLOBALS['site_parameters']['redirections'], array(), defined('SKIP_SET_LANG'), null, null, true);
2468  $tags_handled = true;
2469  }
2470  // Format : URL_from => URL_to OU URL_from => URL_to,301
2471  // Si pas de slash à la fin d'un domaine, alors ça concerne tout le domaine - sinon juste une page
2472  foreach($GLOBALS['site_parameters']['redirections'] as $url_from => $url_to) {
2473  $temp = explode(',', $url_to, 2);
2474  if(!empty($temp[0]) && !empty($url_from) && $temp[0] != $url_from) {
2475  if (String::strpos($url, $url_from) === 0) {
2476  $new_url = str_replace($url_from, $temp[0], $url);
2477  if($new_url != $url) {
2478  if($mode == 'redirect') {
2479  redirect_and_die($new_url, intval(vb($temp[1], 301)) == 301);
2480  } else {
2481  $url = $new_url;
2482  }
2483  }
2484  }
2485  }
2486  }
2487  }
2488  return $url;
2489 }
2490 
2491 
2497 function handle_sessions() {
2498  // Paramétrage des sessions
2499  // Pour permettre d'avoir à la fois des cookies de session valides pour N sous-domaines, et à la fois
2500  // permettre que plusieurs boutiques PEEL puissent tourner dans des sous-domaines différents, on prend
2501  // un nom de cookie de session différent pour chaque installation de PEEL.
2502  $GLOBALS['session_cookie_name'] = vb($GLOBALS['site_parameters']['session_cookie_basename']) . substr(md5(vb($GLOBALS['site_parameters']['session_cookie_unique_part'], $GLOBALS['wwwroot_main'])), 0, 8);
2503  $user_agent_salt = vb($GLOBALS['site_parameters']['session_user_agent_salt'], 'GcFsD5EOvgSvQFtL4nIy');
2504  if (!empty($GLOBALS['site_parameters']['sessions_duration'])) {
2505  @ini_set('session.gc_maxlifetime', 60 * $GLOBALS['site_parameters']['sessions_duration']);
2506  @ini_set('session.cache_expire', $GLOBALS['site_parameters']['sessions_duration']);
2507  }
2508  @ini_set('session.use_cookies', '1');
2509  @ini_set('session.use_only_cookies', '1'); // évite les attaques avec session id dans l'URL
2510  @ini_set('session.use_trans_sid', '0'); // empêche la propagation des SESSION_ID dans les URL
2511  @ini_set('session.hash_function', '1'); // Hash avec SHA-1 et non pas MD5
2512  @ini_set('url_rewriter.tags', '');
2513  @ini_set('session.name', $GLOBALS['session_cookie_name']);
2514  if (!empty($GLOBALS['site_parameters']['session_save_path'])) {
2515  @ini_set('session.save_path', $GLOBALS['site_parameters']['session_save_path']);
2516  }
2517  if (vb($GLOBALS['site_parameters']['force_sessions_for_subdomains']) && get_site_domain(true) && strpos($GLOBALS['wwwroot'], '://127.0.0.1') === false && strpos($GLOBALS['wwwroot'], '://localhost') === false) {
2518  // On ne passe pas ici si l'URL est à la base d'IP et non pas de domaine
2519  @ini_set('session.cookie_domain', '.' . get_site_domain());
2520  }
2521 
2522  session_start();
2523  if (!isset($_SESSION['session_initiated']) && isset($_COOKIE[$GLOBALS['session_cookie_name']])) {
2524  // Protection contre les fixations de session : l'utilisateur déclare qu'il possède une session alors que le serveur ne la connait pas
2525  // => il ne faut pas prendre l'identifiant de session proposé par l'utilisateur
2526  @session_regenerate_id();
2527  }
2528  $_SESSION['session_initiated'] = true;
2529  // Protection contre les vols de sessions
2530  // On ne se base pas sur les IP car certains FAI ne permettent pas de naviguer avec une seule IP (AOL,...)
2531  // Lorsqu'on installe un plugin sur un navigateur ou qu'on le met à jour, le HTTP_USER_AGENT est modifié, mais on redémarre le navigateur
2532  // Donc cette protection est bien compatible avec tout type de user_agents
2533  if (!isset($_SERVER['HTTP_USER_AGENT'])) {
2534  $_SERVER['HTTP_USER_AGENT'] = '';
2535  }
2536  if (empty($GLOBALS['site_parameters']['disable_session_user_agent_check']) && isset($_SESSION['session_user_agent'])) {
2537  if ($_SESSION['session_user_agent'] != sha1($user_agent_salt . $_SERVER['HTTP_USER_AGENT'])) {
2538  // On suppose qu'il y a vol de session => on la désactive
2539  session_unset();
2540  session_destroy();
2541  @session_regenerate_id(true);
2542  // On redémarre une nouvelle session après une redirection
2543  session_start();
2544  // On prend le nouveau user_agent comme la référence pour cette session
2545  $_SESSION['session_user_agent'] = sha1($user_agent_salt . $_SERVER['HTTP_USER_AGENT']);
2546  $_SESSION['session_initiated'] = true;
2547  }
2548  } else {
2549  $_SESSION['session_user_agent'] = sha1($user_agent_salt . $_SERVER['HTTP_USER_AGENT']);
2550  }
2551  // Initialisation de SESSION si nécessaire
2552  if (!isset($_SESSION)) {
2553  $_SESSION = array();
2554  }
2555 }
2556 
2567 function load_site_parameters($lang = null, $skip_loading_currency_infos = false, $forced_site_id = null)
2568 {
2569  $parameter_needing_full_rights_prefix = array('multisite_');
2570  if (!IN_INSTALLATION) {
2571  if(empty($lang)) {
2572  // On récupère l'id du site si on est en multisite
2573  $sql = "SELECT c.site_id, c.string
2574  FROM peel_configuration c
2575  LEFT JOIN peel_langues l ON l.etat = '1' AND l.url_rewriting LIKE '%.%' AND " . get_filter_site_cond('langues', 'l', false, $forced_site_id) . "
2576  WHERE c.technical_code='wwwroot' AND ";
2577  if ($forced_site_id === null) {
2578  $sql .= "(c.string='".real_escape_string($GLOBALS['wwwroot'])."' OR REPLACE(c.string,'www.','')='".real_escape_string($GLOBALS['wwwroot'])."' OR (l.url_rewriting LIKE '%.%' AND (REPLACE(c.string,'www.',l.url_rewriting)='".real_escape_string($GLOBALS['wwwroot'])."' OR l.url_rewriting='".real_escape_string($GLOBALS['wwwroot'])."')))";
2579  } else {
2580  $sql .= get_filter_site_cond('configuration', 'c', false, $forced_site_id);
2581  }
2582  $sql .= "
2583  ORDER BY IF(c.technical_code='wwwroot',1,0) DESC, l.position ASC
2584  LIMIT 1";
2585  $query = query($sql);
2586  while ($result = fetch_assoc($query)) {
2587  // forced_site_id ne doit pas être utilisé pour définir $GLOBALS['site_id']. C'est la configuration du site qui doit déterminer cette valeur.
2588  $GLOBALS['site_id'] = $result['site_id'];
2589  $GLOBALS['wwwroot_main'] = $result['string'];
2590  }
2591  // Si aucun site n'a été trouvé en base de données correspondant à l'URL, c'est peut-être que wwwroot n'est pas défini dans la table de configuration
2592  // Dans ce cas on se contente de la version de wwwroot calculée dans configuration.inc.php : celle définie dans info.inc.php si pas vide, ou de wwwwroot_detected à défaut
2593  // On fait le test uniquement si forced_site_id n'est pas égal à 0. Si on cherche uniquement les variables de configuration général (site_id=0), la contrainte sur wwwroot ne nous intéresse pas.
2594  if($forced_site_id!==0 && empty($GLOBALS['site_id'])) {
2595  // Si la configuration multisite n'est pas trouvée
2596  $sql = "SELECT count(*) AS this_count
2597  FROM peel_configuration c
2598  WHERE c.technical_code='wwwroot'";
2599  $query = query($sql);
2601  // this_count_wwwroot contient le nombre total de site configuré
2602  $this_count_wwwroot = $result['this_count'];
2603 
2604  // Il faut définir $GLOBALS['site_id']
2605  if ($this_count_wwwroot <=1) {
2606  // Si un seul ou zéro wwwroot est défini, alors la valeur de site_id est 1.
2607  $GLOBALS['site_id'] = 1;
2608  } elseif ($this_count_wwwroot > 1) {
2609  // plusieurs wwwroot défini dans la BDD, il faut choisir le site_id par défaut dans ce cas.
2610  // On met une condition sur site_id=0 pour éviter qu'un site ne s'arroge ce droit indûment
2611  $sql = "SELECT string
2612  FROM peel_configuration c
2613  WHERE c.technical_code='site_id_showed_by_default_if_domain_not_found' AND site_id=0";
2614  $query = query($sql);
2615  if($result = fetch_assoc($query)) {
2616  $GLOBALS['site_id'] = $result['string'];
2617  } else {
2618  // il y a plusieurs sites configurés et site_id_showed_by_default_if_domain_not_found n'est pas trouvé, donc on ne peut pas choisir le site_id du site. Impossible de continuer.
2619  die('Site configuration not detected');
2620  }
2621  }
2622 
2623  // Il faut définir $GLOBALS['wwwroot_main']
2624  if ($this_count_wwwroot > 0) {
2625  // A ce stade $GLOBALS['site_id'] est défini et wwwroot est défini, on va chercher le wwwroot associé.
2626  $sql = "SELECT string
2627  FROM peel_configuration c
2628  WHERE c.technical_code='wwwroot' AND ".get_filter_site_cond('configuration', 'c')."
2629  ORDER BY site_id DESC
2630  LIMIT 1";
2631  $query = query($sql);
2632  if($result = fetch_assoc($query)) {
2633  $GLOBALS['wwwroot_main'] = $result['string'];
2634  } else {
2635  // Il y a bien un wwwroot défini dans la base de données, mais pas pour ce site.
2636  die('Site configuration not detected');
2637  }
2638  } else {
2639  // pas de wwwroot dans la BDD, wwwroot sera detected_wwwroot qui est défini dans configuration.inc.php.
2640  }
2641  }
2642  if (!defined('IN_PEEL_ADMIN') && !empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') {
2643  // En front office, les pages sont appelées en https => on force https dans wwwroot_main pour que toutes les ressources chargées par le site soient en https, sinon le contenu est bloqué par certain navigateur.
2644  $GLOBALS['wwwroot_main'] = str_replace('http://', 'https://', $GLOBALS['wwwroot_main']);
2645  }
2646  }
2647  // Initialisation des paramètres du site
2648  $sql = "SELECT *
2649  FROM peel_configuration
2650  WHERE etat='1' AND ";
2651  if ($forced_site_id === null) {
2652  $sql .= get_filter_site_cond('configuration') . " AND ";
2653  } else {
2654  $sql .= get_filter_site_cond('configuration', null, false, $forced_site_id) . " AND ";
2655  }
2656  if(empty($lang)) {
2657  $sql .= "lang='' AND technical_code NOT LIKE 'STR_%'";
2658  } else {
2659  $sql .= "(lang='" . real_escape_string($lang) . "' OR lang='')";
2660  }
2661  $sql .= "
2662  ORDER BY IF(site_id='0', 0, 1) ASC, IF(lang='', 0, 1) ASC, technical_code ASC";
2663  // Chargement des paramètres de configuration (PEEL 7+)
2664  $query = query($sql);
2665  while($result = fetch_assoc($query)) {
2666  $skip_parameter = false;
2667  foreach($parameter_needing_full_rights_prefix as $this_parameter_begin) {
2668  if(strpos($result['technical_code'], $this_parameter_begin) === 0 && !empty($result['site_id'])) {
2669  $skip_parameter = true;
2670  }
2671  }
2672  if($skip_parameter) {
2673  continue;
2674  }
2675  // On surcharge les valeurs par défaut définies plus haut dans ce fichier par celles trouvées en base de données
2676  if(strpos($result['technical_code'], 'chmod') !== false) {
2677  if($result['type'] == 'integer') {
2678  $result['type'] = 'octal';
2679  }
2680  if(strpos($result['technical_code'], 'file') !== false) {
2681  // Filtre sur file pour ne modifier que les fichier et pas les dossier. Exemple de technical code utilisé : chmod_new_files.
2682  // Pour la sécurité des fichiers, il faut interdire les chmod qui rendent un fichier exécutable :
2683  $result['string'] = str_replace(array('1','3','5','7'), array('0','2','4','6'), $result['string']);
2684  }
2685  }
2686  if($result['type'] == 'boolean'){
2687  if(in_array(String::strtolower($result['string']), array('true', 'yes', '1'))){
2688  $result['string'] = true;
2689  } elseif(in_array(String::strtolower($result['string']), array('false', 'no', '0'))){
2690  $result['string'] = false;
2691  }
2692  } elseif($result['type'] == 'array'){
2693  // Chaine du type : "key" => "value", 'key' => value, ...
2694  $result['string'] = get_array_from_string($result['string']);
2695  } elseif($result['type'] == 'integer'){
2696  $result['string'] = intval($result['string']);
2697  } elseif($result['type'] == 'float'){
2698  $result['string'] = floatval($result['string']);
2699  } elseif($result['type'] == 'octal') {
2700  $result['string'] = octdec(intval($result['string']));
2701  } elseif($result['type'] == 'string' || (empty($result['type']) && String::strpos($result['string'], ':')===false)){
2702  $result['string'] = str_replace(array('{$GLOBALS[\'repertoire_images\']}', '{$GLOBALS[\'wwwroot\']}', '{$GLOBALS[\'dirroot\']}', ), array(vb($GLOBALS['repertoire_images']), vb($GLOBALS['wwwroot']), $GLOBALS['dirroot']), $result['string']);
2703  } elseif(!empty($result['string'])) {
2704  $result['string'] = @unserialize($result['string']);
2705  }
2706 
2707  if(String::substr($result['technical_code'], 0, 4)== 'STR_') {
2708  // Variable de langue
2709  $GLOBALS[$result['technical_code']] = $result['string'];
2710  } else {
2711  if(String::strlen($result['technical_code'])== 7 && String::substr($result['technical_code'], 0, 5) == 'logo_' && strpos($result['string'], '//') === false && !empty($result['string'])) {
2712  // Ajout de wwwroot si nécessaire
2713  if(substr($result['string'], 0, 1) != '/') {
2714  $result['string'] = $GLOBALS['wwwroot'] . '/' . $result['string'];
2715  } else {
2716  $result['string'] = $GLOBALS['wwwroot'] . $result['string'];
2717  }
2718  }
2719  // On surcharge les valeurs par défaut définies plus haut dans ce fichier par celles trouvées en base de données
2720  $GLOBALS['site_parameters'][$result['technical_code']] = $result['string'];
2721  }
2722  }
2723  if(!$skip_loading_currency_infos) {
2724  $query_devises = query("SELECT pd.devise, pd.conversion, pd.symbole, pd.symbole_place, pd.code
2725  FROM peel_devises pd
2726  WHERE pd.id = '".intval(vb($GLOBALS['site_parameters']['devise_defaut']))."' AND " . get_filter_site_cond('devises', 'pd') . "");
2727  if($result_devises = fetch_assoc($query_devises)) {
2728  // On ajoute aux valeurs par défaut définies plus haut dans ce fichier par celles trouvées dans peel_devises
2729  // Si elles existent déjà (ce qui serait inattendu), on n'y touche pas
2730  foreach($result_devises as $this_key => $this_value) {
2731  if(!isset($GLOBALS['site_parameters'][$this_key])) {
2732  $GLOBALS['site_parameters'][$this_key] = $this_value;
2733  }
2734  }
2735  }
2736  }
2737  if ((defined('IN_PEEL_ADMIN') || IN_INSTALLATION) && !empty($GLOBALS['site_parameters']['template_directory_forced_in_admin'])) {
2738  $GLOBALS['site_parameters']['template_directory'] = $GLOBALS['site_parameters']['template_directory_forced_in_admin'];
2739  }
2740  }
2741  if(!empty($GLOBALS['site_parameters']['mysql_sql_mode_force'])) {
2742  // Eviter les problèmes sur MySQL 5 sous Windows
2743  query("SET @@session.sql_mode='" . vb($GLOBALS['site_parameters']['mysql_sql_mode_force'], 'MYSQL40') . "'");
2744  }
2745  // On prend un dossier de template par défaut si pas défini ou inexistant
2746  if(!isset($GLOBALS['site_parameters']['template_directory']) || !file_exists($GLOBALS['dirroot'] . "/modeles/" . $GLOBALS['site_parameters']['template_directory'])) {
2747  if(empty($GLOBALS['site_parameters']['peel_database_version'])) {
2748  // La version de la base de donnée est inférieur à 8. On est dans un contexte de migration, il faut forcer le dossier modele à PEEL7.
2749  // Les dossiers modeles des versions plus ancienne utilisent des fonctions is_module_XXXX_active qui ne sont plus défini dans la version 8.
2750  $GLOBALS['site_parameters']['template_directory'] = 'peel7';
2751  } else {
2752  $modeles_dir = $GLOBALS['dirroot'] . "/modeles";
2753  if ($handle = opendir($modeles_dir)) {
2754  while (false !== ($file = readdir($handle))) {
2755  if ($file != "." && $file != ".." && is_dir($modeles_dir . '/' . $file)) {
2756  if(empty($GLOBALS['repertoire_modele']) || substr($GLOBALS['repertoire_modele'], 0, 4)!='peel') {
2757  // On prend de préférence un répertoire de nom différent de peelXXX
2758  $GLOBALS['site_parameters']['template_directory'] = $file;
2759  }
2760  }
2761  }
2762  }
2763  }
2764  }
2765  if(!empty($GLOBALS['site_parameters']['mysql_sql_mode_force'])) {
2766  // Eviter les problèmes sur MySQL 5 sous Windows
2767  query("SET @@session.sql_mode='" . vb($GLOBALS['site_parameters']['mysql_sql_mode_force'], 'MYSQL40') . "'");
2768  }
2769 }
2770 
2777 {
2778  return array_sum(explode(' ', microtime()));
2779 }
2780 
2798 function params_affiche_produits($condition_value1, $unused, $type, $nb_par_page, $mode = 'general', $reference_id = 0, $nb_colonnes, $always_show_multipage_footer = true, $additional_sql_inner = null, $additional_sql_cond = null, $additionnal_sql_having = null, $use_index_sql = null)
2799 {
2800  $sql_cond_array = array();
2801  $titre = '';
2802  $affiche_filtre = '';
2803  $sql_inner = '';
2804  $params_list = array();
2805  if (!empty($nb_colonnes) && ($nb_par_page % $nb_colonnes > 0)) {
2806  $nb_par_page = $nb_par_page + ($nb_colonnes - ($nb_par_page % $nb_colonnes));
2807  }
2808  if ($type == 'associated_product') {
2809  $params_list['small_width'] = 160;
2810  $params_list['small_height'] = 160;
2811  } else {
2812  $params_list['small_width'] = vn($GLOBALS['site_parameters']['small_width']);
2813  $params_list['small_height'] = vn($GLOBALS['site_parameters']['small_height']);
2814  }
2815  $params_list['cartridge_product_css_class'] = 'item-column product_per_line_' . $nb_colonnes;
2816  $display_multipage_template_name = null;
2817  if ($type == 'catalogue') {
2818  $sql_cond_array[] = "p.id_marque='" . intval($condition_value1) . "'";
2819  } elseif ($type == 'nouveaute') {
2820  $sql_cond_array[] = "p.on_new='1'";
2821  $params_list['affiche_filtre'] = affiche_filtre(null, true);
2822  $titre = $GLOBALS['STR_NOUVEAUTES'];
2823  } elseif ($type == 'promotion') {
2824  // Si l'option est activée dans les paramètres du site
2825  if (vn($GLOBALS['site_parameters']['auto_promo']) == 1) {
2826  // Si une promotion est appliquée au produit
2827  $this_sql_cond = "p.promotion>0";
2828  // Si le module flash est actif
2829  if (is_flash_active_on_site()) {
2830  $this_sql_cond .= " OR (p.on_flash='1' AND '" . date('Y-m-d H:i:s', time()) . "' BETWEEN p.flash_start AND p.flash_end)";
2831  }
2832  // Si le module Promotions par marque est actif
2833  if (check_if_module_active('marques_promotion')) {
2834  $sql_inner .= " LEFT JOIN peel_marques pm ON pm.id = p.id_marque AND " . get_filter_site_cond('marques', 'pm');
2835  $this_sql_cond .= " OR pm.promotion_percent>0 OR pm.promotion_devises>0 ";
2836  }
2837  // Si le module Promotions par catégorie est actif
2838  if (check_if_module_active('category_promotion')) {
2839  $this_sql_cond .= " OR c.promotion_percent>0 OR c.promotion_devises>0";
2840  }
2841  $sql_cond_array[] = $this_sql_cond;
2842  } else {
2843  $sql_cond_array[] = "p.on_promo='1'";
2844  }
2845  $titre = $GLOBALS['STR_PROMOTIONS'];
2846  } elseif ($type == 'special') {
2847  $sql_cond_array[] = "p.on_special='1'";
2848  $titre = $GLOBALS['STR_SPECIAL'];
2849  } elseif ($type == 'suggest') {
2850  $sql_cond_array[] = "p.prix>='" . nohtml_real_escape_string($condition_value1) . "'";
2851  $titre = $GLOBALS['STR_OUR_SUGGEST'];
2852  } elseif ($type == 'top') {
2853  $sql_cond_array[] = "p.on_top='1'";
2854  $titre = $GLOBALS['STR_TOP'];
2855  } elseif ($type == 'category') {
2856  $params_list['affiche_filtre'] = affiche_filtre($condition_value1, true);
2857  if (vb($GLOBALS['site_parameters']['category_count_method']) == 'global') {
2858  $catid_array = get_category_tree_and_itself($condition_value1, 'sons');
2859  } else {
2860  $catid_array = array($condition_value1);
2861  }
2862  $sql_cond_array[] = "pc.categorie_id IN ('" . implode("','", real_escape_string($catid_array)) . "')";
2863  $titre = $GLOBALS['STR_LIST_PRODUCT'];
2864  } elseif ($type == 'flash') {
2865  $sql_cond_array[] = "p.on_flash='1' AND '" . date('Y-m-d', time()) . "' BETWEEN p.flash_start AND p.flash_end";
2866  $titre = $GLOBALS['STR_FLASH'];
2867  } elseif ($type == 'flash_passed') {
2868  $sql_cond_array[] = "p.on_flash='1' AND '" . date('Y-m-d', time()) . "' > flash_end";
2869  $titre = $GLOBALS['STR_FLASH_PASSED'];
2870  } elseif ($type == 'user_flash_passed') {
2871  $sql_cond_array[] = "p.on_flash='1' AND '" . date('Y-m-d', time()) . "' > flash_end AND id_utilisateur = " . intval($reference_id);
2872  $titre = $GLOBALS['STR_FLASH_PASSED'];
2873  } elseif ($type == 'coming_product_flash') {
2874  $sql_cond_array[] = "p.on_flash='1' AND '" . date('Y-m-d', time()) . "' < flash_start";
2875  $titre = $GLOBALS['STR_COMING_PRODUCT_FLASH'];
2876  } elseif ($type == 'user_coming_product_flash') {
2877  $sql_cond_array[] = "p.on_flash='1' AND '" . date('Y-m-d', time()) . "' <= flash_start AND id_utilisateur = " . intval($reference_id);
2878  $titre = $GLOBALS['STR_COMING_PRODUCT_FLASH'];
2879  } elseif ($type == 'check') {
2880  $sql_cond_array[] = "p.on_check='1'";
2881  $titre = $GLOBALS['STR_CHEQUE_CADEAU'];
2882  } elseif ($type == 'associated_product') {
2883  $nb_par_page = '*';
2884  $infos = array();
2885  $commande_id_array = array();
2886  // On vérifie si la case remontée de produit a été cochée et qu'un nombre de produits à afficher a bien été saisi
2887  $sql = query('SELECT on_ref_produit, nb_ref_produits
2888  FROM peel_produits
2889  WHERE id = ' . intval(vn($reference_id))." AND " . get_filter_site_cond('produits') . "");
2890  $infos = fetch_assoc($sql);
2891  if (!empty($infos)) {
2892  // Récupération des id des commandes dont le produit fait partie
2893  $sql = 'SELECT commande_id
2894  FROM peel_commandes_articles
2895  WHERE produit_id = "' . intval($reference_id) . '" AND ' . get_filter_site_cond('commandes_articles');
2896  $q = query($sql);
2897  while ($result = fetch_assoc($q)) {
2898  $commande_id_array[] = $result['commande_id'];
2899  }
2900  // Si la case a bien été cochée et qu'un nombre a été saisi et que le produit affiché a déjà été commandé
2901  if ($infos['on_ref_produit'] == 1 && $infos['nb_ref_produits'] > 0 && count($commande_id_array) > 0) {
2902  $sql_inner .= " INNER JOIN peel_commandes_articles pca ON pca.produit_id = p.id AND " . get_filter_site_cond('commandes_articles', 'pca') . "";
2903  $sql_cond_array[] = "pca.commande_id IN ('" . implode("','", nohtml_real_escape_string($commande_id_array)) . "')";
2904  $sql_cond_array[] = "p.id!=" . intval($reference_id);
2905  $nb_par_page = intval($infos['nb_ref_produits']);
2906  } else {
2907  // Dans le cas contraire, on affiche les références produit associées
2908  $sql_cond_array[] = "pr.produit_id = '" . intval($reference_id) . "'";
2909  if(empty($GLOBALS['site_parameters']['product_references_display_limit']) && empty($GLOBALS['site_parameters']['product_references_order_by'])) {
2910  $sql_inner .= " INNER JOIN peel_produits_references pr ON p.id = pr.reference_id";
2911  } else {
2912  $sql_inner .= " INNER JOIN (SELECT * FROM peel_produits_references WHERE produit_id='" . intval($reference_id) . "' ORDER BY ".real_escape_string(vb($GLOBALS['site_parameters']['product_references_order_by'], 'reference_id ASC'))." LIMIT ".intval(vn($GLOBALS['site_parameters']['product_references_display_limit'], 10)).") pr ON p.id = pr.reference_id";
2913  }
2914  }
2915  }
2916  $titre = $GLOBALS['STR_ASSOCIATED_PRODUCT'];
2917  } elseif ($type == 'save_cart') {
2918  $sql_inner .= " INNER JOIN peel_save_cart sc ON sc.produit_id = p.id ";
2919  $sql_cond_array[] = "sc.id_utilisateur = '" . intval($condition_value1) . "'";
2920  if (!empty($GLOBALS['site_parameters']['quick_add_product_from_search_page'])) {
2921  // On ne veut pas voir dans la liste des produits sauvegardés les produits qui ont été enregistrés pour la liste de produits "quick_search"
2922  $sql_cond_array[] = "sc.products_list_name = ''";
2923  }
2924  } elseif ($type == 'convert_gift_points') {
2925  $titre = $GLOBALS['STR_VOIR_LISTE_CADEAU'];
2926  $sql_cond_array[] = "p.on_gift=1 AND on_gift_points<='".intval($_SESSION['session_utilisateur']['points'])."'";
2927  } elseif ($type == 'show_draft') {
2928  $titre = $GLOBALS['STR_MODULE_CREATE_PRODUCT_IN_FRONT_OFFICE_SORTIE_SAVE_DRAFT'];
2929  $params_list['show_draft'] = true;
2930  $sql_cond_array[] = "p.etat=0 AND id_utilisateur = '".intval($_SESSION['session_utilisateur']['id_utilisateur'])."'";
2931  }
2932  if (empty($GLOBALS['site_parameters']['allow_command_product_ongift']) && $type != 'convert_gift_points' && check_if_module_active('gifts')) {
2933  $sql_cond_array[] = 'p.on_gift = "0"';
2934  }
2935  if (!empty($additional_sql_cond)) {
2936  // On ajoute les conditions supplémentaires
2937  $sql_cond_array[] = $additional_sql_cond;
2938  }
2939  if (!empty($additional_sql_inner)) {
2940  // On ajoute les jointures supplémentaires
2941  $sql_inner .= $additional_sql_inner;
2942  }
2943  // Les chèques cadeaux ne sont pas associé à une catégorie.
2944  $join_categories = ($type != 'check');
2945  $join_categories_for_count = ($join_categories && (empty($GLOBALS['site_parameters']['allow_products_without_category']) || String::strpos(implode('', $sql_cond_array), 'c.') !== false));
2946 
2947  $sql = "SELECT p.*, p.nom_".(!empty($GLOBALS['site_parameters']['product_name_forced_lang'])?$GLOBALS['site_parameters']['product_name_forced_lang']:$_SESSION['session_langue'])." AS name " . ($join_categories?', IF(c.id IS NOT NULL, c.id, 0) AS categorie_id, IF(c.nom_' . $_SESSION['session_langue'] . ' IS NOT NULL, c.nom_' . $_SESSION['session_langue'] . ', 0) AS categorie':'');
2948  if (($type == 'save_cart')) {
2949  $sql .= ', sc.id as save_cart_id, sc.couleur_id as saved_couleur_id, sc.taille_id as saved_taille_id, sc.id_attribut as saved_attributs_list, sc.quantite as saved_quantity ';
2950  }
2951  $sql_main = '
2952  FROM peel_produits p '.$use_index_sql.'
2953  ' ;
2954  $sql_join_categories = ($join_categories?(!empty($GLOBALS['site_parameters']['allow_products_without_category']) ? 'LEFT' : 'INNER') . ' JOIN peel_produits_categories pc ON pc.produit_id = p.id':'') . '
2955  ';
2956  $sql_main2 = ($join_categories?(!empty($GLOBALS['site_parameters']['allow_products_without_category']) ? 'LEFT' : 'INNER') . ' JOIN peel_categories c ON pc.categorie_id = c.id AND c.etat=1 AND ' . get_filter_site_cond('categories', 'c'):'');
2957  $sql_main3 = '
2958  ' . $sql_inner . '
2959  WHERE '.($type != 'show_draft'?'p.etat = "1" AND ':'').' ' . get_filter_site_cond('produits', 'p') . ' AND p.nom_'.(!empty($GLOBALS['site_parameters']['product_name_forced_lang'])?$GLOBALS['site_parameters']['product_name_forced_lang']:$_SESSION['session_langue']).' != ""';
2960 
2961  if (!empty($sql_cond_array)) {
2962  $sql_main3 .= ' AND (' . implode(') AND (', array_unique($sql_cond_array)) . ')';
2963  }
2964  $sql .= $sql_main . $sql_join_categories . $sql_main2 . $sql_main3;
2965  if ($type != 'save_cart') {
2966  if($join_categories && empty($GLOBALS['site_parameters']['allow_products_multiple_results_if_multiple_categories'])) {
2967  $sql .= ' GROUP BY p.id';
2968  }
2969  if($join_categories_for_count && empty($GLOBALS['site_parameters']['allow_products_multiple_results_if_multiple_categories'])) {
2970  $sql_manual_count = 'SELECT COUNT(DISTINCT p.id) AS rows_count ' . $sql_main . $sql_join_categories . $sql_main3;
2971  } elseif($join_categories_for_count) {
2972  $sql_manual_count = 'SELECT COUNT(*) AS rows_count ' . $sql_main. $sql_join_categories . $sql_main3;
2973  } else {
2974  $sql_manual_count = 'SELECT COUNT(*) AS rows_count ' . $sql_main. $sql_main3;
2975  }
2976  } else {
2977  $sql .= ' GROUP BY save_cart_id';
2978  $sql_manual_count = 'SELECT COUNT(DISTINCT p.save_cart_id) AS rows_count ' . $sql_main. $sql_main3;
2979  }
2980  if (!empty($additionnal_sql_having)) {
2981  $sql .= ' ' . $additionnal_sql_having;
2982  }
2983  $GLOBALS['multipage_avoid_redirect_if_page_over_limit'] = true;
2984  if ($type == 'special') {
2985  $Links = new Multipage($sql, 'home', $nb_par_page, 7, 0, $always_show_multipage_footer);
2986  } elseif ($type == 'associated_product') {
2987  $Links = new Multipage($sql, 'affiche_produits_reference', $nb_par_page, 7, 0, $always_show_multipage_footer);
2988  } else {
2989  $Links = new Multipage($sql, 'affiche_produits', $nb_par_page, 7, 0, $always_show_multipage_footer, $display_multipage_template_name);
2990  }
2991  if (!empty($_GET['tri']) && !in_array($_GET['tri'], array('nom_' . $_SESSION['session_langue'], 'prix'))) {
2992  // Filtrage des colonnes de tri possibles
2993  $_GET['tri'] = 'p.nom_'.(!empty($GLOBALS['site_parameters']['product_name_forced_lang'])?$GLOBALS['site_parameters']['product_name_forced_lang']:$_SESSION['session_langue']);
2994  }
2995  if(!empty($GLOBALS['site_parameters']['sql_count_avoid_found_rows'])) {
2996  $Links->sql_count = $sql_manual_count;
2997  }
2998  $Links->order_get_variable = vb($GLOBALS['order_get_variable'], 'tri');
2999  $Links->sort_get_variable = 'sort';
3000  $Links->OrderDefault = 'position';
3001  $Links->SortDefault = 'ASC';
3002 
3003  //$Links->forced_second_order_by_string = 'p.id DESC';
3004  $Links->forced_before_first_order_by_string = null;
3005  if ($type == 'category' && vb($GLOBALS['site_parameters']['category_count_method']) == 'global' && $join_categories && !empty($condition_value1)) {
3006  $Links->forced_before_first_order_by_string .= 'IF(pc.categorie_id="'.intval($condition_value1).'", 1, 0) DESC';
3007  }
3008  if ($type == 'save_cart') {
3009  if(!empty($Links->forced_before_first_order_by_string)) {
3010  $Links->forced_before_first_order_by_string .= ', ';
3011  }
3012  $Links->forced_before_first_order_by_string .= 'save_cart_id DESC';
3013  }
3014  $params_list['nb_colonnes'] = $nb_colonnes;
3015  $params_list['Links'] = $Links;
3016  $params_list['titre'] = $titre;
3017  $params_list['mode'] = $mode;
3018 
3019  return $params_list;
3020 }
3021 
3022 if (!function_exists('ipGet')) {
3030  function ipGet()
3031  {
3032  if (isset($_SERVER['HTTP_X_FORWARDED_FOR']) && isPublicIP($_SERVER['HTTP_X_FORWARDED_FOR'])) {
3033  $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
3034  } elseif (isset($_SERVER['HTTP_CLIENT_IP']) && isPublicIP($_SERVER['HTTP_CLIENT_IP'])) {
3035  $ip = $_SERVER['HTTP_CLIENT_IP'];
3036  } elseif (isset($_SERVER['REMOTE_ADDR'])) {
3037  $ip = $_SERVER['REMOTE_ADDR'];
3038  } else {
3039  $ip = 'undefined';
3040  }
3041  if (strpos($ip, ',') !== false) {
3042  $ip_array = explode(',', $ip);
3043  $ip = $ip_array[0];
3044  }
3045  return $ip;
3046  }
3047 }
3048 
3049 if (!function_exists('isPublicIP')) {
3056  function isPublicIP($ip_to_test)
3057  {
3058  if (preg_match('/^([0-9]{1,3}.){3,3}[0-9]{1,3}$/', $ip_to_test)) {
3059  $ip_as_array = explode('.', $ip_to_test);
3060  if (count($ip_as_array) == 4 && !empty($ip_as_array[3])) {
3061  // Référence : http://www.faqs.org/rfcs/rfc3330.html pour les ip privées en complément à RFC 1918
3062  $test1 = $ip_as_array[0] != 10 && $ip_as_array[0] != 127; // Test no Loopback
3063  $test2 = $ip_as_array[0] != 172 || $ip_as_array[1] < 16 || $ip_as_array[1] > 31; // Test no Private-Use Networks
3064  $test3 = $ip_as_array[0] != 192 || $ip_as_array[1] != 168; // Test no Private-Use Networks
3065  $test4 = $ip_as_array[0] != 192 || $ip_as_array[1] != 88 || $ip_as_array[2] != 99; // Test no 6to4 Relay Anycast
3066  $test5 = $ip_as_array[0] != 169 || $ip_as_array[1] != 254; // Test no Link Local
3067  if ($test1 && $test2 && $test3 && $test4 && $test5) {
3068  // IP non privée
3069  return true;
3070  }
3071  }
3072  }
3073  return false;
3074  }
3075 }
3076 
3083 function is_user_bot($ip = null, $user_agent = null)
3084 {
3085  static $result;
3086  if($ip === null) {
3087  $ip = vb($_SERVER['REMOTE_ADDR']);
3088  }
3089  if($user_agent === null) {
3090  $user_agent = vb($_SERVER['HTTP_USER_AGENT']);
3091  }
3092  if(!isset($result)){
3093  // Premier test rapide sur user_agent
3094  $result = false;
3095  $lower_user_agent = String::strtolower($user_agent);
3096  if(!empty($user_agent)) {
3097  foreach(array('mediapartners-google', 'googlebot', 'google page speed', 'feedfetcher', 'slurp', 'bingbot', 'msnbot', 'voilabot', 'baiduspider', 'genieo', 'sindup', 'ahrefsbot', 'yandex', 'spider', 'robot', '/bot', 'crawler', 'netvibes') as $this_name) {
3098  $result = $result || String::strpos($lower_user_agent, $this_name) !== false;
3099  }
3100  }
3101  if(!$result) {
3102  // Second test un peu plus lent sur IP
3103  // Cette liste d'IP n'est pas exhaustive et reprséente des IP de moteurs de recherche
3104  $good_bots = array('62.119.21.157',
3105  '62.212.117.198',
3106  '64.4.8.', '64.62.0.', '64.68.82.', '64.68.84.', '64.68.85.',
3107  '64.241.242.177', '64.241.243.65',
3108  '65.54.164.', '65.54.165.', '65.54.188.', '65.55.208.', '65.55.209.', '65.55.213.',
3109  '65.55.214.', '65.55.215.', '65.55.233.', '65.55.246.',
3110  '65.214.36.', '65.214.38.10', '65.214.44.',
3111  '66.154.103.146', '66.196.72.', '66.196.90.',
3112  '66.237.60.22',
3113  '66.249.64.', '66.249.65.', '66.249.66.', '66.249.67.', '66.249.68.', '66.249.69.',
3114  '66.249.70.', '66.249.71.', '66.249.72.', '66.249.73.',
3115  '72.30.61.', '72.30.110.', '72.30.133.', '72.30.179.', '72.30.215.', '72.30.216.', '72.30.226.',
3116  '72.30.215.', '72.30.216.', '72.30.226.', '72.30.252.',
3117  '74.6.19.', '74.6.20.', '74.6.24.', '74.6.25.', '74.6.27.', '74.6.28.',
3118  '74.6.64.', '74.6.65.', '74.6.66.', '74.6.67.', '74.6.68.', '74.6.69.', '74.6.70.',
3119  '74.6.71.', '74.6.72.', '74.6.73.', '74.6.74.', '74.6.85.', '74.6.86.', '74.6.87.',
3120  '172.207.68.',
3121  '193.218.115.6',
3122  '195.93.102.', '195.101.94.',
3123  '204.95.98.',
3124  '207.46.89.', '207.68.146.', '207.68.157.',
3125  '209.249.67.1 ', '209.73.164.50',
3126  '210.59.144.149',
3127  '212.127.141.180', '212.78.206.',
3128  '213.73.184.',
3129  '216.39.48.58', '216.39.48.82', '216.39.48.164', '216.39.50.', '216.239.46.', '216.243.113.1',
3130  '217.205.60.225',
3131  '218.145.25.');
3132  foreach($good_bots as $bot_ip) {
3133  if (strpos($ip, $bot_ip) === 0) {
3134  $result = true;
3135  break;
3136  }
3137  }
3138  }
3139  }
3140  return $result;
3141 }
3142 
3152 function get_xml_value($filename, $filter_string, $items_count_max = 8, $line_length_max = 50)
3153 {
3154  $output = '';
3155  $forum_output = '';
3156  $valid_titre = array();
3157 
3159  $parser = xml_parser_create();
3160  xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
3161  xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
3162  xml_parse_into_struct($parser, $data, $values, $tags);
3163  xml_parser_free($parser);
3164  // loop through the structures
3165  $filter_array = explode('|', $filter_string);
3166  if(!empty($tags['title'])) {
3167  foreach ($tags['title'] as $tag_key => $value_key) {
3168  if($tag_key == 0) {
3169  // Le premier title est celui de l'ensemble, mais pas du premier message => on saute
3170  continue;
3171  }
3172  // Il y a un décalage de 1 dans les clés pour les dates de publication et les titres
3173  // On retire ce qui est épinglé en haut d'un flux, pour avoir les nouveautés : si on voit que la date repart à la hausse, on efface ce qui a été généré
3174  if(!empty($last_time) && strtotime($values[$tags['pubDate'][$tag_key-1]]['value'])>$last_time) {
3175  unset($titles_array);
3176  }
3177  $titles_array[$tag_key] = $values[$value_key]['value'];
3178  if(!empty($tags['pubDate'])) {
3179  $last_time = strtotime($values[$tags['pubDate'][$tag_key-1]]['value']);
3180  }
3181  }
3182  }
3183  if(!empty($tags['link'])) {
3184  foreach ($tags['link'] as $tag_key => $value_key) {
3185  $links_array[$tag_key] = $values[$value_key]['value'];
3186  }
3187  }
3188  if (!empty($titles_array)) {
3189  $tpl = $GLOBALS['tplEngine']->createTemplate('xml_value.tpl');
3190  $tpl_links = array();
3191 
3192  $i = 0;
3193  foreach ($titles_array as $key => $this_title) {
3194  $skip_this = false;
3195  foreach ($filter_array as $this_filter) {
3196  if (stripos($this_title, $this_filter) !== false) {
3197  $skip_this = true;
3198  }
3199  }
3200  if ($skip_this) {
3201  // On saute les titres qui contiennent des mots à problèmes
3202  continue;
3203  }
3204  $tpl_links[] = array(
3205  'href' => $links_array[$key],
3206  'label' => $titles_array[$key]
3207  );
3208  $i++;
3209  if ($i >= $items_count_max) {
3210  break;
3211  }
3212  }
3213  $tpl->assign('links', $tpl_links);
3214  $tpl->assign('line_length_max', $line_length_max);
3215  $output .= $tpl->fetch();
3216  }
3217  return $output;
3218 }
3219 
3226 function clean_str($string)
3227 {
3228  $string = preg_replace('/[^a-z0-9]/', "-", utf8_decode(String::convert_accents(String::strtolower($string))));
3229  $string = preg_replace('/[-]{2,}/', "-", $string);
3230  $output = urlencode($string);
3231  return $output;
3232 }
3233 
3241 function get_upload_errors_text($file_infos, $file_kind = 'image')
3242 {
3243  $error = "";
3244  if (empty($file_kind)) {
3245  $file_kind = 'any';
3246  }
3247  $extension = String::strtolower(pathinfo($file_infos['name'], PATHINFO_EXTENSION));
3248  if ($file_infos == "none") {
3249  $error = $GLOBALS["STR_UPLOAD_ERROR_YOU_UPLOAD_NOTHING"];
3250  } elseif (!empty($file_infos['error'])) {
3251  // Si fichier a essayé d'être téléchargé
3252  $error = $GLOBALS["STR_UPLOAD_ERROR_DURING_TRANSFER"];
3253  } elseif ($file_infos['size'] > $GLOBALS['site_parameters']['uploaded_file_max_size']) {
3254  $error = sprintf($GLOBALS["STR_UPLOAD_ERROR_FILE_IS_TOO_BIG"], round($GLOBALS['site_parameters']['uploaded_file_max_size'] / 1024));
3255  } elseif (!is_uploaded_file($file_infos['tmp_name'])) {
3256  $error = $GLOBALS["STR_UPLOAD_ERROR_DURING_TRANSFER"];
3257  } elseif ($GLOBALS['site_parameters']['check_allowed_types'] && !isset($GLOBALS['site_parameters']['allowed_types'][$file_infos['type']])) {
3258  // Vérification du type de fichier uploadé
3259  $error = sprintf($GLOBALS["STR_UPLOAD_ERROR_FILE_NOT_ALLOWED"], $file_infos['type']);
3260  } elseif (!in_array($extension, $GLOBALS['site_parameters']['extensions_valides_'.$file_kind])) {
3261  // Vérification de l'extension de fichier uploadé
3262  $error = $GLOBALS["STR_UPLOAD_ERROR_FILE_TYPE_NOT_VALID"];
3263  } elseif (!empty($GLOBALS['site_parameters']['extensions_valides_image']) && in_array($extension, $GLOBALS['site_parameters']['extensions_valides_image'])) {
3264  // Quand on passe ici, Bonne extension d'un fichier qui est une image
3265  if (!empty($GLOBALS['site_parameters']['upload_oversized_images_forbidden'])) {
3266  // SECTION DESACTIVEE PAR DEFAUT car les grandes images sont habituellement redimensionnées
3267  // A ACTIVER avec la variable upload_oversized_images_forbidden à true SI ON VEUT EMPECHER UPLOAD D'IMAGE NECESSITANT UN REDIMENSIONNEMENT
3268  list($width, $height, $type, $attr) = getimagesize($file_infos['tmp_name']);
3269  if ($width > $GLOBALS['site_parameters']['image_max_width']) {
3270  $error .= sprintf($GLOBALS["STR_UPLOAD_ERROR_IMAGE_MUST_NOT_BE_LARGER_THAN"], $GLOBALS['site_parameters']['image_max_width']);
3271  }
3272  if ($height > $GLOBALS['site_parameters']['image_max_height']) {
3273  // NE PAS ACTIVER car les grandes images sont redimensionnées
3274  $error .= sprintf($GLOBALS["STR_UPLOAD_ERROR_IMAGE_MUST_NOT_BE_HIGHER_THAN"], $GLOBALS['site_parameters']['image_max_height']);
3275  }
3276  }
3277  }
3278  if (!empty($error)) {
3279  //On a un problème à afficher
3280  $tpl = $GLOBALS['tplEngine']->createTemplate('upload_errors_text.tpl');
3281  $tpl->assign('allowed_types', $GLOBALS['site_parameters']['allowed_types']);
3282  $tpl->assign('msg', $error);
3283  return $tpl->fetch();
3284  } else {
3285  // Pas d'affichage de problème
3286  return false;
3287  }
3288 }
3289 
3302 function upload($field_name, $rename_file = true, $file_kind = null, $image_max_width = null, $image_max_height = null, $path = null, $new_file_name_without_extension = null, $default_return_value = null)
3303 {
3304  if (empty($path)) {
3305  $path = $GLOBALS['uploaddir'] . '/';
3306  }
3307  if (is_array($field_name)) {
3308  // Compatibilité anciennes versions PEEL < 7.0
3309  if (!empty($field_name)) {
3310  // $field_name contient $_FILES[$field_name]
3311  $file_infos = $field_name;
3312  } else {
3313  // Rien à télécharger
3314  return $default_return_value;
3315  }
3316  } elseif (!empty($_REQUEST[$field_name])) {
3317  // Fichier déjà existant et téléchargé par le passé
3318  if(strpos($_REQUEST[$field_name], '/' . $GLOBALS['site_parameters']['cache_folder'] . '/') === 0) {
3319  // Le fichier a été chargé en cache : on va le déplacer et garder le nom
3320  $file_infos['name'] = basename($_REQUEST[$field_name]);
3321  $format_filename_base_disabled = true;
3322  } else {
3323  // Le fichier est à sa place, on renvoie simplement le nom déjà existant
3324  return $_REQUEST[$field_name];
3325  }
3326  } elseif (empty($_FILES[$field_name]['name'])) {
3327  // Rien à télécharger, ni de fichier existant
3328  return $default_return_value;
3329  } else {
3330  // On procède à un téléchargement
3331  $file_infos = $_FILES[$field_name];
3332  // Teste la validité du téléchargement
3333  $error = get_upload_errors_text($_FILES[$field_name], $file_kind);
3334  }
3335  if (empty($error) && !empty($file_infos['name'])) {
3336  // Upload OK
3337  // Extension du fichier téléchargé
3338  $extension = String::strtolower(pathinfo($file_infos['name'], PATHINFO_EXTENSION));
3339  if (empty($new_file_name_without_extension)) {
3340  if(!empty($format_filename_base_disabled)) {
3341  $the_new_file_name = $file_infos['name'];
3342  } else {
3343  // Si aucun nom forcé, on en crée un
3344  $the_new_file_name = format_filename_base(vb($file_infos['name']), $rename_file). '.' . $extension;
3345  }
3346  } else {
3347  $the_new_file_name = $new_file_name_without_extension . '.' . $extension;
3348  }
3349  if(!isset($file_infos['tmp_name'])) {
3350  // Fichier temporaire stocké dans le cache, on va le déplacer dans le répertoire $path avec le bon nom
3351  // Si il est déjà déplacé (car on revalide une seconde fois le formulaire), on s'arrange pour que ça marche aussi - dans ce cas on ne passe pas dans le test qui suit
3352  if($GLOBALS['dirroot'] . $_REQUEST[$field_name] != $path . $the_new_file_name && file_exists($GLOBALS['dirroot'] . $_REQUEST[$field_name])) {
3353  rename($GLOBALS['dirroot'] . $_REQUEST[$field_name], $path . $the_new_file_name);
3354  }
3355  if(!file_exists($path . $the_new_file_name)) {
3356  // Fichier inexistant ou échec du déplacement => on annule le souvenir de ce fichier
3357  return $default_return_value;
3358  }
3359  return $the_new_file_name;
3360  } elseif (move_uploaded_file($file_infos['tmp_name'], $path . $the_new_file_name)) {
3361  // Le fichier est maintenant dans le répertoire des téléchargements
3362  if(!empty($GLOBALS['site_parameters']['chmod_new_files'])) {
3363  @chmod ($path . $the_new_file_name, $GLOBALS['site_parameters']['chmod_new_files']);
3364  }
3365  if (!empty($GLOBALS['site_parameters']['extensions_valides_image']) && in_array($extension, $GLOBALS['site_parameters']['extensions_valides_image']) && !empty($image_max_width) && !empty($image_max_height)) {
3366  // Les fichiers image sont convertis en jpg uniquement si nécessaire - sinon on garde le fichier d'origine
3367  $the_new_jpg_name = $new_file_name_without_extension . '.jpg';
3368  // On charge l'image, et si sa taille est supérieure à $destinationW ou $destinationH, ou si elle fait plus de $GLOBALS['site_parameters']['filesize_limit_keep_origin_file'] octets, on doit la régénèrer (sinon on la garde telle qu'elle était)
3369  // Si on est dans le cas où on la regénère, on la convertit en JPEG à qualité $GLOBALS['site_parameters']['jpeg_quality'] % (par défaut dans PHP c'est 75%, et dans PEEL on utilise 88% par défaut) et on la sauvegarde sous son nouveau nom
3370  $result = image_resize($path . $the_new_file_name, $path . $the_new_jpg_name, $image_max_width, $image_max_height, false, true, $GLOBALS['site_parameters']['filesize_limit_keep_origin_file'], $GLOBALS['site_parameters']['jpeg_quality']);
3371  if (!empty($result)) {
3372  return basename($result);
3373  } else {
3374  $tpl = $GLOBALS['tplEngine']->createTemplate('global_error.tpl');
3375  $tpl->assign('message', $GLOBALS['STR_ERROR_DECOD_PICTURE']);
3376  $error = $tpl->fetch();
3377  }
3378  } else {
3379  return $the_new_file_name;
3380  }
3381  } else {
3382  $tpl = $GLOBALS['tplEngine']->createTemplate('global_error.tpl');
3383  $tpl->assign('message', $GLOBALS['STR_ERROR_SOMETHING_PICTURE'] . ' ' .$path);
3384  $error = $tpl->fetch();
3385  }
3386  }
3387  if (!empty($error)) {
3388  $GLOBALS['notification_output_array'][] = $error;
3389  return $default_return_value;
3390  }
3391 }
3392 
3400 function format_filename_base($original_name, $rename_file = true) {
3401  if ($rename_file || (function_exists('is_filtered') && is_filtered($original_name))) {
3402  $new_file_name_without_extension = strftime("%d%m%y_%H%M%S") . "_PEEL_" . MDP(4);
3403  } else {
3404  $extension = String::strtolower(pathinfo($original_name, PATHINFO_EXTENSION));
3405  $modified_old_name_without_extension = preg_replace('/([^.a-z0-9]+)/i', '-', String::strtolower(String::convert_accents(str_replace(array('%2520', '%20', ';', ',', ' ', '^', '$', '#', '<', '>', '[', ']', '{', '}', '(', ')', "'", '"'), array('-', '-', '-', '-', '-', '-', '-', '', '', '', '', '', '', '', '', '', '', ''), basename($original_name, '.' . $extension)))));
3406  $new_file_name_without_extension = String::strtolower(String::substr(str_replace(array('-----', '----', '---', '--'), array('-', '-', '-', '-'), $modified_old_name_without_extension), 0, 33) . '-' . MDP(6));
3407  }
3408  return $new_file_name_without_extension;
3409 }
3410 
3418 {
3419  if (a_priv('demo')) {
3420  return false;
3421  }
3422  // Protection : ne pas prendre autre chose qu'un nom de fichier
3423  $filename = str_replace(array('/', '.htaccess'), '', $filename);
3424  $extension = @pathinfo($filename , PATHINFO_EXTENSION);
3425  $nom = @basename($filename, '.' . $extension);
3426  $thumbs_array = @glob($GLOBALS['uploaddir'] . '/thumbs/' . $nom . "-????.jpg");
3427  if (!empty($thumbs_array)) {
3428  foreach ($thumbs_array as $this_thumb) {
3429  unlink($this_thumb);
3430  }
3431  }
3432  return @unlink($GLOBALS['uploaddir'] . '/' . $filename);
3433 }
3434 
3450 function http_download_and_die($filename_with_realpath, $serve_download_with_php = true, $file_content_given = null, $file_name_given = null, $force_download = true)
3451 {
3452  if (!$serve_download_with_php) {
3453  // redirection vers le fichier à télécharger
3454  redirect_and_die(str_replace($GLOBALS['dirroot'], $GLOBALS['wwwroot'], $filename_with_realpath));
3455  } else {
3456  switch (strrchr(basename($filename_with_realpath), ".")) {
3457  case ".gz":
3458  $type = "application/x-gzip";
3459  break;
3460  case ".tgz":
3461  $type = "application/x-gzip";
3462  break;
3463  case ".zip":
3464  $type = "application/zip";
3465  break;
3466  case ".pdf":
3467  $type = "application/pdf";
3468  break;
3469  case ".png":
3470  $type = "image/png";
3471  break;
3472  case ".gif":
3473  $type = "image/gif";
3474  break;
3475  case ".jpg":
3476  $type = "image/jpeg";
3477  break;
3478  case ".txt":
3479  $type = "text/plain";
3480  break;
3481  case ".htm":
3482  $type = "text/html";
3483  break;
3484  case ".html":
3485  $type = "text/html";
3486  break;
3487  case ".mp3":
3488  $type = "audio/mpeg";
3489  break;
3490  case ".ogg":
3491  $type = "audio/ogg";
3492  break;
3493  case ".wav":
3494  $type = "audio/wav";
3495  break;
3496  case ".wma":
3497  $type = "audio/x-ms-wma";
3498  break;
3499  default:
3500  $type = "application/octet-stream";
3501  break;
3502  }
3503  @ignore_user_abort(true);
3504  @set_time_limit(0);
3505  if (!empty($file_content_given)) {
3506  $content_length = strlen($file_content_given);
3507  } else {
3508  $content_length = filesize($filename_with_realpath);
3509  }
3510  if(empty($file_name_given)) {
3511  $file_name_given = basename($filename_with_realpath);
3512  }
3513  if($force_download) {
3514  header('Content-Description: File Transfer');
3515  }
3516  header("Pragma: no-cache");
3517  header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
3518  header('Expires: Sat, 26 Jul 1997 05:00:00 GMT'); // Date in the past
3519  header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
3520  if($force_download) {
3521  // force download dialog
3522  // Un hébergement peut éventuellement faire une erreur 500 si exécution des 3 lignes suivantes, mais problème jamais reproduit ailleurs
3523  if(!empty($GLOBALS['site_parameters']['donwload_headers_force_download_skip'])) {
3524  header('Content-Type: application/force-download');
3525  header('Content-Type: application/octet-stream', false);
3526  header('Content-Type: application/download', false);
3527  }
3528  $content_disposition = 'attachment';
3529  } else {
3530  $content_disposition = 'inline';
3531  }
3532  header("Content-Type: " . $type . "", false);
3533  header("Content-disposition: " . $content_disposition . "; filename=\"" . rawurlencode($file_name_given) . "\"");
3534  header("Content-Transfer-Encoding: binary");
3535  header("Content-Length: " . intval($content_length));
3536  ob_clean();
3537  flush();
3538  if (!empty($file_content_given)) {
3539  echo $file_content_given;
3540  } else {
3541  readfile($filename_with_realpath);
3542  }
3543  die();
3544  }
3545 }
3546 
3554 {
3555  if(strpos($filename, '//') !== false) {
3556  $this_url = $filename;
3557  } elseif(strpos($filename, '/'.$GLOBALS['site_parameters']['cache_folder']) === 0) {
3558  $this_url = $GLOBALS['wwwroot'] . $filename;
3559  } else {
3560  $this_url = $GLOBALS['repertoire_upload'] . '/' . $filename;
3561  }
3562  return $this_url;
3563 }
3564 
3572 {
3573  $ext = String::strtolower(String::substr($filename, strrpos($filename, ".") + 1));
3574  if(in_array($ext, array('gif', 'jpg', 'jpeg', 'png'))) {
3575  $ext = 'image';
3576  }
3577  return $ext;
3578 }
3579 
3588 function get_document_image_html($filename, $width = 100, $height = 100)
3589 {
3590  if(!empty($filename)) {
3591  return '<a href="' . get_url_from_uploaded_filename($filename) . '" onclick="return(window.open(this.href)?false:true);"><img src="' . $GLOBALS['repertoire_upload'] . '/thumbs/' . thumbs($filename, $width, $height, 'fit') . '" alt="" style="max-width: ' . $width . 'px; max-height: ' . $height . 'px" /></a>';
3592  }
3593 }
3594 
3601 function get_uploaded_file_infos($field_name, $file, $delete_url, $logo_width = 100, $logo_height = 100)
3602 {
3603  if(empty($field_name)) {
3604  return array();
3605  }
3606  $file_type = get_file_type($file);
3607  $div_id = $field_name . '_' . substr(md5(rand()),0,6);
3608  $result = array('name' => basename($file),
3609  'div_id' => $div_id,
3610  'form_name' => $field_name,
3611  'form_value' => $file,
3612  'drop_src' => $GLOBALS['administrer_url'] . '/images/b_drop.png',
3613  'drop_href' => str_replace(array('[DIV_ID]', "'".$field_name."'", '"'.$field_name.'"'),array($div_id, "'".$div_id."'", '"'.$div_id.'"'), $delete_url),
3614  'url' => (!empty($file)?get_url_from_uploaded_filename($file):null),
3615  'type' => $file_type,
3616  'STR_DELETE_THIS_FILE' => $GLOBALS['STR_DELETE_THIS_FILE']
3617  );
3618  if($file_type != 'image') {
3619  $result['file_logo_src'] = $GLOBALS['repertoire_upload'] . '/thumbs/' . thumbs($file, $logo_width, $logo_height, 'fit');
3620  }
3621  return $result;
3622 }
3623 
3632 function get_site_domain($return_only_domains = false, $domain = null, $strip_subdomain = true)
3633 {
3634  if(strpos($GLOBALS['wwwroot'], '://127.0.0.1')!==false) {
3635  return $_SERVER["HTTP_HOST"];
3636  } elseif (empty($domain)) {
3637  $domain = $_SERVER["HTTP_HOST"];
3638  } else {
3639  $domain = str_replace(array('http://', 'https://', '://', '//'), '', $domain);
3640  $temp = explode('/', $domain, 2);
3641  $domain = $temp[0];
3642  }
3643  $temp = explode('.', $domain);
3644  if(count($temp)>1 && (count($temp)!=4 || !is_numeric(str_replace('.','',$domain)))) {
3645  // Ce n'est pas une IP, ni localhost ou un nom de machine => c'est un domaine avec potentiellement un (sous-)sous-domaine
3646  if(in_array($temp[count($temp)-2], array('com', 'org', 'co'))) {
3647  // Domaine en .co.uk, .com.sb, .org.uk, etc.
3648  $temp[count($temp)-2] = $temp[count($temp)-2] . '.' . $temp[count($temp)-1];
3649  unset($temp[count($temp)-1]);
3650  }
3651  if ($strip_subdomain) {
3652  return $temp[count($temp)-2].'.'.$temp[count($temp)-1];
3653  } else {
3654  return $temp[count($temp)-3].'.'.$temp[count($temp)-2].'.'.$temp[count($temp)-1];
3655  }
3656  } elseif(!$return_only_domains) {
3657  return $domain;
3658  } else {
3659  return false;
3660  }
3661 }
3662 
3663 
3675 function build_search_terms($search, $match_method)
3676 {
3677  $terms = array();
3678  $quote_terms = array();
3679 
3680  /* Si c'est une phrase exacte */
3681  if (!empty($search)) {
3682  if ($match_method == 3) {
3683  $terms[] = $search;
3684  } else {
3685  /* Si ce n'est pas une phrase exacte, on découpe la chaine */
3686  if (strstr($search, '"')) {
3687  // first pull out all the double quoted strings (e.g. '"iMac DV" or -"iMac DV"')
3688  preg_match_all('/-*".*?"/', $search, $matched_terms_array);
3689  $search = preg_replace('/-*".*?"/', '', $search);
3690  $quote_terms = preg_replace('/"/', '', $matched_terms_array[0]);
3691  }
3692  // finally pull out the rest words in the string
3693  $terms = preg_split("/\s+/", $search, 0, PREG_SPLIT_NO_EMPTY);
3694  }
3695  }
3696  // merge them all together and return
3697  // array_unique() Takes an input array and returns a new array without duplicate values.
3698  return array_unique(array_merge($terms, $quote_terms));
3699 }
3700 
3714 function build_terms_clause($terms, $fields, $match_method)
3715 {
3716  if (empty($terms) || empty($fields)) {
3717  return ' 1 ';
3718  }
3719  if ($match_method == 2) {
3720  $compare_type = 'OR';
3721  } else {
3722  $compare_type = 'AND';
3723  }
3724  // construction de la requete
3725  $conditions_array = array();
3726  foreach ($terms as $term) {
3727  // si on a un - devant, alors on ne veut pas du mot
3728  if (String::substr($term, 0, 1) == '-') {
3729  // on enleve le '-' qu'on convertir en NOT
3730  $term = String::substr($term, 1);
3731  $notmod = 'NOT';
3732  } else {
3733  $notmod = '';
3734  }
3735  $this_term_conditions_array = array();
3736  foreach ($fields as $val) {
3737  if ($term !== '') {
3738  $this_term_conditions_array[] = word_real_escape_string($val) . ' ' . word_real_escape_string($notmod) . ' LIKE "%' . nohtml_real_escape_string($term) . '%"';
3739  } else {
3740  $this_term_conditions_array[] = word_real_escape_string($val) . ' ' . word_real_escape_string($notmod) . ' LIKE ""';
3741  }
3742  }
3743  // Si notmod est actif, il faut utiliser AND pour que l'exclusion s'applique
3744  $conditions_array[] = '(' . implode((empty($notmod)?' OR ':' AND '), $this_term_conditions_array) . ')';
3745  }
3746  $where_clause = '( ' . implode(' ' . $compare_type . ' ', $conditions_array) . ' )';
3747 
3748  return $where_clause;
3749 }
3750 
3757 {
3758  query('UPDATE peel_admins_actions
3759  SET remarque="Clotûre a posteriori car pas de fin déclarée par l\'administrateur",
3760  data=DATE_ADD(date, INTERVAL 10 MINUTE)
3761  WHERE ((action = "PHONE_EMITTED") OR (action = "PHONE_RECEIVED")) AND data="NOT_ENDED_CALL" AND ' . get_filter_site_cond('admins_actions') . '
3762  ');
3763 }
3764 
3765 if (!function_exists('desinscription_newsletter')) {
3772  function desinscription_newsletter($mail)
3773  {
3774  $tpl = $GLOBALS['tplEngine']->createTemplate('desinscription_newsletter.tpl');
3775  $q = query('SELECT id_utilisateur
3776  FROM peel_utilisateurs
3777  WHERE email = "' . nohtml_real_escape_string($mail) . '" AND ' . get_filter_site_cond('utilisateurs') . '');
3778  if ($data = fetch_assoc($q)) {
3779  query('UPDATE peel_utilisateurs
3780  SET newsletter = "0"
3781  WHERE id_utilisateur=' . intval($data['id_utilisateur']) . ' AND ' . get_filter_site_cond('utilisateurs') . '');
3782  $tpl->assign('msg', $GLOBALS['STR_DESINSCRIPTION_NEWSLETTER_OK']);
3783  } else {
3784  $tpl->assign('msg', $GLOBALS['STR_EMAIL_ABSENT']);
3785  }
3786  $tpl->assign('STR_DESINSCRIPTION_NEWSLETTER', $GLOBALS['STR_DESINSCRIPTION_NEWSLETTER']);
3787  return $tpl->fetch();
3788  }
3789 }
3790 
3797 function close_page_generation($html_page = true)
3798 {
3799  $output = '';
3800  // Evite de devoir lancer un cron pour optimisations et nettoyages divers
3801  // On fait des tests séparés pour ne pas tout lancer d'un coup, mais répartir au mieux
3802  $GLOBALS['contentMail'] = '';
3803  call_module_hook('close_page_generation', array());
3804 
3805  if(!empty($GLOBALS['site_parameters']['force_systematic_user_session_reload']) && est_identifie()) {
3806  // Si on veut forcer à chaque chargement de page la mise à jour des droits des utilisateurs
3807  $q = query('SELECT priv
3808  FROM peel_utilisateurs
3809  WHERE id_utilisateur = "'.intval($_SESSION['session_utilisateur']['id_utilisateur']).'" AND ' . get_filter_site_cond('utilisateurs'));
3810  if($result = fetch_assoc($q)) {
3811  $_SESSION['session_utilisateur']['priv'] = $result['priv'];
3812  } else {
3813  unset($_SESSION['session_utilisateur']);
3814  }
3815  }
3816  if(!check_if_module_active('crons')) {
3817  if (mt_rand(1, 10000) == 5000) {
3818  optimize_Tables();
3819  }
3820  if (mt_rand(1, 10000) == 5000) {
3822  }
3823  if (mt_rand(1, 10000) == 5000) {
3825  }
3826  if (mt_rand(1, 10000) == 5000) {
3827  clean_Cache();
3828  }
3829  }
3830  if ($html_page && defined('PEEL_DEBUG') && PEEL_DEBUG) {
3831  // Affichage des infos de pseudo cron remplies par les fonctions ci-dessus
3832  $output .= $GLOBALS['contentMail'];
3833  }
3834  db_close();
3835 
3836  if(!$html_page && !empty($GLOBALS['site_parameters']['google_analytics_site_code_for_nohtml_pages']) && !is_user_bot()) {
3837  // On appelle directement Google analytics pour déclarer qu'une page a été vue, car la page n'est pas en HTML et donc on ne peut faire exécuter par le client du javascript ou faire appeler une image d'un pixel
3838  $var_cookie=10000000+(hexdec(session_id())%89999999); // rand(10000000,99999999);//random cookie number
3839  $var_random=rand(1000000000,2147483647); //number under 2147483647
3840  $var_today=time(); //today
3841  $visitorId = '0x' . substr (md5(vb($_SERVER['REMOTE_ADDR'])),0,16);
3842  $var_uservar='-'; //enter your own user defined variable
3843  if(!empty($_COOKIE['__utma'])) {
3844  $utma = $_COOKIE['__utma'];
3845  $temp = explode('.', $utma);
3846  $var_cookie = $temp[0];
3847  } else {
3848  $utma = ''.$var_cookie.'.'.$var_random.'.'.$var_today.'.'.$var_today.'.'.$var_today.'.2';
3849  }
3850  if(!empty($_COOKIE['__utmb'])) {
3851  $utmb = $_COOKIE['__utmb'];
3852  } else {
3853  $utmb = $var_cookie;
3854  }
3855  if(!empty($_COOKIE['__utmc'])) {
3856  $utmc = $_COOKIE['__utmc'];
3857  } else {
3858  $utmc = $var_cookie;
3859  }
3860  if(!empty($_COOKIE['__utmz'])) {
3861  $utmz = $_COOKIE['__utmz'];
3862  } else {
3863  $utmz = ''.$var_cookie.'.'.$var_today.'.2.2.utmccn%3D(direct)%7Cutmcsr%3D(direct)%7Cutmcmd%3D(none)';
3864  }
3865  if(!empty($_COOKIE['__utmv'])) {
3866  $utmv = $_COOKIE['__utmv'];
3867  } else {
3868  $utmv = $var_cookie.'.'.$var_uservar;
3869  }
3870  $utm_get[] = "utmwv=" . urlencode(isset($_COOKIE['__utmwv'])?$_COOKIE['__utmwv']:'1');
3871  $utm_get[] = "utmn=" . urlencode(rand(1000000000,9999999999));
3872  $utm_get[] = "utmhn=" . urlencode(get_site_domain(true));
3873  $utm_get[] = "utmr=" . urlencode(vb($_SERVER['HTTP_REFERER']));
3874  $utm_get[] = "utmp=" . urlencode($_SERVER['REQUEST_URI']);
3875  $utm_get[] = "utmac=" . urlencode(str_replace('UA-', 'MO-', $GLOBALS['site_parameters']['google_analytics_site_code_for_nohtml_pages']));
3876  $utm_get[] = "utmcc=__utma%3D" . urlencode($utma) . '%3B%2B__utmb%3D' . urlencode($utmb) . '%3B%2B__utmc%3D' . urlencode($utmc) . '%3B%2B__utmz%3D' . $utmz . '%3B%2B__utmv%3D' . urlencode($utmv) . "%3B";
3877  $utm_get[] = "utmvid=" . urlencode(isset($_COOKIE['__utmvid'])?$_COOKIE['__utmvid']:$visitorId);
3878  $utm_get[] = "utmip=" . urlencode(substr(vb($_SERVER["REMOTE_ADDR"]), 0, strrpos(vb($_SERVER["REMOTE_ADDR"]), '.')).'.0');
3879  $utm_get[] = "utmsr=" . urlencode(isset($_COOKIE['__utmsr'])?$_COOKIE['__utmsr']:'-');
3880  $utm_get[] = "utmsc=" . urlencode(isset($_COOKIE['__utmsc'])?$_COOKIE['__utmsc']:'-');
3881  $utm_get[] = "utmul=" . urlencode(isset($_COOKIE['__utmul'])?$_COOKIE['__utmul']:'-');
3882  $utm_get[] = "utmje=" . urlencode(isset($_COOKIE['__utmje'])?$_COOKIE['__utmje']:'0');
3883  $utm_get[] = "utmfl=" . urlencode(isset($_COOKIE['__utmfl'])?$_COOKIE['__utmfl']:'-');
3884  $utm_get[] = "guid=on";
3885  $utm_get[] = "utmdt=" . urlencode(isset($GLOBALS['meta_title'])?$GLOBALS['meta_title']:'-');
3886  $handle = fopen ('http://www.google-analytics.com/__utm.gif?'.implode('&', $utm_get), "r");
3887  $test = fgets($handle);
3888  fclose($handle);
3889  }
3890  return $output;
3891 }
3892 
3899 {
3900  $GLOBALS['contentMail'] .= 'Optimisation des tables : ';
3901  $tables = '';
3902  $q = query('SHOW TABLES FROM ' . $GLOBALS['nom_de_la_base']);
3903  while ($row = fetch_row($q)) {
3904  query('OPTIMIZE TABLE `' . $row[0] . '`');
3905  sleep(2);
3906  }
3907  $GLOBALS['contentMail'] .= 'Ok' . "\r\n\r\n";
3908 }
3909 
3917 function clean_Cache($days_max = 15, $filename_beginning = null)
3918 {
3919  $files_deleted = nettoyer_dir($GLOBALS['dirroot'] . '/' . $GLOBALS['site_parameters']['cache_folder'], 3600 * 24 * $days_max, $filename_beginning);
3920  if(!empty($GLOBALS['contentMail'])) {
3921  $GLOBALS['contentMail'] .= 'Suppression des fichiers de plus de ' . $days_max . ' jours dans le dossier ' . $dir . '/ : ';
3922  $GLOBALS['contentMail'] .= 'Ok - ' . $files_deleted . ' fichiers supprimés' . "\r\n\r\n";
3923  }
3924 }
3925 
3934 function nettoyer_dir($dir, $older_than_seconds = 3, $filename_beginning = null, $create_files_array_found_instead_of_delete = false)
3935 {
3936  if (a_priv('demo')) {
3937  return false;
3938  }
3939  $files_deleted = 0;
3940  if(String::substr($dir, -1) == '/') {
3941  $dir = String::substr($dir, 0, String::strlen($dir) - 1);
3942  }
3943  if ($dir != $GLOBALS['dirroot'] && is_dir($dir) && ($dossier = opendir($dir))) {
3944  while (false !== ($file = readdir($dossier))) {
3945  if ($file != '.' && $file != '..' && $file[0] != '.' && filemtime($dir . '/' . $file) < time() - $older_than_seconds && is_file($dir . '/' . $file) && (empty($filename_beginning) || strpos($file, $filename_beginning) === 0)) {
3946  // On efface les fichiers vieux de plus de $older_than_seconds secondes et qui ne sont pas des .htaccess
3947  if($create_files_array_found_instead_of_delete) {
3948  $GLOBALS['files_found_in_folder'][] = $file;
3949  } else {
3950  unlink($dir . '/' . $file);
3951  }
3952  $files_deleted++;
3953  } elseif ($file != '.' && $file != '..' && is_dir($dir . '/' . $file)) {
3954  // On efface récursivement le contenu des sous-dossiers
3955  $files_deleted += nettoyer_dir($dir . '/' . $file, $older_than_seconds, $filename_beginning);
3956  }
3957  }
3958  }
3959  return $files_deleted;
3960 }
3961 
3969 function clean_utilisateur_connexions($days_max = 730)
3970 {
3971  $max_reduce_size = false;
3972  if ($max_reduce_size) {
3973  $days_max2 = 365 + 30;
3974  // Archivage peel_utilisateur_connexions sur 1 an pour les utilisateurs qui viennent encore, ou 2 ans pour les autres
3975  $GLOBALS['contentMail'] .= 'Suppression des infos de connexion utilisateurs de plus de ' . $days_max2 . ' jours dans la BDD : ';
3976  $q = query('SELECT *, MAX(date) AS max_date, MIN(date) AS min_date
3977  FROM peel_utilisateur_connexions uc
3978  GROUP BY uc.user_id
3979  HAVING max_date>"' . date('Y-m-d H:i:s', time() - $days_max2 * 24 * 3600) . '" AND min_date<"' . date('Y-m-d H:i:s', time() - $days_max2 * 24 * 3600) . '"');
3980  $users_ids_array = array();
3981  while ($result = fetch_assoc($q)) {
3982  $users_ids_array[] = $result['user_id'];
3983  }
3984  if (!empty($users_ids_array)) {
3985  query('DELETE FROM peel_utilisateur_connexions
3986  WHERE date<="' . date('Y-m-d H:i:s', time() - $days_max2 * 24 * 3600) . '" AND user_id IN ("' . implode('","', nohtml_real_escape_string($users_ids_array)) . '")');
3987  }
3988  $GLOBALS['contentMail'] .= 'Ok - ' . count($users_ids_array) . ' utilisateurs concernés' . "\r\n\r\n";
3989  sleep(1);
3990  }
3991  $GLOBALS['contentMail'] .= 'Suppression des infos de connexion utilisateurs de plus de ' . $days_max . ' jours dans la BDD : ';
3992  // On supprime tout ce qui dépasse 2 ans
3993  query('DELETE FROM peel_utilisateur_connexions
3994  WHERE date<="' . date('Y-m-d H:i:s', time() - $days_max * 24 * 3600) . '"');
3995  $GLOBALS['contentMail'] .= 'Ok - ' . affected_rows() . ' lignes effacées' . "\r\n\r\n";
3996 }
3997 
4005 function clean_admins_actions($days_max = 1460)
4006 {
4007  $GLOBALS['contentMail'] .= 'Suppression des actions administrateur de plus de ' . $days_max . ' jours dans la BDD : ';
4008  // On supprime tout ce qui dépasse 4 ans
4009  query('DELETE FROM peel_admins_actions
4010  WHERE date<="' . date('Y-m-d H:i:s', time() - $days_max * 24 * 3600) . '"');
4011  $GLOBALS['contentMail'] .= 'Ok - ' . affected_rows() . ' lignes effacées' . "\r\n\r\n";
4012 }
4013 
4024 function formSelect ($name, $tab, $preselected_value = null, $addOne = 0, $get = 0)
4025 {
4026  $o = '';
4027  foreach ($tab as $k => $v) {
4028  $k = ($addOne) ? $k + 1 : $k;
4029 
4030  if (!empty($preselected_value)) {
4031  $s = (($preselected_value == $k)) ? (' selected="selected"') : ('');
4032  } elseif (!$get) {
4033  $s = (isset($_POST['form_' . $name . '']) && $_POST['form_' . $name . ''] == $k) ? (' selected="selected"') : ('');
4034  } else {
4035  $s = (isset($_GET[$name]) && urldecode($_GET['' . $name . '']) == $k) ? ' selected="selected"' : '';
4036  }
4037  $o .= '<option value="' . String::str_form_value($k) . '" ' . $s . '>' . $v . '</option>' . "\n";
4038  }
4039  return $o;
4040 }
4041 
4055 function getTextEditor($instance_name, $width, $height, $default_text, $default_path = null, $type_html_editor = 0, $compter_char_max_if_enabled = 255, $placeholder = '')
4056 {
4057  $output = '';
4058  if (is_numeric($width)) {
4059  $width_css = $width . 'px';
4060  $cols = $width / 12;
4061  } else {
4062  $width_css = $width;
4063  $cols = 50;
4064  }
4065  if (!empty($type_html_editor)) {
4066  // Editeur choisi en paramètre de la fonction
4067  $this_html_editor = vb($type_html_editor);
4068  } else {
4069  // Editeur sélectionné depuis la configuration du site
4070  $this_html_editor = vn($GLOBALS['site_parameters']['html_editor']);
4071  }
4072  // Pour les éditeurs WISIWYG, définition des CSS qui sont ajoutés pour l'édition si c'est possible techniquement
4073  $css_files = array();
4074  if(!empty($GLOBALS['site_parameters']['bootstrap_enabled'])) {
4075  $css_files[] = get_url('/lib/css/bootstrap.css');
4076  }
4077  if(!empty($GLOBALS['site_parameters']['css'])) {
4078  foreach (get_array_from_string($GLOBALS['site_parameters']['css']) as $this_css_filename) {
4079  if(file_exists($GLOBALS['repertoire_modele'] . '/css/' . trim($this_css_filename))) {
4080  $css_files[] = $GLOBALS['repertoire_css'] . '/' . trim($this_css_filename); // .'?'.time()
4081  }
4082  }
4083  }
4084  if ($this_html_editor == '1') {
4085  // Editeur nicEditor
4086  if(empty($GLOBALS['html_editor_loaded'])) {
4087  $GLOBALS['html_editor_loaded'] = true;
4088  $GLOBALS['js_files_pageonly'][] = get_url('/lib/nicEditor/nicEdit.js');
4089  }
4090  $GLOBALS['js_ready_content_array'][] = '
4091 bkLib.onDomLoaded(function() {
4092  new nicEditor({iconsPath : \'' . $GLOBALS['wwwroot'] . '/lib/nicEditor/nicEditorIcons.gif\',fullPanel : true}).panelInstance(\'' . $instance_name . '\');
4093 });
4094 ';
4095  $output .= '
4096 <div style="width:' . $width . '; max-width: 100%; overflow-x: auto; -webkit-overflow-scrolling: touch;">
4097  <div style="min-width:200px">
4098  <textarea name="' . $instance_name . '" id="' . $instance_name . '" style="width:' . $width_css . '; height:' . $height . 'px" rows="' . ($height / 12) . '" cols="' . $cols . '">' . String::htmlentities($default_text) . '</textarea>
4099  </div>
4100 </div>
4101 ';
4102  } elseif ($this_html_editor == '0') {
4103  $default_text = String::nl2br_if_needed($default_text);
4104  // Editeur FCKeditor
4105  include_once($GLOBALS['dirroot'] . "/lib/FCKeditor/fckeditor.php");
4106  $oFCKeditor = new FCKeditor($instance_name);
4107  if(empty($default_path)) {
4108  $default_path = get_url('/');
4109  }
4110  $oFCKeditor->BasePath = $default_path . 'lib/FCKeditor/';
4111  $oFCKeditor->Value = String::htmlspecialchars_decode($default_text, ENT_QUOTES);
4112  $oFCKeditor->Height = $height;
4113  $oFCKeditor->Width = $width;
4114  $oFCKeditor->Config = array('EditorAreaCSS' => implode(',', $css_files));
4115  $output .= '
4116 <div style="width:' . $width . '; max-width: 100%; overflow-x: auto; -webkit-overflow-scrolling: touch;">
4117  <div style="min-width:550px">
4118  '.$oFCKeditor->CreateHtml().'
4119  </div>
4120 </div>
4121 ';
4122  } elseif ($this_html_editor == '3') {
4123  $default_text = String::nl2br_if_needed($default_text);
4124  // Editeur CKeditor
4125  include_once($GLOBALS['dirroot'] . "/lib/ckeditor/ckeditor.php");
4126  $config = array('width' => $width, 'height' => $height, 'contentsCss' => $css_files);
4127  $CKEditor = new CKEditor($GLOBALS['wwwroot'] . '/lib/ckeditor/');
4128  $CKEditor->returnOutput = true;
4129  $output .= '
4130 <div style="width:' . $width . '; max-width: 100%; height:' . $height . 'px; overflow-x: auto; -webkit-overflow-scrolling: touch;">
4131  <div style="min-width:270px">
4132  '.$CKEditor->editor($instance_name, String::htmlspecialchars_decode($default_text, ENT_QUOTES), $config).'
4133  </div>
4134 </div>
4135 ';
4136  } elseif ($this_html_editor == '4') {
4137  $default_text = String::nl2br_if_needed($default_text);
4138  // Editeur TinyMCE
4139  if(empty($GLOBALS['html_editor_loaded'])) {
4140  $GLOBALS['html_editor_loaded'] = true;
4141  $GLOBALS['js_files_pageonly'][] = get_url('/lib/tiny_mce/jquery.tinymce.js');
4142  $GLOBALS['js_ready_content_array'][] = '
4143  $("textarea.tinymce").tinymce({
4144  // Location of TinyMCE script
4145  script_url : "' . $GLOBALS['wwwroot'] . '/lib/tiny_mce/tiny_mce.js",
4146 
4147  // General options
4148  theme : "advanced",
4149  plugins : "pagebreak,style,layer,table,save,advhr,advimage,advlink,emotions,iespell,inlinepopups,insertdatetime,preview,media,searchreplace,print,contextmenu,paste,directionality,fullscreen,noneditable,visualchars,nonbreaking,xhtmlxtras,template",
4150  entity_encoding : "raw",
4151 
4152  // Theme options
4153  theme_advanced_buttons1 : "save,newdocument,|,bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,styleselect,formatselect,fontselect,fontsizeselect",
4154  theme_advanced_buttons2 : "cut,copy,paste,pastetext,pasteword,|,search,replace,|,bullist,numlist,|,outdent,indent,blockquote,|,undo,redo,|,link,unlink,anchor,image,cleanup,help,code,|,insertdate,inserttime,preview,|,forecolor,backcolor",
4155  theme_advanced_buttons3 : "tablecontrols,|,hr,removeformat,visualaid,|,sub,sup,|,charmap,emotions,iespell,media,advhr,|,print,|,ltr,rtl,|,fullscreen",
4156  theme_advanced_buttons4 : "insertlayer,moveforward,movebackward,absolute,|,styleprops,|,cite,abbr,acronym,del,ins,attribs,|,visualchars,nonbreaking,template,pagebreak",
4157  theme_advanced_toolbar_location : "top",
4158  theme_advanced_toolbar_align : "left",
4159  theme_advanced_statusbar_location : "bottom",
4160  theme_advanced_resizing : true,
4161  width: \''.$width.'\',
4162  height: \''.$height.'\',
4163 
4164  // Example content CSS (should be your site CSS)
4165  content_css : "'.implode(',', $css_files).'",
4166  });
4167 ';
4168  }
4169  $output .= '
4170 <div style="width:' . $width . '; max-width: 100%; overflow-x: auto; -webkit-overflow-scrolling: touch;">
4171  <div style="min-width:600px">
4172  <textarea class="tinymce" name="' . $instance_name . '" id="' . $instance_name . '" style="width:' . $width_css . '; height:' . $height . 'px" rows="' . ($height / 12) . '" cols="' . $cols . '">' . String::htmlentities($default_text) . '</textarea>
4173  </div>
4174 </div>
4175 ';
4176  } elseif($this_html_editor == '5') {
4177  // Champ textarea de base + Compteur de caractères
4178  $output .= '
4179  <textarea class="form-control" placeholder="'. $placeholder.'" name="' . $instance_name . '" cols="' . $cols . '" rows="' . ($height / 12) . '" onfocus="Compter(this,'.$compter_char_max_if_enabled.',compteur, true)" onkeypress="Compter(this,'.$compter_char_max_if_enabled.',compteur, true)" onkeyup="Compter(this,'.$compter_char_max_if_enabled.',compteur, true)" onblur="Compter(this,'.$compter_char_max_if_enabled.',compteur, true)">' . String::htmlentities($default_text) . '</textarea><br />
4180  <div class="compteur_contener"><span style="margin:5px;">'.$GLOBALS['STR_REMINDING_CHAR'].'</span><input class="form-control compteur" type="number" name="compteur" size="4" onfocus="blur()" value="0" /></div>
4181 ';
4182  } else {
4183  // Champ textarea de base
4184  $output .= '
4185  <textarea name="' . $instance_name . '" id="' . $instance_name . '" style="width:' . $width_css . '; height:' . $height . 'px" rows="' . ($height / 12) . '" cols="' . $cols . '">' . String::htmlentities($default_text) . '</textarea>
4186 ';
4187  }
4188  return $output;
4189 }
4190 
4199 function set_configuration_variable($frm, $update_if_technical_code_exists = false, $allow_create = true)
4200 {
4201  if(!isset($frm['etat'])) {
4202  $frm['etat'] = 1;
4203  }
4204  if(!isset($frm['site_id'])) {
4205  if(defined('IN_PEEL_ADMIN') && isset($_SESSION['session_admin_multisite'])) {
4206  // Par défaut, s'applique au site en cours d'utilisation
4207  $frm['site_id'] = $_SESSION['session_admin_multisite'];
4208  } else {
4209  $frm['site_id'] = $GLOBALS['site_id'];
4210  }
4211  }
4212  if($update_if_technical_code_exists && !empty($frm['technical_code'])) {
4213  // On récupère la ligne si elle existe pour ce site_id et pas un autre
4214  $sql = "SELECT id
4215  FROM peel_configuration
4216  WHERE technical_code = '" . real_escape_string($frm['technical_code']) . "' AND " . get_filter_site_cond('configuration', null, false, vb($frm['site_id']), true);
4217  $qid = query($sql);
4218  if ($select = fetch_assoc($qid)) {
4219  // Elément déjà existant, qu'on met à jour
4220  update_configuration_variable($select['id'], $frm);
4221  return true;
4222  }
4223  }
4224  if($allow_create) {
4225  // La création d'un nouveau paramètre n'est pas souhaitée à chaque fois, afin d'éviter des doublons.
4226  if(in_array($frm['string'], array('true', 'false'))) {
4227  $frm['type'] = 'boolean';
4228  } elseif(!isset($frm['type'])) {
4229  $frm['type'] = 'string';
4230  }
4231  if(is_array($frm['string'])) {
4232  $frm['string'] = get_string_from_array($frm['string']);
4233  $frm['type'] = 'array';
4234  }
4235  // On cherche d'abord si cette configuration demandée est la même qu'une configuration publique
4236  $sql_items[] = "etat = '" . intval($frm['etat']) . "'";
4237  $sql_items[] = "technical_code = '" . nohtml_real_escape_string($frm['technical_code']) . "'";
4238  $sql_items[] = "string = '" . real_escape_string($frm['string']) . "'";
4239  $sql_items[] = "lang = '" . nohtml_real_escape_string(vb($frm['lang'])) . "'";
4240  $sql = "SELECT id
4241  FROM peel_configuration
4242  WHERE " . implode(' AND ', $sql_items) . " AND " . get_filter_site_cond('configuration', null, false, 0, true);
4243  $qid = query($sql);
4244  if (!fetch_assoc($qid)) {
4245  $sql_items[] = "`type` = '" . nohtml_real_escape_string($frm['type']) . "'";
4246  $sql_items[] = "`last_update` = '" . date('Y-m-d H:i:s', time()) . "'";
4247  $sql_items[] = "`origin` = '" . nohtml_real_escape_string(vb($frm['origin'])) . "'";
4248  $sql_items[] = "`explain` = '" . nohtml_real_escape_string(vb($frm['explain'])) . "'";
4249  // MAJ pour la page en cours de génération
4250  if($frm['type'] == 'array') {
4251  $GLOBALS['site_parameters'][$frm['technical_code']] = get_array_from_string($frm['string']);
4252  } else {
4253  $GLOBALS['site_parameters'][$frm['technical_code']] = $frm['string'];
4254  }
4255  // MAJ en BDD
4256  $sql = "INSERT INTO peel_configuration
4257  SET " . implode(', ', $sql_items) . ", `site_id` = '" . nohtml_real_escape_string(get_site_id_sql_set_value($frm['site_id'])) . "'";
4258  return query($sql);
4259  }
4260  } else {
4261  return null;
4262  }
4263 }
4264 
4273 function update_configuration_variable($id_or_technical_code, $frm, $delete = false)
4274 {
4275  if(isset($frm['string']) && is_array($frm['string'])) {
4276  $frm['string'] = get_string_from_array($frm['string']);
4277  }
4278  if($delete) {
4279  // MAJ pour la page en cours de génération
4280  unset($GLOBALS['site_parameters'][$frm['technical_code']]);
4281  // Modification en BDD
4282  $sql = "DELETE FROM peel_configuration
4283  WHERE ";
4284  } else {
4285  // MAJ pour la page en cours de génération
4286  if(isset($frm['string'])) {
4287  if(vb($frm['type']) == 'array') {
4288  $GLOBALS['site_parameters'][$frm['technical_code']] = get_array_from_string($frm['string']);
4289  } else {
4290  $GLOBALS['site_parameters'][$frm['technical_code']] = $frm['string'];
4291  }
4292  }
4293  // Modification en BDD
4294  $sql = "UPDATE peel_configuration
4295  SET etat = '" . intval($frm['etat']) . "'
4296  , technical_code = '" . nohtml_real_escape_string($frm['technical_code']) . "'
4297  ".(isset($frm['type'])?", type = '" . nohtml_real_escape_string($frm['type']) . "'":"")."
4298  ".(isset($frm['string'])?", string = '" . real_escape_string($frm['string']) . "'":"")."
4299  , last_update = '" . date('Y-m-d H:i:s', time()) . "'
4300  ".(isset($frm['origin'])?", origin = '" . nohtml_real_escape_string($frm['origin']) . "'":"")."
4301  ".(isset($frm['lang'])?", lang = '" . nohtml_real_escape_string($frm['lang']) . "'":"")."
4302  ".(isset($frm['explain'])?", `explain` = '" . nohtml_real_escape_string($frm['explain']) . "'":"")."
4303  ".(isset($frm['site_id'])?", `site_id` = '" . nohtml_real_escape_string(get_site_id_sql_set_value($frm['site_id'])) . "'":"")."
4304  WHERE ";
4305  }
4306  if(is_numeric($id_or_technical_code)) {
4307  $sql .= "id = '" . intval($id_or_technical_code) . "'";
4308  } else {
4309  $sql .= "technical_code = '" . real_escape_string($id_or_technical_code) . "'";
4310  }
4311  $sql .= " AND " . get_filter_site_cond('configuration', null, true, vb($frm['site_id'], null));
4312  return query($sql);
4313 }
4314 
4323 function get_minified_src($files_array, $files_type = 'css', $lifetime = 3600) {
4324  //if(a_priv('admin*')) { var_dump($files_array); }
4325  if($files_type == 'css') {
4326  // NB : Si on utilise un CDN pour repertoire_css, ce CDN va être utilisé pour les autres dossiers qui contiennent des CSS également
4327  $this_wwwroot = get_wwwroot_cdn('repertoire_css');
4328  } else {
4329  $this_wwwroot = $GLOBALS['wwwroot'];
4330  }
4331  if($files_type == 'js') {
4332  // Pour des raisons de compatibilité, on n'applique pas de minified sur les fichiers contenant ces chaines de caractères
4333  $excluded_files = vb($GLOBALS['site_parameters']['minify_js_exclude_array'], array());
4334  $excluded_files[] = 'prototype.js';
4335  $excluded_files[] = 'controls.js';
4336  $excluded_files[] = 'effects.js';
4337  $included_files = array('datepicker');
4338  } elseif($files_type == 'css') {
4339  if(!empty($GLOBALS['site_parameters']['minify_css_exclude_array'])) {
4340  $excluded_files = $GLOBALS['site_parameters']['minify_css_exclude_array'];
4341  }
4342  }
4343  $original_files_array = $files_array;
4344  foreach($files_array as $this_key => $this_file) {
4345  if(String::substr($this_file, 0, 2) == '//') {
4346  // Gestion des chemins de fichiers http/https automatiques
4347  $this_file = 'http:' . $this_file;
4348  } elseif(String::strpos($this_file, '//') === false && String::substr($this_file, 0, 1) == '/') {
4349  // Chemin absolu
4350  $this_file = $this_wwwroot . $this_file;
4351  } elseif(String::strpos($this_file, '//') === false) {
4352  // Chemin relatif car le nom du fichier ne commence pas par / => par défaut on considère qu'il est dans le répertoire CSS dans modeles/
4353  $this_file = $GLOBALS['repertoire_css'] . '/' . $this_file;
4354  }
4355  if($GLOBALS['wwwroot'] != $this_wwwroot) {
4356  $this_file = str_replace($GLOBALS['wwwroot'], $this_wwwroot, $this_file);
4357  }
4358  $files_array[$this_key] = $this_file = String::html_entity_decode($this_file);
4359  unset($skip);
4360  if(!empty($excluded_files)) {
4361  foreach($excluded_files as $this_excluded_file) {
4362  if(strpos($this_file, $this_excluded_file) !== false) {
4363  $avoid_skip = false;
4364  if(!empty($included_files)) {
4365  foreach($included_files as $this_included_file) {
4366  if(strpos($this_file, $this_included_file) !== false) {
4367  $avoid_skip = true;
4368  }
4369  }
4370  }
4371  if(!$avoid_skip) {
4372  $skip = true;
4373  break;
4374  }
4375  }
4376  }
4377  }
4378  if(empty($skip)) {
4379  $files_to_minify_array[$this_key] = $this_file;
4380  unset($files_array[$this_key]);
4381  }
4382  }
4383  if(!empty($_GET['update']) && $_GET['update'] == 1 && empty($GLOBALS['already_updated_minify_id_increment'])) {
4384  $GLOBALS['site_parameters']['minify_id_increment'] = intval($GLOBALS['site_parameters']['minify_id_increment'])+1;
4385  $GLOBALS['already_updated_minify_id_increment'] = true;
4386  }
4387  $cache_id = md5(implode(',', $files_to_minify_array) . ','. vb($GLOBALS['site_parameters']['minify_id_increment']));
4388  $file_name = $files_type . '_minified_' . substr($cache_id, 0, 8).'.'.$files_type;
4389  $minified_doc_root = $GLOBALS['dirroot'] . '/'.$GLOBALS['site_parameters']['cache_folder'].'/';
4390  $file_path = $minified_doc_root . $file_name;
4391  if (file_exists($file_path) === false || (($filemtime = @filemtime($file_path)) < time() - $lifetime) || (!empty($_GET['update']) && $_GET['update'] == 1)) {
4392  if(!empty($_GET['update']) && $_GET['update'] == 1) {
4393  $generate = true;
4394  } elseif(!empty($filemtime)) {
4395  foreach($files_to_minify_array as $this_key => $this_file) {
4396  // On regarde les fichiers à fusionner pour voir si ils ont changé depuis la dernière création du fichier de cache
4397  if(strpos($this_file, '//') === false || strpos($this_file, $GLOBALS['wwwroot']) !== false) {
4398  // On ne peut faire le test si fichier récent ou pas que si il est en local
4399  $this_local_path = str_replace($GLOBALS['wwwroot'], $GLOBALS['dirroot'], $this_file);
4400  $this_mtime = @filemtime($this_local_path);
4401  if(empty($this_mtime) && !file_exists($this_local_path)) {
4402  // Le fichier est en local et n'existe pas, on ne tient donc pas compte de ce fichier
4403  unset($files_to_minify_array[$this_key]);
4404  }
4405  if($this_mtime < $filemtime) {
4406  // Fichier minified pas à jour
4407  $generate = true;
4408  }
4409  } elseif(strpos($this_file, $this_wwwroot) !== false) {
4410  // Fichier sur cdn peut-être modifié => fichier minified peut-être pas à jour, et est donc à regénérer
4411  $generate = true;
4412  } elseif(strpos($this_file, 'googleapis') !== false) {
4413  if($filemtime < time() - min($lifetime*24, 3600*24)) {
4414  // Fichier sur googleapis peut-être modifié => fichier minified peut-être pas à jour, et est donc à regénérer
4415  $generate = true;
4416  }
4417  } else {
4418  if($filemtime < time() - min($lifetime*24, 3600*24)) {
4419  // Fichier externe de CSS peut-être modifié => fichier minified peut-être pas à jour, et est donc à regénérer
4420  $generate = true;
4421  }
4422  }
4423  }
4424  } else {
4425  // Fichier absent
4426  $generate = true;
4427  }
4428  if(!empty($generate)) {
4429  $output = '';
4430  if($files_type == 'css') {
4431  require_once($GLOBALS['dirroot'] . '/lib/class/Minify_CSS.php');
4432  } elseif($files_type == 'js') {
4433  if(!version_compare(PHP_VERSION, '5.3.0', '<')) {
4434  // JShrink non compatible si PHP < 5.3 => on désactive la minification
4435  require_once($GLOBALS['dirroot'] . '/lib/class/JShrink.php');
4436  }
4437  }
4438  foreach($files_to_minify_array as $this_key => $this_file) {
4439  if($files_type == 'css') {
4440  $symlinks = array();
4441  $docroot = $GLOBALS['dirroot'];
4442  if(String::strlen($GLOBALS['apparent_folder'])>1 && String::strpos($this_wwwroot, String::substr($GLOBALS['apparent_folder'], 0, String::strlen($GLOBALS['apparent_folder']) - 1)) !== false) {
4443  $this_http_main_path = String::substr($this_wwwroot, 0, String::strlen($this_wwwroot) - String::strlen($GLOBALS['apparent_folder']) + 1);
4444  if(empty($GLOBALS['site_parameters']['avoid_lang_folders_in_minified_css']) && !empty($GLOBALS['lang_url_rewriting'][$_SESSION['session_langue']]) && strpos($GLOBALS['lang_url_rewriting'][$_SESSION['session_langue']], '//') === false && strpos($GLOBALS['lang_url_rewriting'][$_SESSION['session_langue']], '.') === false) {
4445  // On n'a pas choisi d'activer l'option pour avoir des liens vers les fichiers sans les dossiers de langue
4446  // Donc il faut corriger le chemin qu'on vient de retravailler
4447  $this_http_main_path = String::substr($this_http_main_path, 0, String::strlen($this_http_main_path) - String::strlen($GLOBALS['lang_url_rewriting'][$_SESSION['session_langue']]));
4448  }
4449  } else {
4450  $this_http_main_path = $this_wwwroot;
4451  }
4452  $options = array('currentDir' => str_replace($this_http_main_path, $GLOBALS['dirroot'], dirname($this_file)), 'docRoot' => $docroot, 'symlinks' => $symlinks);
4453  $css_content = String::file_get_contents_utf8(str_replace($this_wwwroot, $GLOBALS['dirroot'], $this_file));
4454  if(!empty($css_content) && strlen(trim($css_content))>5) {
4455  if(String::strpos(str_replace('@import url(http://fonts.googleapis.com', '', $css_content), '@import')!==false) {
4456  // On rajoute à la liste des exclusions le fichier concerné si il y a @import dedans pour éviter les dysfonctionnements, sauf si c'est l'import d'une font externe
4457  $GLOBALS['site_parameters']['minify_css_exclude_array'][] = $this_file;
4458  set_configuration_variable(array('technical_code' => 'minify_css_exclude_array', 'string' => get_string_from_array($GLOBALS['site_parameters']['minify_css_exclude_array']), 'type' => 'array', 'origin' => 'auto '.date('Y-m-d'), 'site_id' => $GLOBALS['site_id']), true);
4459  continue;
4460  }
4461  if(strlen($css_content)/max(1,substr_count($css_content, "\n"))>50) {
4462  // Si le fichier semble déjà être minified, on ne cherche pas à compresser davantage => gain de temps et limite les risques d'altération du fichier
4463  // Néanmoins on appelle quand même la classe minify qui va corriger les chemins des URL appelées dans le fichier
4464  $options['do_compress'] = false;
4465  }
4466  $output .= "\n\n\n".Minify_CSS::minify($css_content, $options);
4467  } else {
4468  trigger_error('Minify CSS impossible - File load problem : '.str_replace($this_wwwroot, $GLOBALS['dirroot'], $this_file), E_USER_NOTICE);
4469  if(file_exists($file_path)) {
4470  // Le fichier minified attendu existe déjà => même si il est périmé, on le laisse tel qu'il est
4471  // On annule donc le travail déjà fait et on sort en gardant le fichier existant
4472  $output = null;
4473  $write_result = true;
4474  break;
4475  } else {
4476  // Le fichier minified n'existe pas, et on a un problème => on ne va pas du tout faire de minify
4477  // Si on voulait néanmoins écrire le fichier minified partiel, il faudrait repartir de manière récursive. Et à chaque appel de page, ça aurait lieu => pas une bonne idée pour les ressources serveur
4478  // Donc on renvoie la liste des fichiers CSS complète sans altération
4479  return $original_files_array;
4480  }
4481  }
4482  } elseif($files_type == 'js') {
4483  $js_content = String::file_get_contents_utf8(str_replace($this_wwwroot, $GLOBALS['dirroot'], $this_file));
4484  if(!empty($js_content) && strlen(trim($js_content))>5) {
4485  // Le fichier n'est pas vide, on le prend
4486  if(strlen($js_content)/max(1,substr_count($js_content, "\n"))>50 || version_compare(PHP_VERSION, '5.3.0', '<')) {
4487  // NB : Si le fichier semble déjà être minified, on ne cherche pas à compresser davantage => gain de temps et limite les risques d'altération du fichier
4488  $output .= "\n\n\n" . $js_content;
4489  }else {
4490  $output .= "\n\n\n" . Minifier::minify($js_content);
4491  }
4492  }
4493  } else {
4494  $output .= "\n\n\n".String::file_get_contents_utf8(str_replace($this_wwwroot, $GLOBALS['dirroot'], $this_file));
4495  }
4496  }
4497  if(!empty($output)) {
4498  $output = trim($output);
4500  @flock($fp, LOCK_EX);
4501  // On utilise strlen et non pas String::strlen car on veut le nombre d'octets et non pas de caractères
4502  $write_result = fwrite($fp, $output, strlen($output));
4503  @flock($fp, LOCK_UN);
4504  fclose($fp);
4505  set_configuration_variable(array('technical_code' => 'minify_id_increment', 'string' => $GLOBALS['site_parameters']['minify_id_increment'], 'type' => 'integer', 'origin' => 'auto '.date('Y-m-d'), 'site_id' => $GLOBALS['site_id']), true);
4506  }
4507  if(!$write_result) {
4508  return $files_array;
4509  }
4510  } else {
4511  // On valide le fichier pour une nouvelle période de durée $lifetime
4512  touch($file_path);
4513  }
4514  }
4515  // On remet le fichier CSS minifié en position dans le tableau de tous les CSS à charger, à la position du premier fichier qui a été minifié (pour respecter au mieux les priorités)
4516  $files_array[key($files_to_minify_array)] = str_replace($GLOBALS['dirroot'], $this_wwwroot, $file_path);
4517  return $files_array;
4518 }
4519 
4526 function get_load_facebook_sdk_script($facebook_api_id = null) {
4527  static $sdk_loaded;
4528  $output = '';
4529  if(empty($sdk_loaded)) {
4530  $sdk_loaded = true;
4531  $output .= '
4532 <div id="fb-root"></div>
4533 ';
4534  $GLOBALS['js_content_array']['facebook_sdk'] = '
4535 (function(d, s, id) {
4536  var js, fjs = d.getElementsByTagName(s)[0];
4537  if (d.getElementById(id)) return;
4538  js = d.createElement(s); js.id = id;
4539  js.src = "//connect.facebook.net/fr_FR/all.js#xfbml=1'.(!empty($facebook_api_id)?'&appId='.$facebook_api_id:'').'";
4540  fjs.parentNode.insertBefore(js, fjs);
4541 }(document, \'script\', \'facebook-jssdk\'));';
4542  }
4543  return $output;
4544 }
4545 
4555 function get_quick_search_results($search, $maxRows, $active_only = false, $search_category = null, $mode = 'products') {
4556  $queries_results_array = array();
4557  if($mode=='products'){
4558  $sql_additional_cond = '';
4559  $sql_additional_join = '';
4560  if(!empty($GLOBALS['site_parameters']['quick_search_results_main_search_field'])) {
4561  $name_field = $GLOBALS['site_parameters']['quick_search_results_main_search_field'];
4562  } else {
4563  $name_field = "nom_".(!empty($GLOBALS['site_parameters']['product_name_forced_lang'])?$GLOBALS['site_parameters']['product_name_forced_lang']:$_SESSION['session_langue'])."";
4564  }
4565  // Pour optimiser, on segmente la recherche en plusieurs requêtes courtes
4566  if($active_only) {
4567  $sql_additional_cond .= " AND etat='1'";
4568  }
4569  if(is_numeric($search)) {
4570  $queries_sql_array[] = "SELECT p.*, p." . word_real_escape_string($name_field) . " AS nom
4571  FROM peel_produits p
4572  WHERE (p.id='" . nohtml_real_escape_string($search) . "' OR ean_code = '" . nohtml_real_escape_string($search) . "') AND " . get_filter_site_cond('produits', 'p') . "" . $sql_additional_cond . "
4573  LIMIT 1";
4574  }
4575  if(!empty($search_category)) {
4576  $sql_additional_cond .= " AND pc.categorie_id IN ('" . implode("','", get_category_tree_and_itself(intval($search_category), 'sons', 'categories')) . "')";
4577  $sql_additional_join .= 'INNER JOIN peel_produits_categories pc ON pc.produit_id=p.id';
4578  }
4579  $queries_sql_array[] = "SELECT p.*, p." . word_real_escape_string($name_field) . " AS nom
4580  FROM peel_produits p
4581  ".$sql_additional_join."
4582  WHERE p." . word_real_escape_string($name_field) . " LIKE '" . nohtml_real_escape_string($search) . "%' AND " . get_filter_site_cond('produits', 'p') . "" . $sql_additional_cond . "
4583  ORDER BY p." . word_real_escape_string($name_field) . " ASC";
4584  $queries_sql_array[] = "SELECT p.*, p." . word_real_escape_string($name_field) . " AS nom
4585  FROM peel_produits p
4586  ".$sql_additional_join."
4587  WHERE p.reference LIKE '" . nohtml_real_escape_string($search) . "%' AND p." . word_real_escape_string($name_field) . "!='' AND " . get_filter_site_cond('produits', 'p') . "" . $sql_additional_cond . "
4588  ORDER BY IF(p.reference LIKE '" . nohtml_real_escape_string($search) . "',1,0) DESC, p." . word_real_escape_string($name_field) . " ASC";
4589  if(empty($GLOBALS['site_parameters']['autocomplete_fast_partial_search'])) {
4590  $queries_sql_array[] = "SELECT p.*, p." . word_real_escape_string($name_field) . " AS nom
4591  FROM peel_produits p
4592  ".$sql_additional_join."
4593  WHERE (ean_code = '" . nohtml_real_escape_string($search) . "' OR p." . word_real_escape_string($name_field) . " LIKE '%" . nohtml_real_escape_string($search) . "%' OR (p.reference LIKE '%" . nohtml_real_escape_string($search) . "%' AND p." . word_real_escape_string($name_field) . "!=''))" . $sql_additional_cond . " AND " . get_filter_site_cond('produits', 'p') . "
4594  ORDER BY p." . word_real_escape_string($name_field) . " ASC";
4595  }
4596  foreach($queries_sql_array as $this_query_sql) {
4597  if(String::strpos($this_query_sql, 'LIMIT') === false) {
4598  $this_query_sql .= ' LIMIT '.intval($maxRows);
4599  }
4600  $query = query($this_query_sql);
4601  while ($result = fetch_object($query)) {
4602  $queries_results_array[$result->id] = $result;
4603  }
4604  if(count($queries_results_array) >= $maxRows) {
4605  break;
4606  }
4607  }
4608  } elseif($mode=='offers') {
4609  if(!empty($GLOBALS['site_parameters']['user_offers_table_enable'])) {
4610  $sql = 'SELECT *
4611  FROM peel_offres
4612  WHERE num_offre LIKE "'.nohtml_real_escape_string($search).'%"
4613  LIMIT '.$maxRows;
4614  $query = query($sql);
4615  while ($result = fetch_object($query)) {
4616  $queries_results_array[$result->id] = $result;
4617  }
4618  }
4619  } elseif($mode=='offer_add_user') {
4620  $sql = 'SELECT *
4621  FROM peel_utilisateurs
4622  WHERE (prenom LIKE "%'.nohtml_real_escape_string($search).'%" OR nom_famille LIKE "%'.nohtml_real_escape_string($search).'%") AND ' . get_filter_site_cond('utilisateurs') . '
4623  LIMIT '.intval($maxRows);
4624  $query = query($sql);
4625  while ($result = fetch_object($query)) {
4626  $queries_results_array[$result->id_utilisateur] = $result;
4627  }
4628  }
4629  return $queries_results_array;
4630 }
4631 
4643 function 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) {
4644  if($table_technical_code == '') {
4645  // Pour certaine table, le champ qui contient l'id du site n'est pas site_id, mais id_ecom
4646  $field = 'id_ecom';
4647  } else {
4648  // Cas général
4649  $field = 'site_id';
4650  }
4651  if(is_array($specific_site_id)) {
4652  $specific_site_id = current($specific_site_id);
4653  }
4654  if(in_array($table_technical_code, array('continents'))) {
4655  // Cette table n'est pas multisite.
4656  return 1;
4657  }
4658  if(!empty($GLOBALS['site_parameters']['multisite_disable']) || !empty($GLOBALS['site_parameters']['multisite_disable_' . $table_technical_code])) {
4659  // Désactivation du multisite pour accélérer les requêtes sur un site isolé
4660  return 1;
4661  } elseif(defined('IN_IPN') && !empty($GLOBALS['site_parameters']['multisite_disable_in_ipn'])) {
4662  // Désactivation du multisite pour accélérer les requêtes sur un site isolé
4663  return 1;
4664  }
4665  if(!empty($table_alias)) {
4666  // Utilise l'alias de la table comme préfix. L'alias de la table est défini dans la requête
4667  $prefix = word_real_escape_string($table_alias) . '.';
4668  } elseif($table_alias === null) {
4669  $prefix = 'peel_' . word_real_escape_string($table_technical_code) . '.';
4670  } else {
4671  // table sans prefix, dans la cas d'une interconnexion avec des scripts spécifiques qui ne respectent pas cette norme
4672  $prefix = '';
4673  }
4674  if ($specific_site_id !== null) {
4675  // Utilise le site_id spécifié en paramètre, utile pour manipuler des données qui ne concernent pas le site qui exécute la page. $specific_site_id peut être égal à 0.
4676  $site_id = $specific_site_id;
4677  } else {
4678  if(empty($GLOBALS['site_id']) && defined('IN_CRON') && $use_strict_rights_if_in_admin === false && $exclude_public_items === false) {
4679  // $GLOBALS['site_id'] est vide, et on ne cherche pas à avoir des droits d'administration particuliers
4680  // On est dans un cron, on veut gérer tous les sites en même temps sans avoir à charger la configuration de chaque site
4681  return 1;
4682  }
4683  // Utilise l'id du site en cours de consultation (cas général). $GLOBALS['site_id'] est défini au chargement du site
4684  $site_id = vn($GLOBALS['site_id']);
4685  }
4686  if (defined('IN_PEEL_ADMIN')) {
4687  if(isset($_SESSION['session_utilisateur']['site_id']) && $_SESSION['session_utilisateur']['site_id'] == 0) {
4688  // L'administrateur a les droits sur tous les sites
4689  if($admin_force_multisite_if_allowed) {
4690  // Lorsque l'ensemble des sites est concerné par la requête et pas seulement un site, ou que la configuration générale l'impose, aucun filtre sur site_id ne doit être ajouté.
4691  return 1;
4692  } elseif(isset($_SESSION['session_admin_multisite']) && $specific_site_id === null) {
4693  if(intval($_SESSION['session_admin_multisite'])==0) {
4694  // on administre tous les sites en même temps
4695  return 1;
4696  } else {
4697  // on administre un autre site, d'après la préférence de l'administrateur mise en session
4698  $site_id = intval($_SESSION['session_admin_multisite']);
4699  if($use_strict_rights_if_in_admin) {
4700  $exclude_public_items = true;
4701  }
4702  }
4703  }
4704  } elseif($specific_site_id === null) {
4705  // L'administrateur ne peut administrer que son propre site
4706  if($use_strict_rights_if_in_admin) {
4707  $exclude_public_items = true;
4708  }
4709  if(((!est_identifie() || !isset($_SESSION['session_utilisateur']['site_id'])) && $site_id != vn($GLOBALS['site_id'])) || (est_identifie() && $_SESSION['session_utilisateur']['site_id'] != $site_id && $_SESSION['session_utilisateur']['site_id'] != 0)) {
4710  // problème de droit : sécurité, on empêche l'administrateur d'agir sur un site qui ne le concerne pas. Si l'administrateur est associé à site_id = 0, il peut administrer tous les sites, donc cette contrainte ne s'applique pas
4711  return 0;
4712  }
4713  }
4714  } elseif(!empty($site_id) && !empty($_SESSION['session_utilisateur']['site_id']) && $site_id != $_SESSION['session_utilisateur']['site_id'] && $site_id != vn($GLOBALS['site_id']) && empty($GLOBALS['site_parameters']['multisite_disable_utilisateurs'])) {
4715  // Protection sur les site_id autorisés : sécurité, on empêche l'utilisateur d'agir sur un site qui ne le concerne pas
4716  return 0;
4717  } elseif(isset($_SESSION['session_site_country']) && !empty($GLOBALS['site_parameters']['site_country_allowed_array']) && in_array($table_technical_code, array('articles', 'marques', 'html', 'produits', 'vignettes_carrousels'))) {
4718  // Gestion de l'affichage de contenu spécifique en fonction du pays du visiteur. Cette fonction nécessite une mise en place spécifique en SQL et n'est pas standard.
4719  // Si pas dans un contexte d'administration de la donnée : ajout de la condition de le pays du visiteur
4720  $cond_array[] = "FIND_IN_SET('" . real_escape_string($_SESSION['session_site_country']) . "', " . $prefix . "site_country)";
4721  }
4722 
4723  if($exclude_public_items) {
4724  // La requête concerne un seul site, sans tenir compte de la configuration globale.
4725  if(empty($GLOBALS['site_parameters']['multisite_using_array_for_site_id'])) {
4726  $cond_array[] = $prefix.word_real_escape_string($field)."='".intval($site_id)."'";
4727  } else {
4728  $cond_array[] = "FIND_IN_SET('" . intval($site_id) . "', " . $prefix.word_real_escape_string($field) . ")";
4729  }
4730  } else {
4731  if(empty($GLOBALS['site_parameters']['multisite_using_array_for_site_id'])) {
4732  // Concerne un site, ou tous les sites
4733  $cond_array[] = $prefix.word_real_escape_string($field)." IN (0,'" . intval($site_id) . "')";
4734  } else {
4735  $cond_array[] = "(FIND_IN_SET('0', " . $prefix.word_real_escape_string($field) . ") OR FIND_IN_SET('" . intval($site_id) . "', " . $prefix.word_real_escape_string($field) . "))";
4736  }
4737  }
4738  return implode(' AND ', $cond_array);
4739 }
4740 
4747 function get_site_id_sql_set_value($site_ids) {
4748  $output = '';
4749  if(!is_array($site_ids)) {
4750  $site_ids = array($site_ids);
4751  }
4752  $output = "" . implode(",", $site_ids) . "";
4753  return $output;
4754 }
4755 
4763 function get_site_name($site_ids, $skip_rights_check = false) {
4764  static $all_sites_name_array;
4765  $output_array = array();
4766  if(!is_array($site_ids)) {
4767  $site_ids = explode(',', $site_ids);
4768  }
4769  foreach($site_ids as $this_site_id) {
4770  if($this_site_id == 0) {
4771  $output_array[] = vb($GLOBALS['STR_ADMIN_ALL_SITES'], '*');
4772  } else {
4773  if(!isset($all_sites_name_array)) {
4774  $all_sites_name_array = get_all_sites_name_array(false, false, !empty($GLOBALS['site_parameters']['multisite_get_all_site_names_always_allow']));
4775  }
4776  if(isset($all_sites_name_array[$this_site_id])) {
4777  $output_array[] = $all_sites_name_array[$this_site_id];
4778  }
4779  }
4780  }
4781  return implode(', ', $output_array);
4782 }
4783 
4792 function get_all_sites_name_array($admin_force_multisite_if_allowed = false, $allow_null_site_id = false, $skip_rights_check = false) {
4793  $all_sites_name_array = array();
4794  // site_id>0 est utile pour ne pas lister les sites avec site_id = 0 qui est en théorie impossible en dehors d'une erreur d'administration
4795  // Sélection des site_id qui existe en base de donnée.
4796  $sql = 'SELECT site_id
4797  FROM peel_configuration
4798  WHERE ' . (!$allow_null_site_id?'site_id!="0" ':'') . ' ' . (!$skip_rights_check?'AND '.get_filter_site_cond('configuration', null, true, null, false, $admin_force_multisite_if_allowed):'') . '
4799  GROUP BY site_id';
4800  $query = query($sql);
4801  while($result = fetch_assoc($query)) {
4802  // Sélection du nom du site.
4803  $query_name = query('SELECT string
4804  FROM peel_configuration
4805  WHERE site_id="' . nohtml_real_escape_string(get_site_id_sql_set_value($result['site_id'])).'" AND technical_code="nom_' . $_SESSION['session_langue'] . '"
4806  LIMIT 1');
4807  $result_name = fetch_assoc($query_name);
4808  if (!empty($result_name['string'])) {
4809  $all_sites_name_array[$result['site_id']] = $result_name['string'];
4810  } else {
4811  // Le nom du site n'a pas été trouvé. On récupère le wwwroot pour ce site afin d'afficher quand même une valeur.
4812  $query_wwwroot = query('SELECT string
4813  FROM peel_configuration
4814  WHERE site_id="' . nohtml_real_escape_string(get_site_id_sql_set_value($result['site_id'])).'" AND technical_code="wwwroot"
4815  LIMIT 1');
4816  $result_wwwroot = fetch_assoc($query_wwwroot);
4817  $all_sites_name_array[$result['site_id']] = str_replace(array('http://' ,'https://'), '', $result_wwwroot['string']);
4818  }
4819  }
4820  return $all_sites_name_array;
4821 }
4822 
4828 function get_user_job_options($selected_fonction_name = null)
4829 {
4830  $output = '';
4831  if (!empty($GLOBALS['site_parameters']['user_job_array'])) {
4832  $tpl_options = array();
4833  foreach($GLOBALS['site_parameters']['user_job_array'] as $this_job_code=>$this_job) {
4834  if(String::substr($this_job, 0, 4)== 'STR_' && !empty($GLOBALS[$this_job])) {
4835  // Si le nom est une variable de langue, il faut utiliser cette variable.
4836  $this_job = $GLOBALS[$this_job];
4837  }
4838  $output .= '<option value="'.String::str_form_value($this_job_code).'" ' . frmvalide($selected_fonction_name == $this_job_code, ' selected="selected"') . '>'.$this_job.'</option>';
4839  }
4840  }
4841  return $output;
4842 }
4843 
4849 function get_generic_options($values_array, $selected_values = null)
4850 {
4851  $output = '';
4852  $tpl = $GLOBALS['tplEngine']->createTemplate('generic_options.tpl');
4853  $tpl_options = array();
4854  foreach ($values_array as $tab_type) {
4855  $tpl_options[] = array(
4856  'value' => String::str_form_value($tab_type['id']),
4857  'name' => $tab_type['name'],
4858  'issel' => ($tab_type['id'] == $selected_values)
4859  );
4860  }
4861  $tpl->assign('options', $tpl_options);
4862  $output .= $tpl->fetch();
4863  return $output;
4864 }
4865 
4873 function get_site_wwwroot($site_id, $lang = null)
4874 {
4875  static $output;
4876  if(empty($output[$site_id.'_'.$lang])) {
4877  if(!empty($site_id)) {
4878  $sql = "SELECT c.string, l.url_rewriting
4879  FROM peel_configuration c
4880  LEFT JOIN peel_langues l ON l.lang='" . real_escape_string($lang) . "' AND " . get_filter_site_cond('langues', 'l', false, $site_id) . "
4881  WHERE c.technical_code = 'wwwroot' AND " . get_filter_site_cond('configuration', 'c', false, $site_id) . " AND c.etat=1
4882  LIMIT 1";
4883  $query = query($sql);
4885  }
4886  if(!empty($result)) {
4887  $output[$site_id.'_'.$lang] = get_lang_rewrited_wwwroot($lang, $result['string'], $result['url_rewriting']);
4888  } else {
4889  $output[$site_id.'_'.$lang] = get_lang_rewrited_wwwroot($lang);
4890  }
4891  }
4892  return $output[$site_id.'_'.$lang];
4893 }
4894 
4902 function handle_contact_form($frm, $skip_introduction_text = false) {
4903  include($GLOBALS['dirroot'] . "/lib/fonctions/display_user_forms.php");
4904  if (check_if_module_active('photodesk')) {
4905  include($GLOBALS['fonctionsphotodesk']);
4906  }
4907  $output = '';
4908  $form_error_object = new FormError();
4909 
4910  if (!empty($frm) && empty($_GET['prodid'])) {
4911  if (!empty($frm['phone'])) {
4912  // Formulaire de demande de rappel par téléphone
4913  // Non implémenté par défaut
4914  $frm['nom'] = $frm['phone'];
4915  $frm['telephone'] = $frm['phone'];
4916  $frm['sujet'] = $GLOBALS["STR_CALL_BACK_EMAIL"]; // Variable de langue à définir
4917  } else {
4918  // Le formulaire a été soumis, on essaie de créer un nouveau compte d'utilisateur
4919  if (!empty($GLOBALS['site_parameters']['contact_form_short_mode'])) {
4920  $form_error_object->valide_form($frm,
4921  array('nom' => $GLOBALS['STR_ERR_NAME'],
4922  'email' => $GLOBALS['STR_ERR_EMAIL'],
4923  'texte' => $GLOBALS['STR_ERR_MESSAGE'],
4924  'token' => ''));
4925  } else {
4926  $form_error_object->valide_form($frm,
4927  array('nom' => $GLOBALS['STR_ERR_NAME'],
4928  'telephone' => $GLOBALS['STR_ERR_TEL'],
4929  'email' => $GLOBALS['STR_ERR_EMAIL'],
4930  'texte' => $GLOBALS['STR_ERR_MESSAGE'],
4931  'sujet' => $GLOBALS['STR_ERR_SUBJECT'],
4932  'token' => ''));
4933  }
4934  if (!$form_error_object->has_error('email')) {
4935  $frm['email'] = trim($frm['email']);
4936  if (!EmailOK($frm['email'])) {
4937  // si il y a un email on teste l'email
4938  $form_error_object->add('email', $GLOBALS['STR_ERR_EMAIL_BAD']);
4939  }
4940  }
4941  if (isset($frm['commande_id']) && !$form_error_object->has_error('commande_id') && vb($frm['sujet']) == $GLOBALS['STR_CONTACT_SELECT3'] && empty($frm['commande_id'])) {
4942  $form_error_object->add('commande_id', $GLOBALS['STR_ERR_ORDER_NUMBER']);
4943  }
4944  if (check_if_module_active('captcha')) {
4945  if (empty($frm['code'])) {
4946  // Pas de tentative de déchiffrement, on laisse le captcha
4947  $form_error_object->add('code', $GLOBALS['STR_EMPTY_FIELD']);
4948  } else {
4949  if (!check_captcha($frm['code'], $frm['code_id'])) {
4950  $form_error_object->add('code', $GLOBALS['STR_CODE_INVALID']);
4951  // Code mal déchiffré, on en donne un autre
4952  delete_captcha(vb($frm['code_id']));
4953  unset($frm['code']);
4954  }
4955  }
4956  }
4957  }
4958  if (!verify_token('user_contact', 120, false, true, 5)) {
4959  // Le délai de 5s permet d'éviter du spam de la part de robots simples qui chargent le token et appellent en POST la validation de formulaire
4960  // Ce délai ne doit pas être trop long pour un utilisateur qui revalide son formulaire déjà tout rempli suite à premier envoi incomplet
4961  $form_error_object->add('token', $GLOBALS['STR_INVALID_TOKEN']);
4962  }
4963  if (!$form_error_object->count()) {
4964  if (check_if_module_active('captcha')) {
4965  // Code OK on peut effacer le code
4966  delete_captcha(vb($frm['code_id']));
4967  }
4968  if(empty($_SERVER['HTTP_USER_AGENT']) || $_SERVER['REQUEST_METHOD'] != "POST" || is_user_bot()) {
4969  // Protection du formulaire contre les robots
4970  die();
4971  }
4972  // Limitation du nombre de messages envoyés dans une session
4973  if (empty($_SESSION['session_form_contact_sent'])) {
4974  $_SESSION['session_form_contact_sent'] = 0;
4975  }
4976  if ($_SESSION['session_form_contact_sent'] < vb($GLOBALS['site_parameters']['contact_form_max_sent_by_session'], 8)) {
4977  if($_SESSION['session_form_contact_sent']>0) {
4978  sleep($_SESSION['session_form_contact_sent']);
4979  }
4980  $mail_spam_points = floor($_SESSION['session_form_contact_sent']*10/vb($GLOBALS['site_parameters']['contact_form_max_sent_by_session'], 8));
4981  if (check_if_module_active('spam')) {
4982  $mail_spam_points += getSpamPoints($frm['texte'], $frm['email']);
4983  }
4984  if($mail_spam_points <= vb($GLOBALS['site_parameters']['contact_form_max_spam_points_allowed'], 20)) {
4986  }
4987  $_SESSION['session_form_contact_sent']++;
4988  }
4989  // Même si la limite d'envois autorisés est atteinte, on dit que c'est OK à l'utilisateur pour que le spammeur ne se rende pas compte qu'il est découvert
4990  $frm['is_ok'] = true;
4991  // Si le module webmail est activé, on insère dans la table webmail la requête user
4992  $output .= get_contact_success($frm);
4993  $form_validated = true;
4994  }
4995  } elseif (!empty($_GET['prodid'])) {
4996  $product_object = new Product($_GET['prodid'], null, false, null, true, !is_user_tva_intracom_for_no_vat() && !check_if_module_active('micro_entreprise'));
4998  if (!empty($frm['critere'])) {
4999  // Affichage des combinaisons de couleur et taille dans un unique select
5000  $criteres = explode("|", $frm['critere']);
5001  $couleur_id = intval(vn($criteres[0]));
5002  $taille_id = intval(vn($criteres[1]));
5003  } else {
5004  $couleur_id = intval(vn($frm['couleur']));
5005  $taille_id = intval(vn($frm['taille']));
5006  }
5007  // On enregistre la taille pour revenir sur la bonne valeur du select
5008  $_SESSION['session_taille_id'] = $taille_id;
5009  // On enregistre le message à afficher si la quantité demandée est trop élevée par rapport au stock disponnible
5010  $product_object->set_configuration($couleur_id, $taille_id, $attribut_list, check_if_module_active('reseller') && is_reseller());
5011 
5012  $color = $product_object->get_color();
5013  $size = $product_object->get_size();
5014 
5015  $frm['texte'] = $GLOBALS['STR_PRODUCT'] . $GLOBALS['STR_BEFORE_TWO_POINTS'] . ": " .$product_object->name.
5016  (!empty($color)?"\r\n" . $GLOBALS['STR_COLOR'] . $GLOBALS['STR_BEFORE_TWO_POINTS'] . ": " . $color :'' ).
5017  (!empty($size)?"\r\n" . $GLOBALS['STR_SIZE'] . $GLOBALS['STR_BEFORE_TWO_POINTS'] . ": " . $size :'' ).
5018  (!empty($product_object->configuration_attributs_list) ? "\r\n" . str_replace('<br />', "\r\n", $product_object->configuration_attributs_description) : '');
5019  }
5020 
5021  if(empty($form_validated)) {
5022  if (!empty($noticemsg)) {
5023  $output .= $noticemsg;
5024  }
5025  if(empty($frm) && est_identifie()) {
5026  $frm['email'] = vb($_SESSION['session_utilisateur']['email']);
5027  $frm['telephone'] = vb($_SESSION['session_utilisateur']['telephone']);
5028  $frm['nom'] = vb($_SESSION['session_utilisateur']['nom_famille']);
5029  $frm['prenom'] = vb($_SESSION['session_utilisateur']['prenom']);
5030  $frm['societe'] = vb($_SESSION['session_utilisateur']['societe']);
5031  $frm['adresse'] = vb($_SESSION['session_utilisateur']['adresse']);
5032  $frm['ville'] = vb($_SESSION['session_utilisateur']['ville']);
5033  $frm['code_postal'] = vb($_SESSION['session_utilisateur']['code_postal']);
5034  if(isset($_SESSION['session_utilisateur']['pays'])) {
5035  $frm['pays'] = get_country_name($_SESSION['session_utilisateur']['pays']);
5036  }
5037  }
5038  $output .= get_contact_form($frm, $form_error_object, $skip_introduction_text);
5039  }
5040  return $output;
5041 }
5042 
5050 {
5051  $qid = query("SELECT *
5052  FROM peel_codes_promos
5053  WHERE nom = '" . nohtml_real_escape_string(String::strtoupper($frm['nom'])) . "' AND " . get_filter_site_cond('codes_promos') . "");
5054  if ($result = fetch_assoc($qid)) {
5055  return false;
5056  }
5057  if (empty($frm["date_debut"])) {
5058  $frm["date_debut"] = get_formatted_date(time());
5059  }
5060  if (empty($frm["date_fin"])) {
5061  $frm["date_fin"] = get_formatted_date(date("Y-m-d", mktime(0, 0, 0, date('m'), date('d') + 30, date('Y'))));
5062  }
5063  if (empty($frm['on_type'])) {
5064  $frm['on_type'] = 2;
5065  }
5066  if (empty($frm['source'])) {
5067  $frm['source'] = 'CHQ';
5068  }
5069  if (!isset($frm['nombre_prevue'])) {
5070  $frm['nombre_prevue'] = 1;
5071  }
5072  if (!isset($frm['nb_used_per_client'])) {
5073  $frm['nb_used_per_client'] = 1;
5074  }
5075 
5076  $sql = "INSERT INTO peel_codes_promos (
5077  nom
5078  , date_debut
5079  , date_fin
5080  , remise_percent
5081  , remise_valeur
5082  , email_ami
5083  , email_acheteur
5084  , on_type
5085  , on_check
5086  , montant_min
5087  , etat
5088  , source
5089  , id_utilisateur
5090  , site_id
5091  , id_categorie
5092  , nombre_prevue
5093  , nb_used_per_client
5094  , product_filter
5095  , cat_not_apply_code_promo
5096  ) VALUES (
5100  , '" . (vb($frm['on_type']) == 1 ? floatval(get_float_from_user_input(vn($frm['remise_percent']))) : '0') . "'
5101  , '" . (vb($frm['on_type']) == 2 ? floatval(get_float_from_user_input(vn($frm['remise_valeur']))) : '0') . "'
5102  , '" . nohtml_real_escape_string(vb($frm['email_ami'])) . "'
5103  , '" . nohtml_real_escape_string(vb($frm['email_acheteur'])) . "'
5104  , '" . intval($frm['on_type']) . "'
5105  , '" . intval(vb($frm['on_check'])) . "'
5106  , '" . floatval(get_float_from_user_input(vb($frm['montant_min']))) . "'
5107  , '" . intval(vn($frm['etat'])) . "'
5108  , '" . nohtml_real_escape_string(vb($frm['source'])) . "'
5109  , '" . intval(vb($frm['id_utilisateur'])) . "'
5110  , '" . nohtml_real_escape_string(get_site_id_sql_set_value(vn($frm['site_id'], $GLOBALS['site_id']))) . "'
5111  , '" . intval(vb($frm['id_categorie'])) . "'
5112  , '" . intval(vb($frm['nombre_prevue'])) . "'
5113  , '" . intval(vb($frm['nb_used_per_client'])) . "'
5114  , '" . nohtml_real_escape_string(vb($frm['product_filter'])) . "'
5115  , '" . nohtml_real_escape_string(get_string_from_array(vb($frm['cat_not_apply_code_promo']))) . "'
5116  )";
5117  query($sql);
5118  return insert_id();
5119 }
5120 
5121 
5128 {
5129  $query = query("SELECT max(tva) as default_vat
5130  FROM peel_tva
5131  WHERE " . get_filter_site_cond('tva'));
5132  if ($result = fetch_assoc($query)) {
5133  return $result['default_vat'];
5134  } else {
5135  // table TVA vide.
5136  return null;
5137  }
5138 }
5139 
5150 function get_specific_field_infos($frm, $form_error_object = null, $form_usage = "user", $step = null) {
5151  $specific_fields = array();
5152  $field_types_with_single_value_array = array('datepicker', 'hidden', 'password', 'separator', 'text', 'textarea', 'html', 'upload');
5153 
5154  $specific_field_prefix = $form_usage;
5155  if (in_array($form_usage, array('reseller', 'user'))) {
5156  $mandatory_field_prefix = 'user';
5157  } else {
5158  $mandatory_field_prefix = $specific_field_prefix;
5159  }
5160  $mandatory_fields = vb($GLOBALS['site_parameters'][$mandatory_field_prefix . '_mandatory_fields'], array());
5161  $specific_field_titles = template_tags_replace(vb($GLOBALS['site_parameters'][$specific_field_prefix . '_specific_field_titles']));
5162  $specific_field_types = vb($GLOBALS['site_parameters'][$specific_field_prefix . '_specific_field_types']);
5163  $specific_field_names = vb($GLOBALS['site_parameters'][$specific_field_prefix . '_specific_field_names']);
5164  $specific_field_values = vb($GLOBALS['site_parameters'][$specific_field_prefix . '_specific_field_values']);
5165  $specific_field_positions = vb($GLOBALS['site_parameters'][$specific_field_prefix . '_specific_field_positions']);
5166  $specific_field_steps = vb($GLOBALS['site_parameters'][$specific_field_prefix . '_specific_field_steps']);
5167 
5168 
5169  if(!empty($specific_field_titles)) {
5170  foreach($specific_field_titles as $this_field => $this_title) {
5171  // Les noms des différents champs dans l'étape sont séparés par des virgules
5172  if (!empty($specific_field_steps) && is_numeric($step) && !empty($specific_field_steps[$step]) && !in_array($this_field, get_array_from_string($specific_field_steps[$step]))) {
5173  // Si le formulaire est segmenté par étape, $specific_field_steps[$step] contient le tableau des champs qui sont configurés pour être affichés à l'étape $step. Si le champ n'est pas trouvé dans ce tableau, on passe au champ suivant.
5174  continue;
5175  }
5176  unset($tpl_options);
5177  unset($this_value);
5178  if(String::substr($this_title, 0, 4)== 'STR_') {
5179  // Le titre est une variabe de langue
5180  $this_title = $GLOBALS[$this_title];
5181  }
5182  if (defined('IN_CHANGE_PARAMS') && !empty($GLOBALS['site_parameters']['disable_user_specific_field_on_change_params_page']) && in_array($this_field, $GLOBALS['site_parameters']['disable_user_specific_field_on_change_params_page'])) {
5183  // permet d'avoir des champs spécifiques qui seront utilisé lors de l'inscription, et ne pas les afficher sur la page de changement de paramètres
5184  continue;
5185  }
5186  $this_position = vb($specific_field_positions[$this_field]);
5187  $field_type = vb($specific_field_types[$this_field], 'text');
5188 
5189  // Le champ paramétré fait partie des champs valides. Ca évite les erreurs de saisie, et d'avoir un affichage incohérent.
5190  if (empty($specific_field_values[$this_field]) && in_array($specific_field_types[$this_field], array('radio','hidden','checkbox'))) {
5191  // La valeur est obligatoire pour un champ hidden, checkbox ou radio.
5192  continue;
5193  }
5194  // Récupération d'éventuelle valeur préremplie stockée dans $frm, venant de BDD ou d'un formulaire
5195  if ($field_type == 'checkbox') {
5196  if (isset($frm[$this_field])) {
5197  if (is_array($frm[$this_field])) {
5198  // Si $frm vient directement du formulaire, les valeurs pour les checkbox sont sous forme de tableau.
5199  $frm_this_field_values_array = $frm[$this_field];
5200  } else {
5201  // pour les checkbox, $frm[$this_field] peut contenir plusieurs valeurs séparées par des virgules si les données viennent de la BDD
5202  $frm_this_field_values_array = explode(',', $frm[$this_field]);
5203  }
5204  }
5205  } else {
5206  // Pour les autres champs, $frm[$this_field] contient une valeur unique.
5207  $frm_this_field_values_array = array(vb($frm[$this_field]));
5208  }
5209  if (empty($frm_this_field_values_array[0])) {
5210  // la valeur est vide, on regarde si une valeur par défaut est rempli.
5211  if (defined('IN_PEEL_ADMIN')) {
5212  // Valeur par défaut dans l'administration
5213  $frm_this_field_values_array = array(vb($GLOBALS['site_parameters']['funding_admin_form_default_values'][$this_field]));
5214  } else {
5215  // valeur par défaut en front office
5216  $frm_this_field_values_array = array(vb($GLOBALS['site_parameters']['funding_form_default_values'][$this_field]));
5217  }
5218  }
5219  $this_field_infos = array('field_type' => $field_type,
5220  'field_name' => $this_field,
5221  'field_title' => $this_title,
5222  'field_position' => $this_position,
5223  'mandatory' => (!empty($mandatory_fields[$this_field])),
5224  'error_text' => (is_object($form_error_object)?$form_error_object->text($this_field):''),
5225  'STR_CHOOSE' => $GLOBALS['STR_CHOOSE']
5226  );
5227  if (in_array($field_type, $field_types_with_single_value_array) || empty($field_type) || empty($specific_field_names[$this_field])) {
5228  if (!empty($frm_this_field_values_array[0])) {
5229  // Pour récuperer la valeur d'un champ text, la valeur du formulaire $frm_this_field_values_array a priorité sur la valeur prédéfinie en back office.
5230  $this_value = $frm_this_field_values_array[0];
5231  } else {
5232  $this_value = template_tags_replace(vb($specific_field_values[$this_field]));
5233  }
5234  if($field_type == 'html') {
5235  $this_field_infos['text_editor_html'] = getTextEditor($this_field, '100%', 300, $this_value, null, 3);
5236  } else {
5237  if ($field_type == 'datepicker') {
5238  $this_value = get_formatted_date($this_value);
5239  }
5240  $this_field_infos['field_value'] = $this_value;
5241  }
5242  } else {
5243  $this_field_names = explode(',', template_tags_replace(vb($specific_field_names[$this_field])));
5244  // Préparation du tableau de valeurs
5245  $this_field_values = explode(',', template_tags_replace($specific_field_values[$this_field]));
5246  foreach($this_field_values as $this_key => $this_value) {
5247  if(String::substr($this_value, 0, 4)== 'STR_') {
5248  // Variable de langue
5249  $this_field_values[$this_key] = $GLOBALS[$this_value];
5250  }
5251  }
5252  // Nom de chaque option
5253  // Checkbox, radio ou select
5254  foreach($this_field_values as $this_key => $this_value) {
5255  if ($this_field=="ad_closed") {
5256  // Pour clôturer une annonce on passe la date d'insertion à 0. Cet état est différent de enligne.
5257  $issel = (vb($frm['date_insertion']) == "0000-00-00 00:00:00");
5258  } else {
5259  $issel = in_array($this_value, $frm_this_field_values_array);
5260  }
5261  $this_field_infos['options'][] = array('value' => $this_value,
5262  'issel' => $issel,
5263  'name' => $this_field_names[$this_key]
5264  );
5265  }
5266  }
5267  if($field_type == 'upload' && !empty($this_value)) {
5268  // $delete_link = get_current_url(false) . '?mode=suppr&field=' . $this_field . '&file=' . $this_value;
5269  $delete_link = 'javascript:reinit_upload_field("'.$this_field.'");';
5270  $this_field_infos['upload_infos'] = get_uploaded_file_infos($this_field, $this_value, $delete_link);
5271  }
5272  $specific_fields[] = $this_field_infos;
5273  }
5274  }
5275  return $specific_fields;
5276 }
5277 
5286 function handle_specific_fields(&$frm, $form_usage = 'user') {
5287  $table_correspondance = array('user' => 'utilisateurs', 'order' => 'commandes', 'ad' => 'lot_vente');
5288  $adresses_potentiel_fields_array = array('prenom', 'nom', 'adresse', 'code_postal', 'ville', 'pays', 'email', 'contact');
5289  if(empty($table_correspondance[$form_usage])) {
5290  return null;
5291  }
5292  $specific_fields_titles = vb($GLOBALS['site_parameters'][$form_usage . '_specific_field_titles'], array());
5293  $specific_field_types = vb($GLOBALS['site_parameters'][$form_usage . '_specific_field_types'], array());
5294 
5295  // Récupération des champs de la BDD, pour éviter les erreurs de mise à jour du à une erreur d'administration de user_specific_field_titles, et ne pas mettre les champs type separator dans la requête SQL, et tout autre intru qui ferais échoué la requete.
5296  $this_table_field_types = get_table_field_types('peel_' . $table_correspondance[$form_usage]);
5297  $this_table_field_names = get_table_field_names('peel_' . $table_correspondance[$form_usage]);
5298  foreach($this_table_field_names as $this_field) {
5299  // On identifie tous les champs d'adresse relatifs à cette table
5300  if(in_array($this_field, $adresses_potentiel_fields_array)) {
5301  $frm['adresses_fields_array'][$this_field] = $this_field;
5302  } elseif ((String::substr($this_field,-5) == '_ship' || String::substr($this_field,-5) == '_bill')) {
5303  $frm['adresses_fields_array'][String::substr($this_field, 0, -5)] = String::substr($this_field, 0, -5);
5304  }
5305  if (empty($specific_fields_titles) || empty($specific_fields_titles[$this_field])) {
5306  // Champ qui n'est pas un specific_field, on ne l'ajoute pas à la requête SQL ici mais on le traite par la suite en dehors de cette fonction
5307  continue;
5308  }
5309  // On traite ci-dessous tous les champs spécifiques
5310  if ($form_usage == 'user' && (defined('IN_REGISTER') || defined('IN_RETAILER')) && !empty($GLOBALS['site_parameters']['disable_user_specific_field_on_register_page']) && in_array($this_field, $GLOBALS['site_parameters']['disable_user_specific_field_on_register_page'])) {
5311  // Ne pas prendre en compte les champs absents de la page d'enregistrement
5312  continue;
5313  } elseif (vb($specific_field_types[$this_field]) == 'upload') {
5314  $frm[$this_field] = upload($this_field, false, 'image', $GLOBALS['site_parameters']['image_max_width'], $GLOBALS['site_parameters']['image_max_height'], null, null, vb($frm[$this_field]));
5315  }
5316  if (isset($frm[$this_field])) {
5317  if (vb($specific_field_types[$this_field]) == 'datepicker') {
5318  $frm[$this_field] = get_mysql_date_from_user_input($frm[$this_field]);
5319  } elseif (is_array($frm[$this_field])) {
5320  // Si $frm[$this_field] est un tableau, il faut le convertir en chaine de caractères pour le stockage en BDD
5321  $frm[$this_field] = implode(',', $frm[$this_field]);
5322  } elseif(!is_array($frm[$this_field]) && (strpos(vb($this_table_field_types[$this_field]), 'int(') !== false || strpos(vb($this_table_field_types[$this_field]), 'float(') !== false)) {
5323  $frm[$this_field] = get_float_from_user_input($frm[$this_field]);
5324  if(strpos(vb($this_table_field_types[$this_field]), 'int(') !== false) {
5325  $frm[$this_field] = round($frm[$this_field]);
5326  }
5327  }
5328  $frm['specific_field_values'][$this_field] = $frm[$this_field];
5329  $frm['specific_field_sql_set'][$this_field] = word_real_escape_string($this_field) . '="' . nohtml_real_escape_string($frm[$this_field]) . '"';
5330  }
5331  }
5332 }
5333 
5341 function display_specific_field_form($specific_field_infos_array, $display_mode = 'table') {
5342  $output='';
5343  foreach($specific_field_infos_array as $specific_fields) {
5344  $tpl = $GLOBALS['tplEngine']->createTemplate('specific_field.tpl');
5345  $tpl->assign('f', $specific_fields);
5346  if(!empty($specific_fields['error_text'])) {
5347  $error_on_page = true;
5348  }
5349  if(!empty($specific_fields['field_title']) || !in_array($specific_fields['field_type'], array('hidden', 'separator', 'textarea', 'html'))) {
5350  if($display_mode == 'div') {
5351  $output .= '
5352 <div class="row" style="margin-bottom:10px">
5353  <div class="col-sm-6 col-md-5 col-lg-4">'.(!empty($specific_fields['field_title'])?$specific_fields['field_title'].''. (!empty($specific_fields['mandatory']) ? ' <span class="etoile">*</span>':'') . $GLOBALS['STR_BEFORE_TWO_POINTS'] .':':'') .'</div>
5354  <div class="col-sm-6 col-md-7 col-lg-8">' . $tpl->fetch() . vb($specific_fields['error_text']) . '</div>
5355 </div>
5356 ';
5357  } else {
5358  $output .= '
5359  <tr>
5360  <td>'.$specific_fields['field_title'].''. (!empty($specific_fields['mandatory']) ? ' <span class="etoile">*</span>':'') . $GLOBALS['STR_BEFORE_TWO_POINTS'] .':</td>
5361  <td>' . $tpl->fetch() . vb($specific_fields['error_text']) . '</td>
5362  </tr>';
5363  }
5364  } else {
5365  if($display_mode == 'div') {
5366  $output .= '
5367 <div style="margin-bottom:10px">
5368  ' . $tpl->fetch() . '
5369 </div>';
5370  } else {
5371  $output .= '
5372  <tr>
5373  <td></td>
5374  <td>' . $tpl->fetch() . vb($specific_fields['error_text']) . '</td>
5375  </tr>';
5376  }
5377  }
5378  }
5379  if(!empty($error_on_page)) {
5380  $output = $GLOBALS['tplEngine']->createTemplate('global_error.tpl', array('message' => $GLOBALS['STR_ERR_FORM']))->fetch() . $output;
5381  }
5382  return $output;
5383 }
5384 
5389  if(defined('IN_PEEL_ADMIN')) {
5390  $wwwroot = $GLOBALS['wwwroot_in_admin'];
5391  } else {
5392  $wwwroot = $GLOBALS['wwwroot'];
5393  }
5394  $GLOBALS['js_files'][] = $wwwroot . '/lib/js/jquery-fineuploader.js';
5395  $GLOBALS['css_files'][] = $wwwroot . '/lib/css/fineuploader.css';
5396  $GLOBALS['js_content_array'][] = '
5397 window.init_fineuploader = function(object) {
5398  object.fineUploader({
5399  multiple: false,
5400  request: {
5401  endpoint: "' . $wwwroot . '/fine_uploader.php?origin=' . urlencode($_SERVER['SCRIPT_FILENAME']) . '",
5402  inputName: object.attr("id")
5403  },
5404  failedUploadTextDisplay: {
5405  mode: "custom",
5406  maxChars: 100
5407  },
5408  text: {
5409  uploadButton: "' . String::str_form_value($GLOBALS["STR_DOWNLOAD"]) . '",
5410  cancelButton: "' . String::str_form_value($GLOBALS["STR_CANCEL"]) . '",
5411  failUpload: "' . String::str_form_value($GLOBALS["STR_FTP_GET_FAILED"]) . '",
5412  formatProgress: "{percent}% ' . String::str_form_value($GLOBALS["STR_OUT_OF"]) . ' {total_size}"
5413  }
5414  }).on("complete", function(event, id, fileName, responseJSON) {
5415  if (responseJSON.success) {
5416  object.replaceWith(responseJSON.html);
5417  }
5418  });
5419 };
5420 window.reinit_upload_field = function(input_name) {
5421  $("#"+input_name).replaceWith("<div class=\"uploader\" id=\""+input_name+"\"></div>");
5422  init_fineuploader($("#"+input_name));
5423 };
5424 ';
5425  $GLOBALS['js_ready_content_array'][] = '
5426 $("input[type=file]").each(function () {
5427  $(this).replaceWith("<div class=\"uploader\" id=\""+$(this).attr("name")+"\"></div>");
5428 });
5429 $(".uploader").each(function () {
5430  init_fineuploader($(this));
5431 });
5432 ';
5433 }
5434 
5445 function create_or_update_product($field_values, $columns_skipped = array(), $product_field_names = array(), $specific_fields_array = array(), $admin_mode = false) {
5446  $output = '';
5447  if(!isset($GLOBALS['nbprod_update'])) {
5448  $GLOBALS['nbprod_update'] = 0;
5449  $GLOBALS['nbprod_update_null'] = 0;
5450  $GLOBALS['nbprod_insert'] = 0;
5451  $GLOBALS['nbprod_categorie_insert'] = 0;
5452  }
5453 
5454  if (!empty($field_values['site_id'])) {
5455  $site_id = $field_values['site_id'];
5456  } else {
5457  $site_id = $GLOBALS['site_id'];
5458  }
5459  // Gestion des champs impactant $field_values (transformation d'un nom en id par exemple)
5460  if (!empty($field_values['id_marque'])) {
5461  if(!is_array($field_values['id_marque'])) {
5462  $field_values['id_marque'] = array($field_values['id_marque']);
5463  }
5464  foreach($field_values['id_marque'] as $this_key => $this_field_value) {
5465  if(String::strlen($this_field_value)>0) {
5466  // La marque n'est pas vide - il faut que l'import soit compatible avec des noms de marque pouvant être des nombres
5467  // Par défaut on considère qu'une marque donnée est une id de marque, sinon on gère comme si c'était un nom si pas trouvée et non numérique
5468  $q = query('SELECT id
5469  FROM peel_marques
5470  WHERE id=' . intval($this_field_value) . " AND " . get_filter_site_cond('marques'));
5471  if ($brand = fetch_assoc($q)) {
5472  // Marque existante
5473  $this_brand_id_array = $brand['id'];
5474  } else {
5475  $sql_select_brand = 'SELECT id
5476  FROM peel_marques
5477  WHERE nom_'.$_SESSION['session_langue'].' = "'.real_escape_string($this_field_value).'" AND ' . get_filter_site_cond('marques');
5478  $query_brand = query($sql_select_brand);
5479  if($brand = fetch_assoc($query_brand)){
5480  $this_brand_id_array = $brand['id'];
5481  }elseif(!empty($this_field_value) && !is_numeric($this_field_value)) {
5482  // Marque inexistante, on l'insère en base de données.
5483  $q = query('INSERT INTO peel_marques
5484  SET nom_' . $_SESSION['session_langue'] . '="' . nohtml_real_escape_string($this_field_value) . '", etat="1", site_id="' . nohtml_real_escape_string(get_site_id_sql_set_value($site_id)) . '"');
5485  $this_brand_id_array = insert_id();
5486  if($admin_mode) {
5487  $output .= $GLOBALS['tplEngine']->createTemplate('global_success.tpl', array('message' => sprintf($GLOBALS['STR_ADMIN_IMPORT_PRODUCTS_MSG_BRAND_CREATED'], $GLOBALS['line_number'], $field_values['id_marque'])))->fetch();
5488  }
5489  }
5490  }
5491  }
5492  }
5493  // On ne peut stocker qu'un seul id de marque, même si un tableau est fourni. Aritraitement on ne retient que la dernière .
5494  $field_values['id_marque'] = end($this_brand_id_array);
5495  }
5496  // Génération du SQL à partir de $field_values. product_field_names peut contenir des inforamtions non vérifié, provenant d'un formulaire par exemple. Il faut s'assurer qu'il n'y a pas de champ utilisé qui n'existe pas réélement dans la bas de
5497  $product_table_field_names = get_table_field_names('peel_produits');
5498  foreach($field_values as $this_field_name => $this_value) {
5499  if (!empty($this_field_name) && !in_array($this_field_name, $columns_skipped)) {
5500  // On ne souhaite pas inclure les champs spécifiques ou non reconnus dans la requête SQL des produits. Mais il ne faut pas supprimer les champs specifiques de $field_values puisque l'on s'en sert après
5501  if((empty($product_field_names) || in_array($this_field_name, $product_field_names)) && !in_array($this_field_name, array('id', 'Categorie', 'categorie_id')) && in_array($this_field_name, $product_table_field_names)) {
5502  // On ne tient compte que des colonnes présentes dans la table produits pour sql_fields, les autres champs sont traités séparément
5503  if(String::strpos($this_field_name, 'nom_') === 0 && String::strlen($this_field_name) == 6 && !empty($GLOBALS['site_parameters']['product_name_forced_lang']) && $this_field_name != 'nom_' . $GLOBALS['site_parameters']['product_name_forced_lang']) {
5504  // Colonne nom_XX n'existant pas sur ce site, on ne traite pas le champ
5505  continue;
5506  }
5507  if(String::strpos($this_field_name, 'description_') === 0 && String::strlen($this_field_name) == 14 && !empty($GLOBALS['site_parameters']['product_description_forced_lang']) && $this_field_name != 'description_' . $GLOBALS['site_parameters']['product_description_forced_lang']) {
5508  // Colonne description_XX n'existant pas sur ce site, on ne traite pas le champ
5509  continue;
5510  }
5511  $set_sql_fields[$this_field_name] = word_real_escape_string($this_field_name) . "='" . real_escape_string($this_value) . "'";
5512  }
5513  } elseif(empty($specific_fields_array[$this_field_name])) {
5514  // Ce champ ne sera pas utilisé, on le supprime
5515  unset($field_values[$this_field_name]);
5516  }
5517  }
5518 
5519  if (!empty($field_values['id'])) {
5520  // On a spécifié une id Produit, donc on essaie de faire un UPDATE
5521  if (!empty($set_sql_fields)) {
5522  $sql = "UPDATE peel_produits
5523  SET " . implode(', ', $set_sql_fields) . "
5524  WHERE id='" . intval($field_values['id']) . "' AND " . get_filter_site_cond('produits', null, true) . "";
5525  query($sql);
5526  if (affected_rows()) {
5527  $product_id = $field_values['id'];
5528  $GLOBALS['nbprod_update']++;
5529  if($admin_mode) {
5530  $output .= $GLOBALS['tplEngine']->createTemplate('global_success.tpl', array('message' => sprintf($GLOBALS['STR_ADMIN_IMPORT_PRODUCTS_MSG_LINE_UPDATED'], $GLOBALS['line_number'], $product_id)))->fetch();
5531  } else {
5532  $output = true;
5533  }
5534  }
5535  }
5536  if (!isset($product_id)) {
5537  // On vérifie si le produit existe déjà (et donc n'a pas été modifié) ou si il est à créer
5538  $q = query("SELECT id
5539  FROM peel_produits
5540  WHERE id='" . intval($field_values['id']) . "' AND " . get_filter_site_cond('produits', null, true));
5541  if ($product = fetch_assoc($q)) {
5542  // Produit existe, et n'avait donc pas été modifié
5543  $GLOBALS['nbprod_update_null']++;
5544  $product_id = $field_values['id'];
5545  } else {
5546  // Produit inexistant : on va exécuter l'INSERT INTO plus loin en imposant l'id
5547  $set_sql_fields['id'] = "id='" . intval($field_values['id']) . "'";
5548  }
5549  }
5550  }
5551  if (!isset($product_id) && !empty($set_sql_fields)) {
5552  // Produit pas encore existant et $set_sql_fields est forcément non vide ici
5553  $sql = "INSERT INTO peel_produits
5554  SET " . implode(', ', $set_sql_fields);
5555  query($sql);
5556  $product_id = insert_id();
5557  $GLOBALS['nbprod_insert']++;
5558  if($admin_mode) {
5559  $output .= $GLOBALS['tplEngine']->createTemplate('global_success.tpl', array('message' => sprintf($GLOBALS['STR_ADMIN_IMPORT_PRODUCTS_MSG_LINE_CREATED'], $GLOBALS['line_number'], $product_id)))->fetch();
5560  } else {
5561  $output = true;
5562  }
5563  } elseif(!isset($product_id)) {
5564  if($admin_mode) {
5565  $output .= 'Problem empty product_id';
5566  }
5567  return false;
5568  }
5569  // Gestion des champs nécessitant d'écrire dans d'autres tables en connaissant $product_id
5570  foreach($field_values as $this_field_name => $this_field_value) {
5571  if($admin_mode && $this_field_name == $GLOBALS['STR_ADMIN_EXPORT_PRODUCTS_COLORS']) {
5572  // Gestion de la couleur
5573  query('DELETE FROM peel_produits_couleurs
5574  WHERE produit_id="' . intval($product_id) . '"');
5575  $this_list_color = explode(",", $this_field_value);
5576  foreach($this_list_color as $this_id => $this_value){
5577  if(String::strlen($this_value)>0) {
5578  if(!is_numeric($this_value)) {
5579  $sql_select_color = 'SELECT *
5580  FROM peel_couleurs
5581  WHERE nom_'.$_SESSION['session_langue'].' = "'.real_escape_string($this_value).'" AND ' . get_filter_site_cond('couleurs');
5582  $query_color = query($sql_select_color);
5583  if($color = fetch_assoc($query_color)){
5584  $this_value = $color['id'];
5585  }else{
5586  $sql_insert_color = 'INSERT INTO peel_couleurs (nom_'.$_SESSION['session_langue'].', site_id)
5587  VALUES ("'.real_escape_string($this_value).'", "'.nohtml_real_escape_string(get_site_id_sql_set_value($site_id)).'")';
5588  query($sql_insert_color);
5589  $this_value = insert_id();
5590  }
5591  }
5592  $sql_select_product_color = 'SELECT *
5593  FROM peel_produits_couleurs
5594  WHERE produit_id = "' . intval($product_id) . '" AND couleur_id = "' . intval($this_value) . '"';
5595  $query_select_product_color = query($sql_select_product_color);
5596  if(!fetch_assoc($query_select_product_color)){
5597  $sql_match_product_color = 'INSERT INTO peel_produits_couleurs(produit_id,couleur_id)
5598  VALUES ("' . intval($product_id) . '","' . intval($this_value) . '")';
5599  query($sql_match_product_color);
5600  }
5601  }
5602  }
5603  } elseif($admin_mode && $this_field_name == $GLOBALS['STR_ADMIN_EXPORT_PRODUCTS_SIZES']){
5604  // Gestion de la taille
5605  query('DELETE FROM peel_produits_tailles
5606  WHERE produit_id="' . intval($product_id) . '"');
5607  $this_list_size = explode(",", $this_field_value);
5608  foreach($this_list_size as $this_id => $this_value){
5609  $this_list_size_and_price = explode("§", $this_value);
5610  $size_name = $this_list_size_and_price[0];
5611  if(String::strlen($size_name)>0) {
5612  $size_price = vn($this_list_size_and_price[1]);
5613  $size_price_reseller = vn($this_list_size_and_price[2]);
5614  // On ne fait pas de test is_numeric ou pas sur les tailles pour savoir si on parle d'id ou de nom, car une taille peut être un nombre !
5615  // Donc obligatoirement, on considère qu'une taille est rentrée par son nom
5616  $sql_size = 'SELECT *
5617  FROM peel_tailles
5618  WHERE nom_'.$_SESSION['session_langue'].' = "'.real_escape_string($size_name).'" AND ' . get_filter_site_cond('tailles');
5619  $query_size = query($sql_size);
5620  if($size = fetch_assoc($query_size)){
5621  if(isset($this_list_size_and_price[1]) && get_float_from_user_input($size_price) != $size['prix']){
5622  query('UPDATE peel_tailles
5623  SET prix = "'.real_escape_string(get_float_from_user_input($size_price)).'"
5624  WHERE id="'.intval($size['id']).'" AND ' . get_filter_site_cond('tailles'));
5625  }
5626  if(isset($this_list_size_and_price[2]) && get_float_from_user_input($size_price_reseller) != $size['prix_revendeur']){
5627  query('UPDATE peel_tailles
5628  SET prix_revendeur = "'.real_escape_string(get_float_from_user_input($size_price_reseller)).'"
5629  WHERE id="'.intval($size['id']).'" AND ' . get_filter_site_cond('tailles'));
5630  }
5631  $this_size_id = $size['id'];
5632  }else{
5633  $sql_insert_size = 'INSERT INTO peel_tailles (nom_'.$_SESSION['session_langue'].', prix, prix_revendeur, site_id)
5634  VALUES ("'.real_escape_string($size_name).'", "'.floatval(get_float_from_user_input(vn($size_price))).'", "'.floatval(get_float_from_user_input(vn($size_price_reseller))).'", "'. nohtml_real_escape_string(get_site_id_sql_set_value($site_id)).'")';
5635  query($sql_insert_size);
5636  $this_size_id = insert_id();
5637  }
5638  $select_size_product = 'SELECT *
5639  FROM peel_produits_tailles
5640  WHERE produit_id = "' . intval($product_id) . '" AND taille_id = "' . intval($this_size_id) . '"';
5641  $query_size_product = query($select_size_product);
5642  if(!fetch_assoc($query_size_product)){
5643  $sql_match_product_size = 'INSERT INTO peel_produits_tailles (produit_id, taille_id)
5644  VALUES ("' . intval($product_id) . '", "' . intval($this_size_id) . '")';
5645  query($sql_match_product_size);
5646  }
5647  }
5648  }
5649  } elseif (strpos($this_field_name, "§") !== false) {
5650  // Gestion des prix par lots : tarifs dégressifs
5651  // Nom du champs
5652  $this_bulk_discount = explode("§", $this_field_name);
5653  $this_quantity = $this_bulk_discount[0];
5654  $this_price_standard = $this_bulk_discount[1];
5655  $this_price_reseller = $this_bulk_discount[2];
5656  // Valeur du champs
5657  if(!empty($this_field_value)){
5658  $this_package_price = explode("§", $this_field_value);
5659  $quantity = $this_package_price[0];
5660  $price_standard = $this_package_price[1];
5661  $price_reseller = $this_package_price[2];
5662  if (check_if_module_active('lot')) {
5663  $sql_prix_lot = 'SELECT *
5664  FROM peel_quantites
5665  WHERE produit_id="' . intval($product_id) . '" AND quantite = "' . intval($quantity) . '" AND ' . get_filter_site_cond('quantites');
5666  $query_prix_lot = query($sql_prix_lot);
5667  if(fetch_assoc($query_prix_lot)){
5668  $sql_update = 'UPDATE peel_quantites
5669  SET quantite = "'.intval($quantity).'"';
5670  if(isset($this_price_standard) && isset($price_standard)) {
5671  $sql_update.= ', prix ="'.nohtml_real_escape_string($price_standard).'"';
5672  }
5673  if(isset($this_price_reseller) && isset($price_reseller)) {
5674  $sql_update.= ', prix_revendeur ="'.nohtml_real_escape_string($price_reseller).'"';
5675  }
5676  $sql_update.= ', site_id = "'.nohtml_real_escape_string(get_site_id_sql_set_value($site_id)).'"
5677  WHERE produit_id="' . intval($product_id) . '" AND quantite = "'.intval($quantity).'"';
5678  query($sql_update);
5679  if($admin_mode) {
5680  $output .= $GLOBALS['tplEngine']->createTemplate('global_success.tpl', array('message' => sprintf($GLOBALS['STR_ADMIN_IMPORT_PRODUCTS_MSG_TARIF_UPDATED'], vb($price_standard), vb($price_reseller), vb($quantity), $product_id)))->fetch();
5681  }
5682  } else {
5683  if(isset($quantity) && $quantity > 0) {
5684  $q = 'INSERT INTO peel_quantites
5685  SET produit_id="' . intval($product_id) . '"';
5686  $q.= ', quantite ="'.intval($quantity).'"
5687  , site_id = "'.nohtml_real_escape_string(get_site_id_sql_set_value($site_id)).'"';
5688  if(isset($this_price_standard) && isset($price_standard)){
5689  $q.= ', prix ="'.nohtml_real_escape_string($price_standard).'"';
5690  }
5691  if(isset($this_price_reseller) && isset($price_reseller)){
5692  $q.= ', prix_revendeur ="'.nohtml_real_escape_string($price_reseller).'"';
5693  }
5694  query($q);
5695  if($admin_mode) {
5696  $output .= $GLOBALS['tplEngine']->createTemplate('global_success.tpl', array('message' => sprintf($GLOBALS['STR_ADMIN_IMPORT_PRODUCTS_MSG_TARIF_CREATED'], vb($price_standard), vb($price_reseller), vb($quantity), $product_id)))->fetch();
5697  }
5698  }
5699  }
5700  }
5701  }
5702  } elseif (strpos($this_field_name, "#") !== false && check_if_module_active('attributs')) {
5703  // Gestion des attributs
5704  if($admin_mode) {
5705  $output .= attributes_create_or_update($this_field_name, $this_field_value, $product_id, $site_id, $admin_mode);
5706  }
5707  }
5708  }
5709  // Gestion de la catégorie
5710  unset($this_categories_array);
5711  if (!empty($field_values['categorie_id']) && !is_numeric($field_values['categorie_id']) && empty($field_values['Categorie'])) {
5712  // Compatibilité avec anciens champs appelés categorie_id et contenant des noms de catégories
5713  $field_values['Categorie'] = $field_values['categorie_id'];
5714  unset($field_values['categorie_id']);
5715  }
5716  if (!empty($field_values['Categorie'])) {
5717  // Ce champ contient une liste de catégories séparées par des virgules
5718  foreach(explode(',', $field_values['Categorie']) as $this_category) {
5719  if (is_numeric($this_category)) {
5720  // le champ Categorie est un id
5721  $this_categorie_id = intval($this_category);
5722  } else {
5723  // le champ Categorie n'est pas un nombre, on tente une recherche dans la BDD sur le nom de la catégorie.
5724  $q = query('SELECT id
5725  FROM peel_categories
5726  WHERE nom_' . $_SESSION['session_langue'] . '="' . nohtml_real_escape_string($this_category) . '" AND ' . get_filter_site_cond('categories') . '');
5727  // Catégorie existante, ou le champ Categorie du fichier n'est ni un ID, ni le nom de la catégorie
5728  if ($categorie = fetch_assoc($q)) {
5729  $this_categorie_id = $categorie['id'];
5730  } else {
5731  // Catégorie inexistante : on l'insère en base de données
5732  $q = query('INSERT INTO peel_categories
5733  SET nom_' . $_SESSION['session_langue'] . '="' . nohtml_real_escape_string($this_category) . '", etat="1", site_id = "' . nohtml_real_escape_string(get_site_id_sql_set_value($site_id)) . '"');
5734  $this_categorie_id = insert_id();
5735  if($admin_mode) {
5736  $output .= $GLOBALS['tplEngine']->createTemplate('global_success.tpl', array('message' => sprintf($GLOBALS['STR_ADMIN_IMPORT_PRODUCTS_MSG_CATEGORY_CREATED'], $this_category, $this_categorie_id)))->fetch();
5737  }
5738  }
5739  }
5740  $this_categories_array[] = $this_categorie_id;
5741  }
5742  }
5743  if (!empty($field_values['categorie_id'])) {
5744  // On a déjà testé plus haut si categorie_id était numérique ou non, et si pas numérique on l'a supprimé
5745  // donc là il est forcément numérique
5746  if (get_category_name($field_values['categorie_id']) !== false) {
5747  $this_categories_array[] = $field_values['categorie_id'];
5748  } else {
5749  if($admin_mode) {
5750  $output .= $GLOBALS['tplEngine']->createTemplate('global_error.tpl', array('message' => sprintf($GLOBALS['STR_ADMIN_IMPORT_PRODUCTS_ERR_REFERENCE_DOES_NOT_EXIST'], $field_values['categorie_id'])))->fetch();
5751  }
5752  }
5753  }
5754  if (!empty($this_categories_array)) {
5755  if(empty($GLOBALS['site_parameters']['products_import_reset_category_associations_disable'])) {
5756  // Suppression des anciennes associations entre les produits et les catégories, pour insérer celles du fichier.
5757  query('DELETE FROM peel_produits_categories
5758  WHERE produit_id="' . intval($product_id) . '"');
5759  }
5760  foreach($this_categories_array as $this_categorie_id) {
5761  if (!empty($this_categorie_id)) {
5762  // Vérification que l'association entre les produits, les catégories de produits
5763  $q = query('SELECT produit_id, categorie_id
5764  FROM peel_produits_categories
5765  WHERE produit_id="' . intval($product_id) . '" AND categorie_id="' . intval($this_categorie_id) . '"');
5766  if (!num_rows($q)) {
5767  query('INSERT INTO peel_produits_categories
5768  SET produit_id="' . intval($product_id) . '",
5769  categorie_id="' . intval($this_categorie_id) . '"');
5770  $GLOBALS['nbprod_categorie_insert']++;
5771  }
5772  }
5773  }
5774  }
5775  // Gestion des stocks
5776  // Doit être fait à la fin car on doit déjà avoir les couleurs et tailles bien rentrées en base de données
5777  if(!empty($field_values["Stock"]) && $admin_mode && check_if_module_active('stock_advanced')) {
5778  // Format stock ou stock§color§size, et les combinaisons sont séparées par ,
5779  $this_list_stock = explode(",", $field_values["Stock"]);
5780  $stock_frm = array();
5781  foreach($this_list_stock as $this_id => $this_value){
5782  $this_list_infos = explode("§", $this_value);
5783  $stock_frm["id"][$this_id] = $product_id;
5784  $stock_frm["stock"][$this_id] = $this_list_infos[0];
5785  $this_value = vb($this_list_infos[1]);
5786  if(is_numeric($this_value)) {
5787  $stock_frm["couleur_id"][$this_id] = $this_value;
5788  } elseif(!empty($this_value) && !is_numeric($this_value)) {
5789  $sql_select_color = 'SELECT *
5790  FROM peel_couleurs
5791  WHERE nom_'.$_SESSION['session_langue'].' = "'.real_escape_string($this_value).'" AND ' . get_filter_site_cond('couleurs');
5792  $query_color = query($sql_select_color);
5793  if($color = fetch_assoc($query_color)){
5794  $stock_frm["couleur_id"][$this_id] = $color['id'];
5795  }
5796  }
5797  if(!empty($this_list_infos[2])) {
5798  // Taille donnée forcément par son nom
5799  $sql_size = 'SELECT *
5800  FROM peel_tailles
5801  WHERE nom_'.$_SESSION['session_langue'].' = "'.real_escape_string($this_list_infos[2]).'" AND ' . get_filter_site_cond('tailles');
5802  $query_size = query($sql_size);
5803  if($size = fetch_assoc($query_size)){
5804  $stock_frm["taille_id"][$this_id] = $size['id'];
5805  }
5806  }
5807  }
5808  $output .= insere_stock_produit($stock_frm);
5809  }
5810  if (check_if_module_active('stock_advanced') && !empty($field_values['on_stock']) && $field_values['on_stock'] == 1) {
5811  // pas d'output sur cette fonction. Elle ne fait que des manipulation en BDD
5812  insert_product_in_stock_table_if_not_exist($product_id, 1);
5813  }
5814  return $output;
5815 }
5816 
5824 function data_position_sort($arg1, $arg2) {
5825  $pos1 = vb($arg1['position'], 999999);
5826  $pos2 = vb($arg2['position'], 999999);
5827  if ($pos1 < $pos2) {
5828  return -1;
5829  } elseif ($pos1 == $pos2) {
5830  return 0;
5831  } else {
5832  return 1;
5833  }
5834 }
5835 
5836 
5837 
5838 
5839 
5840 
5841 
5842 
5843 
5844 
5845 
5846 
5847 
5848 
5849 
5850 
5851 
5852 
set_lang_configuration_and_texts($lang, $load_default_lang_files_before_main_lang_array=null, $general_setup=true, $load_modules_files=true, $load_general_admin_files=true, $exclude_empty_string=true, $skip_load_files=false)
On charge les variables de langue, en complétant éventuellement avec la langue de référence...
Definition: fonctions.php:1941
foreach(array('date1', 'date2', 'type', 'renewals', 'width') as $item) $data
Definition: chart-data.php:29
static strtoupper($string)
Returns string with all alphabetic characters converted to uppercase.
Definition: String.php:154
get_site_name($site_ids, $skip_rights_check=false)
Retourne le nom d'un ou de plusieurs sites à partir de l'id.
Definition: fonctions.php:4763
handle_contact_form($frm, $skip_introduction_text=false)
Gère l'affichage du formulaire de contact, avec les erreurs et le message de confirmation d'envoi...
Definition: fonctions.php:4902
get_quick_search_results($search, $maxRows, $active_only=false, $search_category=null, $mode= 'products')
get_quick_search_results()
Definition: fonctions.php:4555
if(!function_exists('desinscription_newsletter')) close_page_generation($html_page=true)
Fonction à appeler à la fin de la génération d'une page, afin d'exécuter certaines requêtes SQL qui n...
Definition: fonctions.php:3797
if(isset($_GET['catid'])&&empty($_GET['catid'])) if(empty($_GET['catid'])&&!empty($GLOBALS['site_parameters']['disallow_main_category'])&&empty($_GET['convert_gift_points'])) $catid
Definition: index.php:26
load_site_parameters($lang=null, $skip_loading_currency_infos=false, $forced_site_id=null)
On charge les variables de configuration On récupère d'abord les données valables pour tous les sites...
Definition: fonctions.php:2567
handle_site_suspended()
Affiche ou non le fait que le site est suspendu.
Definition: fonctions.php:2433
fetch_row($query_result)
fetch_row()
Definition: database.php:264
getTextEditor($instance_name, $width, $height, $default_text, $default_path=null, $type_html_editor=0, $compter_char_max_if_enabled=255, $placeholder= '')
getTextEditor()
Definition: fonctions.php:4055
if(!empty($GLOBALS['site_parameters']['order_specific_field_titles'])) if(check_if_module_active('socolissimo')&&!empty($_REQUEST)&&!empty($_REQUEST['PUDOFOID'])&&!empty($_REQUEST['CEEMAIL'])&&!empty($_REQUEST['SIGNATURE'])&&!empty($_REQUEST['ORDERID'])) elseif(!empty($_POST)) elseif(check_if_module_active('socolissimo')&&!empty($_SESSION['session_commande']['is_socolissimo_order'])) foreach(array('bill'=> 1, 'ship'=> 2) as $address_type=> $session_commande_address_id) $frm['societe1']
$lang
Definition: spellchecker.php:9
$result
get_discount_text($remise_valeur, $remise_percent, $is_remise_valeur_including_taxe)
Retourne la remise d'un code promotionnel (en % dans le cas d'une remise en pourcentage ou dans le fo...
Definition: fonctions.php:421
check_language($this_lang, $langs_array)
Vérification de l'existance de la langue, et redirection si nécessaire ou nouvelle langue définie...
Definition: fonctions.php:1657
clean_Cache($days_max=15, $filename_beginning=null)
Suppression des anciens fichiers de cache.
Definition: fonctions.php:3917
if(!defined('IN_PEEL')) affiche_tagcloud($return_mode=false)
affiche_tagcloud()
Definition: fonctions.php:26
build_terms_clause($terms, $fields, $match_method)
builds the sql statement's where clause this will build the sql based on the given information Valeur...
Definition: fonctions.php:3714
static strpos($haystack, $needle, $offset=0)
Returns the numeric position of the first occurrence of needle in the haystack string.
Definition: String.php:54
get_current_url($with_get=true, $get_short_url=false, $take_away_get_args_array=null)
get_current_url()
Definition: fonctions.php:1743
charge_article($id, $show_all_etat_if_admin=true)
charge_article()
Definition: fonctions.php:394
static rawurldecode($string, $avoid_slash=false)
Returns rawurldecode.
Definition: String.php:909
is_user_tva_intracom_for_no_vat($user_id=null)
is_user_tva_intracom_for_no_vat()
Definition: user.php:959
get_wwwroot_cdn($subject)
Renvoyer un CDN si défini, ou à défaut wwwroot.
Definition: fonctions.php:2310
handle_register_globals()
Empêche les effets de register_globals.
Definition: fonctions.php:2376
upload($field_name, $rename_file=true, $file_kind=null, $image_max_width=null, $image_max_height=null, $path=null, $new_file_name_without_extension=null, $default_return_value=null)
Fonction d'upload de fichiers.
Definition: fonctions.php:3302
$attribut_list
output_general_http_header($page_encoding=null, $cache_duration_in_seconds=null)
Envoie les headers avant l'envoi du HTML.
Definition: fonctions.php:1528
get_document_image_html($filename, $width=100, $height=100)
Renvoie une image correspondant au type de fichier.
Definition: fonctions.php:3588
attributes_create_or_update($this_field_name, $this_field_value, $product_id, $site_id, $admin_mode=false)
Insertion d'une liste d'attributs en base de données pour un produit donné
Definition: fonctions.php:797
while($attrib=fetch_assoc($q_nom_attrib)) $columns_skipped
get_minified_src($files_array, $files_type= 'css', $lifetime=3600)
get_minified_src()
Definition: fonctions.php:4323
handle_template_engine_init($templates_force_compile=false)
Appelle le moteur de template pour définir $GLOBALS['tplEngine'].
Definition: fonctions.php:2414
get_currency_rate($currency)
Récupère le taux de change avec l'euro d'une devise à partir de son code à 3 lettres.
Definition: fonctions.php:354
get_string_from_array($array, $disable_ad_quote=false)
Convertit un tableau en chaine de caractère simple à gérer par un utilisateur.
Definition: format.php:973
check_captcha($code, $id)
Definition: fonctions.php:138
get_tag_analytics()
get_tag_analytics()
Definition: fonctions.php:441
static fopen_utf8($filename, $mode, $force_filename_in_iso_8859=false, $try_filename_in_iso_8859_if_file_not_found=true)
Ouvre un fichier.
Definition: String.php:793
redirect_and_die($url, $permanent_redirection=false, $avoid_loop=false)
Redirige vers l'URL demandée et arrête le programme.
Definition: fonctions.php:1551
build_search_terms($search, $match_method)
Découpe la chaine recherchée en éléments distincts suivant le mode $match_method Valeurs de $match_me...
Definition: fonctions.php:3675
formSelect($name, $tab, $preselected_value=null, $addOne=0, $get=0)
formSelect()
Definition: fonctions.php:4024
get_on_rollover_products_html()
Definition: fonctions.php:103
handle_specific_fields(&$frm, $form_usage= 'user')
Traite la réception de champs spécifiques venant d'un formulaire, et l'identification de tous les cha...
Definition: fonctions.php:5286
unique_id()
Création d'un mot de passe crypté
Definition: fonctions.php:36
static html_entity_decode_if_needed($string)
String::html_entity_decode_if_needed()
Definition: String.php:533
affected_rows($database_object=null)
affected_rows()
Definition: database.php:356
delete_captcha($form_object_id)
Definition: fonctions.php:154
params_affiche_produits($condition_value1, $unused, $type, $nb_par_page, $mode= 'general', $reference_id=0, $nb_colonnes, $always_show_multipage_footer=true, $additional_sql_inner=null, $additional_sql_cond=null, $additionnal_sql_having=null, $use_index_sql=null)
params_affiche_produits()
Definition: fonctions.php:2798
if(!select_db($_SESSION['session_install_choixbase'], $GLOBALS['database_object'], true)) $error
Definition: verifdroits.php:33
$extension
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
affiche_menu_deroulant_2($div_id, $items_html_array)
affiche_menu_deroulant_2()
Definition: fonctions.php:68
get_color_name($color_id)
Renvoie le nom d'une couleur.
Definition: fonctions.php:1914
insert_id($database_object=null)
insert_id()
Definition: database.php:339
http_download_and_die($filename_with_realpath, $serve_download_with_php=true, $file_content_given=null, $file_name_given=null, $force_download=true)
Envoie les entêtes HTTP puis le contenu pris dans un fichier ou dans l'argument $file_content_given s...
Definition: fonctions.php:3450
static strtolower($string)
Returns string with all alphabetic characters converted to lowercase.
Definition: String.php:135
insere_ticket(&$frm)
Envoi un message de contact au support du site Limitation pour éviter spam : utiliser session_form_co...
Definition: fonctions.php:805
$mode
static file_get_contents_utf8($filename, $force_filename_in_iso_8859=false, $try_filename_in_iso_8859_if_file_not_found=true)
Renvoie le contenu d'un fichier.
Definition: String.php:836
generate_token($name= 'general', $use_existing_token=true)
Génère un token en session qui permettra ensuite de vérifier l'authenticité de la requête de l'utilis...
Definition: fonctions.php:70
static strlen($string)
Returns the length of the given string.
Definition: String.php:36
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
get_current_generic_url()
get_current_generic_url()
Definition: fonctions.php:1788
get_upload_errors_text($file_infos, $file_kind= 'image')
Fonction de contrôle pour l'upload de fichier.
Definition: fonctions.php:3241
static create($type, $templadeDir, $forceCompile=false, $debugging=false)
Creates EngineTpl adapter of specified type.
Definition: EngineTpl.php:40
get_category_name($id)
Renvoie le nom d'une catégorie de produits.
Definition: fonctions.php:912
create_or_update_product($field_values, $columns_skipped=array(), $product_field_names=array(), $specific_fields_array=array(), $admin_mode=false)
Import d'un produit : mise à jour ou création du produit.
Definition: fonctions.php:5445
get_default_vat()
Retourne le taux de TVA le plus élevé, que l'on considère comme le taux de tva par défaut...
Definition: fonctions.php:5127
affiche_last_views($location)
Affiche la liste des produits déjà consultés par le client en cours.
Definition: fonctions.php:62
get_sons_cat($all_parents_with_ordered_direct_sons_array, $catid, $ids_array=array())
Récupère la liste des fils d'une catégorie à partir d'une liste ordonnée.
Definition: fonctions.php:148
if(!empty($_GET['id'])) if(isset($_POST['form_name'], $_POST['form_subject'], $_POST['form_text'], $_POST['form_lang'])&&empty($_GET['id'])) if(empty($_GET['id'])) $tpl
if(!function_exists('ipGet')) if(!function_exists('isPublicIP')) is_user_bot($ip=null, $user_agent=null)
Renvoie si le visiteur est un robot ou non.
Definition: fonctions.php:3083
if(!defined('IN_PEEL')) $GLOBALS['page_types_array']
Definition: fonctions.php:19
if(empty($_GET['id'])) if(!empty($GLOBALS['site_parameters']['allow_multiple_product_url_with_category'])) $product_object
microtime_float()
microtime_float()
Definition: fonctions.php:2776
get_float_from_user_input($string, $from_currency_rate=1)
Transforme tout nombre formaté en un float au format PHP Exemples : 12 004,34 ou 12,324.50.
Definition: format.php:196
if(empty($new_file_name_without_extension)) $the_new_file_name
if(!defined('IN_PEEL')) thumbs($source_filename, $width, $height, $method= 'fit', $source_folder=null, $thumb_folder=null, $thumb_rename=true, $return_absolute_path=false)
Charge l'image dont le nom est $source_filename dans le répertoire d'upload, et crée une vignette pou...
Definition: fonctions.php:33
real_escape_string($value)
real_escape_string()
Definition: database.php:374
if(isset($_POST['pays_zone'])) elseif(empty($_SESSION['session_caddie']->zoneId)&&!empty($GLOBALS['site_parameters']['default_delivery_zone_id'])) if(isset($_POST['type'])) elseif(empty($_SESSION['session_caddie']->typeId)&&!empty($GLOBALS['site_parameters']['default_delivery_type_id'])) if(!empty($_POST['code_promo'])) if(!empty($_GET['code_promo'])&&$_GET['code_promo']== 'delete') $form_error_object
get_identified_lang($langs_array=array())
On identifie la langue utilisée, et on redirige si cette langue n'est pas activée Pour qu'une langue ...
Definition: fonctions.php:1611
handle_setup_redirections($url, $mode= 'redirect')
Gère les redirections définies dans $GLOBALS['site_parameters']['redirections'].
Definition: fonctions.php:2462
get_javascript_output($async=false, $minify=false, $output_only_script_loading=false, $js_filenames_array=array('js_files', 'js_files_pageonly', 'js_files_nominify', 'js_files_noasync', 'js_files_nominify_noasync'))
Chargement du chargement des scripts.
Definition: fonctions.php:1275
getFlashBannerHTML($url, $width=680, $height=250, $mode_transparent=false)
Renvoie le HTML d'un tag corespondant à l'URL du fichier flash transmis en paramètre.
Definition: fonctions.php:840
if(!defined('IN_PEEL')) affiche_best_seller_produit_colonne($return_mode=false, $location=null, $nb_col_sm=3, $nb_col_md=4)
Affiche la liste des catégories qui sont spéciales.
Definition: fonctions.php:27
$tpl_options
get_user_job_options($selected_fonction_name=null)
Definition: fonctions.php:4828
get_specific_field_infos($frm, $form_error_object=null, $form_usage="user", $step=null)
Permet de définir de nouveaux champs dans le formulaire d'inscription / modification d'utilisateur de...
Definition: fonctions.php:5150
necessite_priv($priv, $demo_allowed=true, $configuration_modification=false)
Cette fonction vérifie si l'utilisateur a les privilèges de $priv.
Definition: fonctions.php:1575
const IN_INSTALLATION
Definition: bdd.php:14
get_modules($location, $return_mode=false, $technical_code=null, $id_categorie=null, $this_annonce_number=0, $return_array_with_raw_information=false, $criterias=null)
Récupère le contenu HTML des modules en fonction des contraintes données en paramètre Il est possible...
Definition: fonctions.php:543
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
static register($prepend=false)
Registers Twig_Autoloader as an SPL autoloader.
Definition: Autoloader.php:24
format_filename_base($original_name, $rename_file=true)
A partir d'un nom de fichier, on génère un nouveau nom unique pour éviter d'utiliser un nom déjà exis...
Definition: fonctions.php:3400
get_category_tree_and_itself($id_or_ids_array, $mode= 'sons', $table_to_use= 'categories')
get_category_tree_and_itself()
Definition: fonctions.php:933
if(!defined('IN_PEEL')) display_prices_with_taxes_active()
display_prices_with_taxes_active()
Definition: fonctions.php:23
if(!defined("IN_PEEL")) $peel_langues["nom"]
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
optimize_Tables()
optimize_Tables()
Definition: fonctions.php:3898
if(!defined('IN_PEEL')) est_identifie()
Retourne true si l'utilisateur est identifié
Definition: user.php:23
static str_form_value($value, $flags=ENT_COMPAT)
Encode une chaine de caractères pour affichage dans un value="".
Definition: String.php:480
$terms
Definition: search.php:125
$mandatory_fields
vb(&$var, $default=null)
Variable blanche if $var n'est pas défini, retourne $default, sinon retourne $var.
Definition: format.php:97
get_on_rollover_articles_html()
Definition: fonctions.php:130
clean_utilisateur_connexions($days_max=730)
Suppression des anciennes infos de connexion utilisateurs Fonction associée à une notion de nettoyage...
Definition: fonctions.php:3969
get_table_field_types($table_name, $link_identifier=null, $silent_if_error=false)
get_table_field_types()
Definition: database.php:516
get_country_select_options($selected_country_name=null, $selected_country_id=null, $option_value= 'name', $display_inactive_country=false, $allowed_zone_id=null, $preselect_shop_country_if_none_selected=true, $selected_country_lang=null, $allowed_ids=null)
get_country_select_options()
Definition: fonctions.php:1005
get_uploaded_file_infos($field_name, $file, $delete_url, $logo_width=100, $logo_height=100)
Remplit un tableau d'informations pour le template d'upload HTML.
Definition: fonctions.php:3601
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
necessite_identification()
Si l'utilisateur n'est pas connecté à un compte, on affiche une page d'identification et arrête le sc...
Definition: fonctions.php:1596
handle_sessions()
Gère les sessions PHP et des protections contre des vols de session.
Definition: fonctions.php:2497
num_rows($query_result)
num_rows()
Definition: database.php:321
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
get_generic_options($values_array, $selected_values=null)
Definition: fonctions.php:4849
handle_php_default_setup()
Définit les paramètres de base de PHP.
Definition: fonctions.php:2326
$priv
get_modules_array($only_active=false, $location=null, $technical_code=null, $force_update_cache_information=false, $specific_site_id=null, $exclude_public_items=false)
Retourne les modules sous forme de tableau.
Definition: fonctions.php:469
delete_uploaded_file_and_thumbs($filename)
delete_uploaded_file_and_thumbs()
Definition: fonctions.php:3417
$search
Definition: rpc.php:29
get_table_field_names($table_name, $link_identifier=null, $silent_if_error=false)
get_table_field_names()
Definition: database.php:495
updateTelContactNotClosed()
updateTelContactNotClosed()
Definition: fonctions.php:3756
fetch_object($query_result)
fetch_object()
Definition: database.php:302
if(!defined('IN_PEEL')) image_resize($origin_filename_with_path, $new_filename_with_path, $destinationW=null, $destinationH=null, $resize_even_if_smaller=false, $allow_keep_origin_file_if_resize_not_needed=true, $filesize_limit_keep_origin_file=102400, $jpeg_quality=85, $gammacorrect=1.0)
On redimensionne l'image pour qu'elle ne dépasse pas la taille de destination Le ratio largeur / haut...
Definition: images.php:33
get_tag_function_countries_titles_list()
Definition: fonctions.php:1100
fetch_assoc($query_result)
fetch_assoc()
Definition: database.php:283
$specific_fields_array
get_array_from_string($string)
Convertit une chaine de caractère simple à gérer par un utilisateur en un tableau PHP...
Definition: format.php:1011
call_module_hook($hook, $params, $mode= 'boolean')
Appelle la fonction correspondant au $hook pour chaque module installé La fonction doit s'appeler : [...
get_formatted_date($datetime_or_timestamp=null, $mode= 'short', $hour_minute=false)
Afficher une date formatée, en évitant les problèmes liés aux noms de mois sur les serveurs qui ne so...
Definition: format.php:440
data_position_sort($arg1, $arg2)
Comparer l'ordre de deux tableaux qui contiennent un élément "position" pour trier des tableaux de do...
Definition: fonctions.php:5824
get_file_type($filename)
get_file_type()
Definition: fonctions.php:3571
is_delivery_address_necessary_for_delivery_type($selected_delivery_type_id=null)
is_delivery_address_necessary_for_delivery_type()
Definition: fonctions.php:1140
get_all_site_countries_array($admin_force_multisite_if_allowed=false, $exclude_public_items=false, $show_only_site_country_allowed_array=false)
Retourne un tableau des noms des pays.
Definition: fonctions.php:1063
$rename_file
insere_code_promo($frm)
Créer un code promo pour l'administration et la création de chèque cadeaux lors du paiement d'une com...
Definition: fonctions.php:5049
$noticemsg
get_tag_function_countries_values_list($mode= 'id')
Fonction permettant de récupérer les noms des pays, sous forme de liste séparée par des virgules...
Definition: fonctions.php:1086
$currency
Definition: rpc.php:34
get_mysql_date_from_user_input($string, $use_current_hour_min_sec_if_missing=false)
Transforme une date formattée par get_formatted_date() en date MySQL Si la date est vide...
Definition: format.php:496
update_configuration_variable($id_or_technical_code, $frm, $delete=false)
update_configuration_variable()
Definition: fonctions.php:4273
get_all_sites_name_array($admin_force_multisite_if_allowed=false, $allow_null_site_id=false, $skip_rights_check=false)
Retourne un tableau des noms des sites configurés en fonction des droits de l'administrateur.
Definition: fonctions.php:4792
if(!check_if_module_active('search')) $page_encoding
Definition: produit.php:23
set_paiement(&$frm)
Traitement du moyen de paiement.
Definition: fonctions.php:1160
$search_category
Definition: produit.php:37
static minify($js, $options=array())
Takes a string containing javascript and removes unneeded characters in order to shrink the code with...
Definition: JShrink.php:101
get_delivery_type_options($selected_delivery_type_id_or_name=null)
get_delivery_type_options()
Definition: fonctions.php:1110
$currency_rate
Definition: rpc.php:35
get_form_token_input($name= 'general', $use_existing_token=true, $return_as_input_form=true)
get_form_token_input()
Definition: fonctions.php:94
calcul_nbprod_parcat($catid, $all_parents_with_ordered_direct_sons_array)
calcul_nbprod_parcat()
Definition: fonctions.php:176
get_site_wwwroot($site_id, $lang=null)
Renvoie l'URL d'un site donné
Definition: fonctions.php:4873
vn(&$var, $default=0)
Variable nulle if $var n'est pas défini, retourne $default, sinon retourne $var.
Definition: format.php:110
load_active_languages_list($site_id=null)
On charge les variables de listes de langues.
Definition: fonctions.php:2130
const IN_PEEL_ADMIN
Definition: articles.php:14
get_site_id_sql_set_value($site_ids)
Retourne la valeur SQL d'un champ INT ou SET suivant que ce soit un entier ou un tableau.
Definition: fonctions.php:4747
get_css_files_to_load($minify=false)
get_css_files_to_load()
Definition: fonctions.php:1504
get_attribut_list_from_post_data(&$product_object, &$frm, $keep_free_attributs_only=false, $keep_costly_attributs_only=false)
Traite les informations relatives aux attributs dans le post d'un formulaire produit.
Definition: fonctions.php:606
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
$filename
nettoyer_dir($dir, $older_than_seconds=3, $filename_beginning=null, $create_files_array_found_instead_of_delete=false)
Effacement des fichiers trouvés répondant aux critères en argument, en effaçant récusivement le conte...
Definition: fonctions.php:3934
$product_field_names
static html_entity_decode($string, $quote_style=ENT_COMPAT, $charset=GENERAL_ENCODING)
String::html_entity_decode()
Definition: String.php:517
get_current_url_in_other_language($this_lang)
Ce module de gestion des URL dans d'autres langues doit être compatible avec l'URL Rewriting si activ...
Definition: fonctions.php:1680
set_configuration_variable($frm, $update_if_technical_code_exists=false, $allow_create=true)
Ajoute la zone HTML dans la table peel_configuration.
Definition: fonctions.php:4199
$req
Definition: ipn.php:30
verify_token($name= 'general', $delay_in_minutes=60, $check_referer_if_set_by_server=true, $cancel_token=true, $minimum_wait_in_seconds_before_use=0)
Vérification de la validité d'un token Par défaut, un token est valide 1h, et utilisable 1 seule fois...
Definition: fonctions.php:118
MDP($chrs=8)
Fonction utilisée pour générer un mot aléatoire (sert par exemple pour le renommage des fichiers imag...
Definition: fonctions.php:49
get_url_from_uploaded_filename($filename)
get_url_from_uploaded_filename()
Definition: fonctions.php:3553
affiche_banner($position=null, $return_mode=false, $page=null, $cat_id=null, $this_annonce_number=0, $page_type=null, $keywords_array=null, $lang=null, $return_array_with_raw_information=false, $ad_id=null, $page_related_to_user_id=null, $disable_cache=false)
affiche_banner()
Definition: fonctions.php:63
get_xml_value($filename, $filter_string, $items_count_max=8, $line_length_max=50)
get_xml_value()
Definition: fonctions.php:3152
$maxRows
Definition: produit.php:28
$id
Definition: articles.php:22
fprix($price, $display_currency=false, $currency_code_or_default=null, $convertion_needed_into_currency=true, $currency_rate=null, $display_iso_currency_code=false, $format=true, $force_format_separator=null, $add_rdfa_properties=false, $round_even_if_no_format=false)
fprix formatte le prix donné en le convertissant si nécessaire au préalable et en ajoutant éventuelle...
Definition: fonctions.php:242
$file_kind
display_specific_field_form($specific_field_infos_array, $display_mode= 'table')
Traiter l'affichage de champs spécifiques.
Definition: fonctions.php:5341
frmvalide($variable_to_test, $true_value= 'checked="checked"', $false_value="")
Affiche le mot "checked" si la variable est vraie sinon rien.
Definition: format.php:80
if(!defined('IN_PEEL')) affiche_menu_deroulant_1($div_id, $items_html_array)
affiche_menu_deroulant_1()
Definition: fonctions.php:25
clean_admins_actions($days_max=1460)
Suppression des anciennes actions administrateur Fonction associée à une notion de nettoyage automati...
Definition: fonctions.php:4005
save_mail_db($frm)
Cette fonction permet de sauvegarder les emails du formulaire de contact du site en base de données d...
Definition: fonctions.php:82
get_payment_select($selected_payment_technical_code=null, $show_selected_even_if_not_available=false, $show_site_info_if_needed=false)
get_payment_select()
Definition: fonctions.php:1187
db_close($database_object=null)
db_close()
Definition: database.php:605
static convert_accents($string, $convert_umlaut=false, $strip_umlaut=true)
convert_accents()
Definition: String.php:341
static substr($string, $start, $length=null)
Returns the portion of string specified by the start and length parameters.
Definition: String.php:112
check_if_module_active($module_name, $specific_file_name=null)
Renvoie si un module est présent et activé ou non - Peut être appelé avant ou après le chargement d'u...
clean_str($string)
Filtre une chaine de caractères.
Definition: fonctions.php:3226
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
get_site_info($array)
get_site_info()
Definition: Cache.php:27
get_site_domain($return_only_domains=false, $domain=null, $strip_subdomain=true)
Récupère le nom de domaine du site sans http:// et sans sous-domaine.
Definition: fonctions.php:3632
get_apparent_folder()
Renvoyer le répertoire racine apparent de l'URL courante.
Definition: fonctions.php:2268
get_country_id($country_name)
get_country_id()
Definition: fonctions.php:889
get_size_name($size_id)
Renvoie le nom d'une taille.
Definition: fonctions.php:1892
get_load_facebook_sdk_script($facebook_api_id=null)
get_load_facebook_sdk_script()
Definition: fonctions.php:4526
get_datepicker_javascript($load_timepicker=false)
get_datepicker_javascript()
Definition: fonctions.php:1443
init_fineuploader_interface()
Définit les variables javascript nécessaires pour initialiser fineuploader.
Definition: fonctions.php:5388
calcul_nbarti_parrub($rub)
calcul_nbrub()
Definition: fonctions.php:216
if(defined('IN_PEEL_ADMIN')||IN_INSTALLATION) $_SESSION['session_langue']
static rawurlencode($string, $avoid_slash=true)
Returns string compatible with Apache without the AllowEncodedSlashes directive ON => avoids systemat...
Definition: String.php:893
get_country_name($id)
Renvoie le nom d'un pays.
Definition: fonctions.php:856

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