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<