PEEL Shopping
Open source ecommerce : PEEL Shopping
search.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: search.php 47245 2015-10-08 16:47:28Z gboussin $
14 if (!empty($_GET['type']) && $_GET['type'] == 'error404') {
15  if (substr($_SERVER['REQUEST_URI'], 0, 1) == '/' && substr($_SERVER['REQUEST_URI'], 3, 1) == '/' && substr($_SERVER['REQUEST_URI'], 1, 2) != 'js') {
16  // On a une langue dans l'URL en tant que premier répertoire
17  // On la récupère ici, car le .htaccess n'a pas pu la récupérer pour gérer la 404
18  // NB : en revanche, pour les sous-domaines différents pour une langue donnée, ça se fait déjà en PHP dans le process normal, donc pas besoin de gérer ici
19  $_GET['langue'] = substr($_SERVER['REQUEST_URI'], 1, 2);
20  }
21  define('IN_404_ERROR_PAGE', true);
22  $GLOBALS['page_name'] = 'error404';
23  if(in_array(substr($_SERVER['REQUEST_URI'],-4), array('.css', '.png', '.jpg', '.gif', '.txt', '.xml'))) {
24  // Fichier CSS demandé : aucun contenu envoyé
25  // En effet, si le dossier n'existe pas, on peut arriver ici malgré le .htaccess <FilesMatch "\.(gif|jpe?g|png|ico|xml|gz|zip|txt|js|css)$"> ErrorDocument 404 default </FilesMatch>
26  die();
27  }
28 }
29 if (defined('PEEL_PREFETCH')) {
30  call_module_hook('configuration_end', array());
31 } else {
32  include("configuration.inc.php");
33 }
34 
35 if (!empty($_GET['type']) && $_GET['type'] == 'unset_quick_add_product_from_search_page') {
36  unset($_SESSION['session_search_product_list']);
37 }
38 if (!empty($_GET['type']) && $_GET['type'] == 'quick_add_product_from_search_page' && !empty($GLOBALS['site_parameters']['quick_add_product_from_search_page'])) {
40  $quick_add_product_from_search_page = true;
41  if (!empty($_GET['prodid']) && !empty($_GET['quantite'])) {
42  $_SESSION['session_search_product_list'][$_GET['prodid']] = $_GET['quantite'];
43  }
44 }
45 if (!empty($_GET['type']) && $_GET['type'] == 'error404') {
46  // On va présenter des résultats par défaut => on met comme URL de référence search.php pour le multipage, sinon cela créerait des liens vers des pages inexistantes
47  $_SERVER['REQUEST_URI'] = $GLOBALS['apparent_folder'] . 'search.php';
48 }
49 if (check_if_module_active('annonces') && String::rawurldecode(get_current_url(false, true)) == String::rawurldecode('/' . $GLOBALS['STR_MODULE_ANNONCES_URL_BUY'] . '/' . $GLOBALS['STR_MODULE_PREMIUM_URL_ADS_BY_KEYWORD'] . '-' . String::rawurlencode(vn($_GET['page'])) . '-' . vb($_GET['search']) . '.html') || String::rawurldecode(get_current_url(false, true)) == String::rawurldecode('/produits/' . vb($_GET['search']) . '.html') || String::rawurldecode(get_current_url(false, true)) == String::rawurldecode('/produits/' . vb($_GET['search']) . '-' . vn($_GET['page']) . '.html')) {
50  // Pour éviter des problèmes avec les + dans l'URL, on a dans le .htaccess une règle avec l'option B qui permet de garder encodé search et est à décoder via String::rawurldecode
51  $_GET['search'] = String::rawurldecode(vb($_GET['search']));
52  if (strpos($_GET['search'], '/') !== false) {
53  // Depuis octobre 2012, plus de possibilité d'avoir des / dans les URL de recherches qui sont réécrites et où search provient du coeur de l'URL
54  // Ca permet d'éviter un bug avec apache et les %2F en dehors du GET
55  redirect_and_die('/', true);
56  }
57 }
58 foreach(array('/produits/', '/'.$GLOBALS['STR_MODULE_PREMIUM_URL_ADS_BY_KEYWORD'].'-', '/supplier-research-', '/recherche-fournisseur-', '/busqueda-proveedor-') as $this_url_rewriting_main_expression) {
59  if(!empty($_GET['page']) && String::strpos(get_current_url(true, true), 'page=') !== false && check_if_module_active('annonces') && String::strpos(get_current_url(false, true), $this_url_rewriting_main_expression) !== false) {
60  // Numéro de page en ?page=... alors que URL rewriting contient déjà numéro de page
61  // String::strpos(get_current_url(false, true), '-' . vn($_GET['page']) . '-') === false permettrait de savoir si la valeur dans l'URL rewriting est différente que valeur en GET, mais peu importe, de toutes façons on redirige
62  redirect_and_die(get_current_url(false), true);
63  }elseif(!empty($_GET['search']) && String::strpos(get_current_url(true, true), 'search=') !== false && check_if_module_active('annonces') && String::strpos(get_current_url(false, true), $this_url_rewriting_main_expression) !== false) {
64  // Numéro de page en ?search=... alors que URL rewriting contient déjà la recherche
65  // String::strpos(get_current_url(false, true), '-' . vn($_GET['search']) . '.html') === false permettrait de savoir si la valeur dans l'URL rewriting est différente que valeur en GET, mais peu importe, de toutes façons on redirige
66  redirect_and_die(get_current_url(false), true);
67  }
68 }
69 define('IN_SEARCH', true);
70 
71 if (check_if_module_active('annonces')) {
72  get_lang_ads_post_manage($_GET);
73  if (check_if_module_active('maps')) {
74  include_once($GLOBALS['fonctionsmap']);
75  }
76 }
77 // Si vous mettez plusieurs multipage sur la page, on ne doit pas considérer que chacun connait le nombre de pages
78 // => dans ce cas, repassez à false avant le dernier Multipage et pas avant
79 $GLOBALS['multipage_avoid_redirect_if_page_over_limit'] = true;
80 if (!empty($GLOBALS['site_parameters']['twenga_ads_account_url'])) {
81  $GLOBALS['integrate_twenga_ads'] = true;
82 }
83 
84 $output = '';
86 $match = vb($_GET['match']);
87 $search = vb($_GET['search']);
89 $GLOBALS['meta_title'] = '';
90 $GLOBALS['meta_description'] = '';
91 $GLOBALS['meta_keywords'] = '';
92 
93 if(!empty($_GET['latitude'])){
94  $_SESSION['session_latitude'] = floatval($_GET['latitude']);
95 }
96 if(!empty($_GET['longitude'])){
97  $_SESSION['session_longitude'] = floatval($_GET['longitude']);
98 }
99 if (empty($search)) {
100  $search = '';
101  $terms = array();
102 } elseif (String::strlen($search) < 3) {
103  if (get_current_url(false) != get_current_url(true)) {
104  // On n'autorise pas de recherche sur un seul caractère ou 2 caractères
105  // On prend une recherche vide à la place, mais en gardant la recherche sur les critères complémentaires
106  redirect_and_die(get_current_url(true, false, array('search', 'match')), true);
107  }
108  $search = '';
109  $terms = array();
110 } else {
111  if (!empty($_GET['page']) && $_GET['page'] > 10 && String::strpos($_SERVER['HTTP_USER_AGENT'], 'bingbot') !== false) {
112  // Si des données sont en GET (pas URL proprement réécrite sans aucun GET) : on n'autorise pas de recherche sur les pages > 10 de la part de bing car crawl trop agressif
113  if (get_current_url(false) != get_current_url(true)) {
114  redirect_and_die(get_current_url(false), true);
115  }
116  }
118  if ($search == $GLOBALS['STR_ENTER_KEY']) {
119  $search = '';
120  }
122  $GLOBALS['meta_title'] = String::ucfirst($real_search);
123  $GLOBALS['meta_description'] = String::ucfirst($real_search) . ' - ';
124  $GLOBALS['meta_keywords'] = $real_search;
126 }
127 if (!empty($_GET['country'])) {
128  $GLOBALS['meta_title'] .= ' ' . String::ucfirst($_GET['country']);
129  $GLOBALS['meta_description'] = String::ucfirst($_GET['country']) . ' ' . $GLOBALS['meta_description'];
130  $GLOBALS['meta_keywords'] .= ' ' . String::strtolower($_GET['country']);
131 }
132 // tableau regroupant les caractéristiques des attributs fixes dans peel
133 $search_attribute_tab = array('marque' => array('table' => 'marques', 'join' => 'produits', 'join_id' => 'id_marque', 'label' => $GLOBALS['STR_BRAND_LB']),
134  'couleur' => array('table' => 'couleurs', 'join' => 'produits_couleurs', 'join_id' => 'couleur_id', 'label' => $GLOBALS['STR_COLOR_LB']),
135  'taille' => array('table' => 'tailles', 'join' => 'produits_tailles', 'join_id' => 'taille_id', 'label' => $GLOBALS['STR_TALL_LB'])
136  );
137 if (empty($GLOBALS['site_parameters']['disable_search_form_on_search_page'])) {
138  $output_form = get_search_form($_GET, $search, $match, $real_search, "full", !empty($quick_add_product_from_search_page));
139 } else {
140  $output_form = '';
141 }
142 
143 
144 // initialisation pour les recherches
145 $i = 1;
149 
150 $tpl_r = $GLOBALS['tplEngine']->createTemplate('search_result.tpl');
151 $tpl_r->assign('STR_SEARCH_PRODUCT', $GLOBALS['STR_SEARCH_PRODUCT']);
152 $tpl_r->assign('STR_SEARCH_RESULT_PRODUCT', $GLOBALS['STR_SEARCH_RESULT_PRODUCT']);
153 $tpl_r->assign('STR_SEARCH_NO_RESULT_PRODUCT', $GLOBALS['STR_SEARCH_NO_RESULT_PRODUCT']);
154 $tpl_r->assign('STR_RESULT_SEARCH', $GLOBALS['STR_RESULT_SEARCH']);
155 $tpl_r->assign('STR_SEARCH_RESULT_ARTICLE', $GLOBALS['STR_SEARCH_RESULT_ARTICLE']);
156 $tpl_r->assign('STR_SEARCH_NO_RESULT_ARTICLE', $GLOBALS['STR_SEARCH_NO_RESULT_ARTICLE']);
157 $tpl_r->assign('STR_SEARCH_RESULT_BRAND', $GLOBALS['STR_SEARCH_RESULT_BRAND']);
158 $tpl_r->assign('STR_SEARCH_NO_RESULT_BRAND', $GLOBALS['STR_SEARCH_NO_RESULT_BRAND']);
159 $tpl_r->assign('is_annonce_module_active', check_if_module_active('annonces'));
160 $tpl_r->assign('search_in_product_and_ads', !empty($GLOBALS['site_parameters']['search_in_product_and_ads']));
161 $tpl_r->assign('page', vn($_GET['page']));
162 $tpl_r->assign('search', $real_search);
163 if (check_if_module_active('sauvegarde_recherche')) {
164  $tpl_r->assign('display_save_search_button', display_save_search_button($_GET));
165 }
166 if (!check_if_module_active('annonces') || (check_if_module_active('annonces') && !empty($GLOBALS['site_parameters']['search_in_product_and_ads']))) {
167  // recherche dans les produits : on teste d'abord si il existe des produits affichables
168  $sql = "SELECT id
169  FROM peel_produits p
170  WHERE p.etat = '1' AND p.nom_" . $_SESSION['session_langue'] . " != '' AND " . get_filter_site_cond('produits', 'p') . "
171  LIMIT 1";
172  $query = query($sql);
173  if (fetch_assoc($query)) {
174  $launch_product_search = true;
175  }
176 }
177 if(!empty($launch_product_search)) {
178  // recherche dans les produits
179  $additional_sql_inner = '';
180  $additional_sql_cond_array = array();
181  $additional_sql_having = '';
182  if (check_if_module_active('search')) {
183  // on construit les conditions supplementaires de recherche
184  if (!empty($_GET['taille'])) {
185  $additional_sql_inner .= ' INNER JOIN peel_produits_tailles pt ON p.id=pt.produit_id';
186  $additional_sql_cond_array[] = 'pt.taille_id= "' . intval($_GET['taille']) . '"';
187  }
188  if (!empty($_GET['categorie'])) {
189  $additional_sql_cond_array[] = 'pc.categorie_id IN ("' . implode('","', get_category_tree_and_itself(intval($_GET['categorie']), 'sons', 'categories')) . '")';
190  }
191  if (!empty($_GET['couleur'])) {
192  $additional_sql_inner .= ' INNER JOIN peel_produits_couleurs pco ON p.id=pco.produit_id';
193  $additional_sql_cond_array[] = 'pco.couleur_id="' . intval($_GET['couleur']) . '"';
194  }
195  if (!empty($_GET['marque'])) {
196  $additional_sql_cond_array[] = 'p.id_marque="' . nohtml_real_escape_string($_GET['marque']) . '"';
197  }
198  if (!empty($_GET['date_flash'])) {
199  $additional_sql_cond_array[] = 'p.on_flash="1" AND p.flash_start LIKE "' . get_mysql_date_from_user_input(nohtml_real_escape_string($_GET['date_flash'])) . '%"';
200  }
201  if (!empty($_GET['custom_attribut']) && is_array($_GET['custom_attribut'])) {
202  foreach($_GET['custom_attribut'] as $this_attribut_id) {
203  if (!empty($this_attribut_id) && is_numeric($this_attribut_id)) {
204  $attributs_array[intval($this_attribut_id)] = true;
205  }
206  }
207  }
208  if (!empty($_GET['custom_nom_attribut']) && is_array($_GET['custom_nom_attribut'])) {
209  foreach($_GET['custom_nom_attribut'] as $this_nom_attribut_id) {
210  if (!empty($this_nom_attribut_id) && is_numeric($this_nom_attribut_id)) {
211  $nom_attributs_array[intval($this_nom_attribut_id)] = true;
212  }
213  }
214  }
215  if (!empty($attributs_array) || !empty($nom_attributs_array)) {
216  $additional_sql_inner .= ' INNER JOIN peel_produits_attributs pat ON p.id=pat.produit_id';
217  if (!empty($attributs_array)) {
218  $additional_sql_cond_array[] = 'pat.attribut_id IN (' . nohtml_real_escape_string(implode(',', array_keys($attributs_array))) . ')';
219  if(count($attributs_array)>1) {
220  $having_cond_array[] = 'COUNT(DISTINCT pat.attribut_id)>=' . count($attributs_array);
221  }
222  }
223  if (!empty($nom_attributs_array)) {
224  $additional_sql_cond_array[] = 'pat.nom_attribut_id IN (' . nohtml_real_escape_string(implode(',', array_keys($nom_attributs_array))) . ')';
225  if(count($attributs_array)>1) {
226  $having_cond_array[] = 'COUNT(DISTINCT pat.nom_attribut_id)>=' . count($nom_attributs_array);
227  }
228  }
229  // On veut que le produit ait tous les attributs cherchés : on fait la jointure pour trouver les différentes lignes concernées,
230  // et ensuite on doit vérifier que le nombre de lignes trouvées correspond bien à la recherche
231  if(!empty($having_cond_array)) {
232  $additional_sql_having .= 'HAVING '.implode(' AND ', $having_cond_array);
233  }
234  }
235  }
236  if (count($terms) > 0 || !empty($additional_sql_cond_array)) {
237  // SQL lié à la recherche textuelle
238  unset($fields);
239  $fields[] = 'p.nom_' . (!empty($GLOBALS['site_parameters']['product_name_forced_lang'])?$GLOBALS['site_parameters']['product_name_forced_lang']:$_SESSION['session_langue']);
240  $fields[] = 'p.descriptif_' . $_SESSION['session_langue'];
241  $fields[] = 'p.description_' . (!empty($GLOBALS['site_parameters']['product_description_forced_lang'])?$GLOBALS['site_parameters']['product_description_forced_lang']:$_SESSION['session_langue']);
242  $fields[] = 'p.tab1_html_' . $_SESSION['session_langue'];
243  $fields[] = 'p.tab1_title_' . $_SESSION['session_langue'];
244  $fields[] = 'p.tab2_html_' . $_SESSION['session_langue'];
245  $fields[] = 'p.tab2_title_' . $_SESSION['session_langue'];
246  $fields[] = 'p.tab3_html_' . $_SESSION['session_langue'];
247  $fields[] = 'p.tab3_title_' . $_SESSION['session_langue'];
248  $fields[] = 'p.tab4_html_' . $_SESSION['session_langue'];
249  $fields[] = 'p.tab4_title_' . $_SESSION['session_langue'];
250  $fields[] = 'p.tab5_html_' . $_SESSION['session_langue'];
251  $fields[] = 'p.tab5_title_' . $_SESSION['session_langue'];
252  $fields[] = 'p.reference';
253  $fields[] = 'c.nom_' . $_SESSION['session_langue'];
254  if (count($terms) > 0) {
255  $additional_sql_cond_array[] = build_terms_clause($terms, $fields, $match);
256  }
257  if (!empty($additional_sql_cond_array)) {
258  $additional_sql_cond = '(' . implode(') AND (', array_unique($additional_sql_cond_array)) . ')';
259  } else {
260  $additional_sql_cond = '';
261  }
262  $result_affichage_produit = affiche_produits(null, 2, 'search', $GLOBALS['site_parameters']['nb_produit_page'], 'column', true, 0, 3, true, true, $additional_sql_inner, $additional_sql_cond, $additional_sql_having);
263  if(!empty($GLOBALS['products_found']) && String::strlen($real_search)>=4) {
265  }
266  $tpl_r->assign('result_affichage_produit', $result_affichage_produit);
267  }
268 }
269 if (check_if_module_active('annonces')) {
270  // On fait la recherche dans le module d'annonces si il est présent
271  $additional_sql_cond_array = array();
272  $additional_sql_inner = '';
273  $categorie_annonce = null;
274  $tpl_r->assign('STR_MODULE_ANNONCES_SEARCH_RESULT_ADS', $GLOBALS['STR_MODULE_ANNONCES_SEARCH_RESULT_ADS']);
275  $tpl_r->assign('STR_MODULE_ANNONCES_SEARCH_NO_RESULT_ADS', $GLOBALS['STR_MODULE_ANNONCES_SEARCH_NO_RESULT_ADS']);
276  if (!empty($_GET['cat_select']) && !is_array($_GET['cat_select'])) {
277  $categorie_annonce = intval($_GET['cat_select']);
278  }
279  // Si la catégorie est unique, elle est traitée séparément de get_ad_search_sql
280  $sql_cond = get_ad_search_sql($_GET, empty($categorie_annonce));
281  if (!empty($GLOBALS['site_parameters']['ads_search_page_display_mode']) && $GLOBALS['site_parameters']['ads_search_page_display_mode'] == 'column') {
282  $boostrap_column_sizes_array = array('sm' => 4, 'md' => 4, 'lg' => 4);
283  } else {
284  $boostrap_column_sizes_array = array('sm' => 12, 'md' => 12, 'lg' => 12);
285  }
286  $res_affiche_annonces = affiche_annonces($categorie_annonce, $sql_cond, null, 'search', $GLOBALS['site_parameters']['ads_per_page'], vb($GLOBALS['site_parameters']['ads_search_page_display_mode'], 'line'), true, null, 4, false, true, false, $boostrap_column_sizes_array, 0, '', '', false);
287  if(!empty($GLOBALS['ads_found']) && String::strlen($real_search)>=4) {
289  }
290  if (vn($_GET['page'])<=1) {
291  // On transmet le GET, en étant compatible avec les tableaux en GET (=> por ne pas avoir besoin de reconstruire la chaine à partir de GET)
292  $xml_call_args = String::substr(get_current_url(true),String::strlen(get_current_url(false))+1);
293  if(!empty($_GET['search']) && strpos($xml_call_args, 'search=')===false) {
294  // Gestion des pages avec URL rewriting
295  if(!empty($xml_call_args)) {
296  $xml_call_args .= '&';
297  }
298  $xml_call_args .= 'search='.$_GET['search'];
299  }
300  if(!empty($GLOBALS['ads_found']) && check_if_module_active('maps')) {
301  $res_affiche_annonces = getUserMap(null, $xml_call_args, 0, false, false) . $res_affiche_annonces;
302  }
303  }
304  $tpl_r->assign('res_affiche_annonces', $res_affiche_annonces);
305 }
306 
307 if (vn($_GET['page'])<=1 && count($terms) > 0) {
308  // On ne recherche dans les articles & marques que si l'on a renseigné le champs texte
309  // Affichage sur la première page uniquement (pas de multipage)
310  $tpl_r->assign('are_terms', true);
311  $tpl_arts_found = array();
312  // Recherche dans les rubriques : on teste d'abord si il existe des rubriques affichables
313  $sql = "SELECT id
314  FROM peel_rubriques r
315  WHERE r.etat = '1' AND r.nom_" . $_SESSION['session_langue'] . " != '' AND " . get_filter_site_cond('rubriques', 'r') . "
316  LIMIT 1";
317  $query = query($sql);
318  if (fetch_assoc($query)) {
319  $launch_content_category_search = true;
320  }
321  if(!empty($launch_content_category_search)) {
322  // Recherche dans les rubriques
323  unset($fields);
324  $fields[] = 'r.nom_' . $_SESSION['session_langue'];
325  $fields[] = 'r.description_' . $_SESSION['session_langue'];
327  $result = query($sql);
328  while ($rub = fetch_assoc($result)) {
329  $titre = $rub['nom_' . $_SESSION['session_langue']];
330  // on supprime le HTML du contenu
331  $texte = String::strip_tags(String::html_entity_decode_if_needed($rub['description_' . $_SESSION['session_langue']]));
332  // si trop long, on coupe
333  $texte = String::str_shorten($texte, $taille_texte_affiche, '', '...', $taille_texte_affiche-20);
334  // on fait une recherche sur le texte sans accent avec les mots de l'utilisateur
337  // affichage
338  $tpl_arts_found[] = array('num' => $i,
339  'category_href' => get_content_category_url($rub['id'], $rub['nom_' . $_SESSION['session_langue']]),
340  'rubrique' => $rub['nom_' . $_SESSION['session_langue']],
341  'content_href' => null,
342  'titre' => $titre,
343  'texte' => $texte
344  );
345  $i++;
346  }
347  }
348  // Recherche dans les articles : on teste d'abord si il existe des articles affichables
349  $sql = "SELECT id
350  FROM peel_articles a
351  WHERE " . get_filter_site_cond('articles', 'a') . " AND a.etat = '1' AND (a.chapo_" . $_SESSION['session_langue'] . " != '' || a.texte_" . $_SESSION['session_langue'] . " != '')
352  LIMIT 1";
353  $query = query($sql);
354  if (fetch_assoc($query)) {
355  $launch_article_search = true;
356  }
357  if(!empty($launch_article_search)) {
358  // recherche dans les articles
359  unset($fields);
360  $fields[] = 'a.surtitre_' . $_SESSION['session_langue'];
361  $fields[] = 'a.titre_' . $_SESSION['session_langue'];
362  $fields[] = 'a.texte_' . $_SESSION['session_langue'];
363  $fields[] = 'a.chapo_' . $_SESSION['session_langue'];
364  $sql = build_sql_articles($terms, $fields, $match);
365  $result = query($sql);
366  while ($art = fetch_assoc($result)) {
367  $surtitre = $art['surtitre_' . $_SESSION['session_langue']];
368  $titre = $art['titre_' . $_SESSION['session_langue']];
369  // on supprime le HTML du contenu
370  $texte = String::strip_tags(String::html_entity_decode_if_needed($art['texte_' . $_SESSION['session_langue']]));
371  $chapo = String::strip_tags(String::html_entity_decode_if_needed($art['chapo_' . $_SESSION['session_langue']]));
372  // si trop long, on coupe
373  $texte = String::str_shorten($texte, $taille_texte_affiche, '', '...', $taille_texte_affiche-20);
374  $chapo = String::str_shorten($chapo, $taille_texte_affiche, '', '...', $taille_texte_affiche-20);
375  // on fait une recherche sur le texte sans accent avec les mots de l'utilisateur
378  // certains champ ne sont pas affichés, mais on teste pour savoir si le mot se trouve dedans pour l'ajouter au tag_cloud
379  // on ajoute dans le tableau $found_words_array[]
382  // affichage
383  $tpl_arts_found[] = array('num' => $i,
384  'category_href' => get_content_category_url($art['rubrique_id'], $art['rubrique']),
385  'rubrique' => $art['rubrique'],
386  'content_href' => get_content_url($art['id'], $titre, $art['rubrique_id'], $art['rubrique']),
387  'titre' => $titre,
388  'texte' => $texte
389  );
390  $i++;
391  }
392  $tpl_r->assign('arts_found', $tpl_arts_found);
393  }
394  // Recherche dans les marques : on teste d'abord si il existe des marques affichables
395  $sql = "SELECT id
396  FROM peel_marques m
397  WHERE m.etat = '1' AND m.nom_" . $_SESSION['session_langue'] . " != '' AND " . get_filter_site_cond('marques', 'm') . "
398  LIMIT 1";
399  $query = query($sql);
400  if (fetch_assoc($query)) {
401  $launch_article_search = true;
402  }
403  if(!empty($launch_brand_search)) {
404  // Recherche dans les marques
405  $tpl_brands_found = array();
406  $i = 1;
407  unset($fields);
408  $fields[] = 'm.nom_' . $_SESSION['session_langue'];
409  $fields[] = 'm.description_' . $_SESSION['session_langue'];
410  $sql = build_sql_marques($terms, $fields, $match);
411  $result = query($sql);
412  while ($marque = fetch_assoc($result)) {
413  $nom = $marque['nom_' . $_SESSION['session_langue']];
414  $urlbrand = get_url('/achat/marque.php', array('id' => $marque['id']));
415  // on supprime le HTML du contenu
416  $description = String::strip_tags(String::html_entity_decode_if_needed($marque['description_' . $_SESSION['session_langue']]));
417  // on coupe le texte si trop long
418  $description = String::str_shorten($description, $taille_texte_affiche, '', '...', $taille_texte_affiche-20);
419  // on fait une recherche sur le texte sans accent avec les mots de l'utilisateur,
420  // si qqchose est trouvé, highlight_found_text l'ajoute dans le tableau $found_words_array[]
421  $description = highlight_found_text($description, $terms, $found_words_array);
423  // affichage
424  $tpl_brands_found[] = array('num' => $i,
425  'href' => $urlbrand,
426  'nom' => $nom,
427  'description' => $description
428  );
429  $i++;
430  }
431  $tpl_r->assign('brands_found', $tpl_brands_found);
432  }
433  // On sait quel mot recherché correspond à un mot existant sur une première page de recherche, on l'ajoute dans peel_tag_cloud
434  if (vn($_GET['page'])<=1 && !empty($found_words_array) && check_if_module_active('tagcloud')) {
435  $keywords_array = get_keywords_from_text($found_words_array, 5, 20, false, true, null);
436  foreach ($keywords_array as $this_keyword) {
437  // On ne stocke que les expressions globales, et les mots suffisamment longs pour éviter tous les mots d'articulation
438  sql_tagcloud($this_keyword);
439  }
440  }
441 }
442 $result = $tpl_r->fetch();
443 $tpl = $GLOBALS['tplEngine']->createTemplate('search.tpl');
444 if (!empty($_GET['type']) && $_GET['type'] == 'error404') {
445  $content = affiche_contenu_html('error404', true);
446  if(!$GLOBALS['affiche_contenu_html_last_found']) {
447  // Pas de contenu défini dans la langue de la page, on force un message pour indiquer l'erreur
448  $content = '<h1>Error 404</h1><br />';
449  }
450  $tpl->assign('content', $content);
451 
452 }
453 $tpl->assign('quick_add_product_from_search_page', !empty($quick_add_product_from_search_page));
454 $tpl->assign('form', $output_form);
455 $tpl->assign('search', $real_search);
456 $tpl->assign('result', vb($result));
457 $tpl->assign('page', vn($_GET['page']));
458 $tpl->assign('STR_SEARCH_HELP', $GLOBALS['STR_SEARCH_HELP']);
459 $tpl->assign('STR_SEARCH_PRODUCT', $GLOBALS['STR_SEARCH_PRODUCT']);
460 $output .= $tpl->fetch();
461 
462 include($GLOBALS['repertoire_modele'] . '/haut.php');
463 echo $output;
464 include($GLOBALS['repertoire_modele'] . '/bas.php');
465 
466 /* FONCTIONS */
467 
476 function build_sql_content_category($terms, $fields, $match_method)
477 {
478  $requete = 'SELECT r.id';
479  foreach ($fields as $value) {
480  $requete .= ', ' . real_escape_string($value) . ' ';
481  }
482  $requete .= '
483  FROM peel_rubriques r
484  WHERE r.etat = "1" AND ' . build_terms_clause($terms, $fields, $match_method) . ' AND ' . get_filter_site_cond('rubriques', 'r') . '
485  ORDER BY r.position ASC, r.id DESC
486  LIMIT 100';
487  return $requete;
488 }
489 
498 function build_sql_articles($terms, $fields, $match_method)
499 {
500  $requete = 'SELECT a.id, r.id AS rubrique_id, r.nom_' . $_SESSION['session_langue'] . ' AS rubrique ';
501  foreach ($fields as $value) {
502  $requete .= ', ' . real_escape_string($value) . ' ';
503  }
504  $requete .= '
505  FROM peel_articles a
506  INNER JOIN peel_articles_rubriques ar ON ar.article_id = a.id
507  INNER JOIN peel_rubriques r ON r.id = ar.rubrique_id AND r.technical_code NOT IN ("nosearch", "other", "iphone_content") AND ' . get_filter_site_cond('rubriques', 'r') . '
508  WHERE a.etat = "1" AND ' . get_filter_site_cond('articles', 'a') . ' AND a.technical_code NOT IN ("nosearch") AND ' . build_terms_clause($terms, $fields, $match_method) . '
509  GROUP BY a.id
510  ORDER BY a.position ASC, a.id DESC
511  LIMIT 100';
512  return $requete;
513 }
514 
523 function build_sql_marques($terms, $fields, $match_method)
524 {
525  $requete = 'SELECT m.id ';
526  foreach ($fields as $value) {
527  $requete .= ', ' . real_escape_string($value) . ' ';
528  }
529  $requete .= '
530  FROM peel_marques m
531  WHERE m.etat = "1" AND ' . get_filter_site_cond('marques', 'm') . ' AND ' . build_terms_clause($terms, $fields, $match_method) . '
532  ORDER BY m.id DESC
533  LIMIT 100';
534  return $requete;
535 }
536 
if(!empty($GLOBALS['site_parameters']['twenga_ads_account_url'])) $output
Definition: search.php:84
static strip_tags($string, $allowed_tags=null)
String::strip_tags()
Definition: String.php:548
highlight_found_text($text, $terms, &$found_words_array, $found_tags=array('< span class="search_tag">', '</span >'))
Highlights terms in text.
Definition: format.php:1120
build_terms_clause($terms, $fields, $match_method)
builds the sql statement's where clause this will build the sql based on the given information Valeur...
Definition: fonctions.php:3714
static strpos($haystack, $needle, $offset=0)
Returns the numeric position of the first occurrence of needle in the haystack string.
Definition: String.php:54
get_current_url($with_get=true, $get_short_url=false, $take_away_get_args_array=null)
get_current_url()
Definition: fonctions.php:1743
static rawurldecode($string, $avoid_slash=false)
Returns rawurldecode.
Definition: String.php:909
$attributs_array
$i
Definition: search.php:145
redirect_and_die($url, $permanent_redirection=false, $avoid_loop=false)
Redirige vers l'URL demandée et arrête le programme.
Definition: fonctions.php:1551
build_search_terms($search, $match_method)
Découpe la chaine recherchée en éléments distincts suivant le mode $match_method Valeurs de $match_me...
Definition: fonctions.php:3675
static html_entity_decode_if_needed($string)
String::html_entity_decode_if_needed()
Definition: String.php:533
sql_tagcloud($motclef)
Insertion Tag de recherche.
Definition: fonctions.php:83
static strtolower($string)
Returns string with all alphabetic characters converted to lowercase.
Definition: String.php:135
static strlen($string)
Returns the length of the given string.
Definition: String.php:36
nohtml_real_escape_string($value, $allowed_tags=null)
Protège les données pour insertion dans MySQL ET supprime les tags HTML pour protéger de toute sorte ...
Definition: database.php:400
build_sql_articles($terms, $fields, $match_method)
build_sql_articles()
Definition: search.php:498
if(!empty($_GET['country'])) $search_attribute_tab
Definition: search.php:133
if(check_if_module_active('sauvegarde_recherche')) if(!check_if_module_active('annonces')||(check_if_module_active('annonces')&&!empty($GLOBALS['site_parameters']['search_in_product_and_ads']))) if(!empty($launch_product_search)) if(check_if_module_active('annonces')) if(vn($_GET['page'])<=1 &&count($terms) > 0) $result
Definition: search.php:442
real_escape_string($value)
real_escape_string()
Definition: database.php:374
if(check_if_module_active('annonces')) $GLOBALS['multipage_avoid_redirect_if_page_over_limit']
Definition: search.php:79
get_filter_site_cond($table_technical_code, $table_alias=null, $use_strict_rights_if_in_admin=false, $specific_site_id=null, $exclude_public_items=false, $admin_force_multisite_if_allowed=false)
Retourne la condition SQL permettant de filtrer les données pour une table.
Definition: fonctions.php:4643
get_category_tree_and_itself($id_or_ids_array, $mode= 'sons', $table_to_use= 'categories')
get_category_tree_and_itself()
Definition: fonctions.php:933
$found_words_array
Definition: search.php:147
query($query, $die_if_error=false, $database_object=null, $silent_if_error=false, $security_sql_filter=true)
The query() function is meant to be called anywhere you want to make a query.
Definition: database.php:158
$terms
Definition: search.php:125
vb(&$var, $default=null)
Variable blanche if $var n'est pas défini, retourne $default, sinon retourne $var.
Definition: format.php:97
if(strlen($date2)== '10') if($type== 'users-by-age'&&a_priv('admin_users', true)) elseif($type== 'forums-count'&&a_priv('admin_content', true)) elseif($type== 'forums-categories'&&a_priv('admin_content', true)) elseif($type== 'users-count'&&a_priv('admin_users', true)) elseif($type== 'product-categories'&&a_priv('admin_products', true)) elseif($type== 'users-by-sex'&&a_priv('admin_users', true)) elseif($type== 'users-by-country'&&a_priv('admin_users', true)) elseif($type== 'sales'&&a_priv('admin_sales', true))
Definition: chart-data.php:160
necessite_identification()
Si l'utilisateur n'est pas connecté à un compte, on affiche une page d'identification et arrête le sc...
Definition: fonctions.php:1596
fetch_assoc($query_result)
fetch_assoc()
Definition: database.php:283
$tpl_r
Definition: search.php:150
build_sql_marques($terms, $fields, $match_method)
build_sql_marques()
Definition: search.php:523
call_module_hook($hook, $params, $mode= 'boolean')
Appelle la fonction correspondant au $hook pour chaque module installé La fonction doit s'appeler : [...
$resultat_produit
Definition: search.php:146
$output_result
Definition: search.php:85
$real_search
Definition: search.php:88
get_mysql_date_from_user_input($string, $use_current_hour_min_sec_if_missing=false)
Transforme une date formattée par get_formatted_date() en date MySQL Si la date est vide...
Definition: format.php:496
get_keywords_from_text($string_or_array, $min_length=3, $max_length=20, $allow_numeric=false, $get_long_keywords_first=true, $max_words=7)
Nettoie une chaine des stop words, retire les mots trop courts, et renvoie une liste de mots clés...
Definition: format.php:1075
vn(&$var, $default=0)
Variable nulle if $var n'est pas défini, retourne $default, sinon retourne $var.
Definition: format.php:110
$tpl
Definition: search.php:443
$match
Definition: search.php:86
static html_entity_decode($string, $quote_style=ENT_COMPAT, $charset=GENERAL_ENCODING)
String::html_entity_decode()
Definition: String.php:517
build_sql_content_category($terms, $fields, $match_method)
build_sql_content_category()
Definition: search.php:476
static substr($string, $start, $length=null)
Returns the portion of string specified by the start and length parameters.
Definition: String.php:112
check_if_module_active($module_name, $specific_file_name=null)
Renvoie si un module est présent et activé ou non - Peut être appelé avant ou après le chargement d'u...
static str_shorten($string, $length_limit, $middle_separator= '', $ending_if_no_middle_separator= '...', $ideal_length_with_clean_cut_if_possible=null)
Raccourcit une chaine de caractère en insérant au milieu ou à la fin un séparateur.
Definition: String.php:233
$search
Definition: search.php:87
static ucfirst($string)
Returns string with first letter uppercase.
Definition: String.php:173
$taille_texte_affiche
Definition: search.php:148
if(defined('IN_PEEL_ADMIN')||IN_INSTALLATION) $_SESSION['session_langue']
static rawurlencode($string, $avoid_slash=true)
Returns string compatible with Apache without the AllowEncodedSlashes directive ON => avoids systemat...
Definition: String.php:893

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