PluginsClassiques("recherche"); } function init() { $this->ajout_desc( "Recherche améliorée", "Plugin de recherche amélioré", "Ce plugin améliore la recherchede Thélia, en normalisant les mots recherchés, anfin de remonter des résultats plus pertinents.", 1); } function destroy() { // Rien } function action() { global $res; $mode == 'et'; $exact = 0; if (isset($_REQUEST['recherche_mode'])) { $mode = strtolower($_REQUEST['recherche_mode']); if ($mode == 'et' || $mode == 'ou') { $res = str_replace('#RECHERCHE_MODE', $mode, $res); } } if (isset($_REQUEST['recherche_exacte'])) { $exact = intval($_REQUEST['recherche_exacte']) > 0 ? 1 : 0; } if (strstr($res, '#RECHERCHE_') !== false) { $res = str_replace('#RECHERCHE_MODE', $mode, $res); $res = str_replace('#RECHERCHE_EXACTE', $exact, $res); } } function boucle($texte, $args) { $boucle = lireTag($args, 'boucle'); if ($boucle == '') $boucle="produit"; switch(strtolower($boucle)) { case 'produit': return $this->boucleProduit($texte, $args); break; case 'rubrique': return $this->boucleRubrique($texte, $args); break; case 'contenu': return $this->boucleContenu($texte, $args); break; case 'page': return $this->bouclePage($texte, $args); break; } } function chercher($query, $boucle, $texte, $args, $nombre = false, $pour_comptage = false) { $motcle = trim(lireTag($args, "motcle")); $mode = trim(lireTag($args, "mode")); $exact = intval(trim(lireTag($args, "exact"))); $nombre = lireTag($args, "num"); $nombre = $nombre == '' ? false : intval($nombre); if ($mode == '') $mode = 'et'; if ($motcle == '') return ''; $res = ''; $tk = new StemmingToolkit(); $words = $tk->indexText($motcle, 'fr', $exact ? false : true); $where = array(); foreach($words['index'] as $index) { $word = $index['stem']; if ($exact) $exp = "REGEXP '[[:<:]]${word}[[:>:]]'"; else $exp = "like '%$word%'"; $where[] = "(".($boucle == 'boucleProduit' ? "ref $exp OR" : "")." titre $exp OR chapo $exp OR description $exp OR postscriptum $exp)"; } if (count($where) > 0) { $query = "$query WHERE ".implode($mode == 'et' ? ' AND ' : ' OR ', $where); if ($nombre) { $page = $this->get_current_page(); if ($page <= 0) $page = 1; $offset = $nombre * ($page - 1); $query .= " LIMIT $offset, $nombre"; $this->rechparams = ''; } $ids = array(); $result = mysql_query($query); if ($result) { if ($pour_comptage) return mysql_num_rows($result); while ($row = mysql_fetch_object($result)) { if (intval($row->id != 0)) $ids[] = $row->id; } } if (count($ids) > 0) { $pargs = preg_replace('/motcle="([^"]+)"/i', 'id="'.implode(',', $ids).'"', $args); $res = $boucle($texte, $pargs); } } return $res; } function boucleProduit($texte, $args, $nombre = false, $pour_comptage = false) { return $this->chercher( "select distinct p.id from produitdesc pd LEFT JOIN produit p ON p.id=pd.produit", 'boucleProduit', $texte, $args, $nombre, $pour_comptage ); } function boucleRubrique($texte, $args, $nombre = false, $pour_comptage = false) { return $this->chercher( "select distinct r.id from rubriquedesc rd LEFT JOIN rubrique r ON r.id=rd.rubrique", 'boucleRubrique', $texte, $args, $nombre, $pour_comptage ); } function boucleContenu($texte, $args, $nombre = false, $pour_comptage = false) { return $this->chercher( "select distinct c.id from contenudesc cd LEFT JOIN contenu c ON c.id=cd.contenu", 'boucleContenu', $texte, $args, $nombre, $pour_comptage ); } // Ceci est un quasi copier-coller de la boucle 'page' de Thélia, // vu qu'on ne peut pas l'utiliser pour faire notre pagination // on est obligés de la recopier. C'est nul :-( private function bouclePage($texte, $args) { $num = lireTag($args, "num"); $courante = lireTag($args, "courante"); $pagecourante = lireTag($args, "pagecourante"); $typeaff = lireTag($args, "typeaff"); $max = lireTag($args, "max"); $affmin = lireTag($args, "affmin"); $avance = lireTag($args, "avance"); $type_page = lireTag($args, "type_page"); $motcle = urlencode(lireTag($args, "motcle")); $i=0; $args = str_replace('num=', '__num__=', $args); switch(strtolower($type_page)) { case 'produit': $nbres = $this->boucleProduit($texte, $args, false, true); break; case 'rubrique': $nbres = $this->boucleRubrique($texte, $args, false, true); break; case 'contenu': $nbres = $this->boucleContenu($texte, $args, false, true); break; default: return ''; } $page = $this->get_current_page(); if ($page<=0) $page=1; $bpage=$page; $res=""; $page = $bpage; $nbpage = ceil($nbres/$num); if($page+1>$nbpage) $pagesuiv=$page; else $pagesuiv=$page+1; if($page-1<=0) $pageprec=1; else $pageprec=$page-1; if($nbpage<$affmin) return; if($nbpage == 1) return; if($typeaff == 1) { if(!$max) $max=$nbpage+1; if($page && $max && $page>$max) $i=ceil(($page)/$max)*$max-$max+1; if($i == 0) $i=1; $fin = $i+$max; for (; $i<$nbpage+1 && $i<$fin; $i++ ) { $temp = str_replace("#PAGE_NUM", "$i", $texte); $temp = str_replace("#PAGE_SUIV", "$pagesuiv", $temp); $temp = str_replace("#PAGE_PREC", "$pageprec", $temp); $temp = str_replace("#MOTCLE", $motcle, $temp); if($pagecourante && $pagecourante == $i) { if($courante =="1" && $page == $i ) $res .= $temp; else if($courante == "0" && $page != $i ) $res .= $temp; else if($courante == "") $res .= $temp; } else if(!$pagecourante) $res .= $temp; } } else if($typeaff == "0" && ($avance == "precedente" && $pageprec != $page)) { $temp = str_replace("#PAGE_NUM", "$page", $texte); $temp = str_replace("#PAGE_PREC", "$pageprec", $temp); $temp = str_replace("#MOTCLE", $motcle, $temp); $res .= $temp; } else if($typeaff == "0" && ($avance == "suivante" && $pagesuiv != $page)) { $temp = str_replace("#PAGE_NUM", "$page", $texte); $temp = str_replace("#PAGE_SUIV", "$pagesuiv", $temp); $temp = str_replace("#MOTCLE", $motcle, $temp); $res .= $temp; } else if($typeaff == "0" && $avance == "") { $temp = str_replace("#PAGE_NUM", "$page", $texte); $temp = str_replace("#PAGE_SUIV", "$pagesuiv", $temp); $temp = str_replace("#PAGE_PREC", "$pageprec", $temp); $temp = str_replace("#MOTCLE", $motcle, $temp); $res .= $temp; } return $res; } private function get_current_page() { return isset($_REQUEST['rechpage']) ? intval($_REQUEST['rechpage']) : 0; } } ?>