ressources = $ressources; $this->parametres = $parametres; $this->bdd = $bdd; $this->versions = $versions; $this->masquesStrictes = array('code'); $this->paramsMasque = array( '' => 'nom', 'code' => 'id_terme', 'nom' => $this->getChampPourLangue('nom'), 'description' => $this->getChampPourLangue('description')); } public function getDetails() { $table = $this->getTableTerme(); $tableType = $this->getTableType(); $detailsId = $this->ressources->getDetailsId(); $detailsId = $this->bdd->proteger($detailsId); $requete = 'SELECT o.*, type '. "FROM $table AS o ". " LEFT JOIN $tableType ON (ce_type = id_type) ". "WHERE id_terme = $detailsId "; $resultats = $this->bdd->recuperer($requete); $terme = new OntologieDO($resultats); return $terme; } public function rechercher() { $clause = $this->getClauseSelectSpeciale(); $table = $this->getTableTerme(); $tableType = $this->getTableType(); $tablePublication = $this->getTablePublication(); $tableAuteur = $this->getTableAuteur(); $tableImage = $this->getTableImage(); $conditions = $this->getConditions(); $where = $this->getWhere($conditions); $ordre = $this->getOrdre(); $navigation = $this->getNavigation(); $requete = "SELECT $clause o.*, t.type, p.*, a.*, i.* ". "FROM $table AS o ". " LEFT JOIN $tableType AS t ON (ce_type = id_type) ". " LEFT JOIN $tablePublication AS p ON (ce_publication = id_publication) ". " LEFT JOIN $tableAuteur AS a ON (ce_auteur = id_auteur) ". " LEFT JOIN $tableImage AS i ON (ce_image = id_image) ". $where.' '.$conditions.' '.$ordre.' '. "LIMIT $navigation "; //die($requete); $this->requeteNbreNomsTotal = $this->transformerRequetePourNbreTermesTotal($requete); $resultats = $this->bdd->recupererTous($requete); return $resultats; } private function getClauseSelectSpeciale() { $clause = (Config::get('bdd_protocole') == 'mysql') ? 'SQL_CALC_FOUND_ROWS' : ''; return $clause; } private function getTableTerme() { return sprintf($this->getNomTableTpl(), 'terme'); } private function getTableType() { return sprintf($this->getNomTableTpl(), 'type'); } private function getTablePublication() { return sprintf($this->getNomTableTpl(), 'publication'); } private function getTableAuteur() { return sprintf($this->getNomTableTpl(), 'auteur'); } private function getTableImage() { return sprintf($this->getNomTableTpl(), 'image'); } private function getTableHierarchie() { return sprintf($this->getNomTableTpl(), 'hierarchie'); } private function getNomTableTpl() { $versions = $this->versions->getVersions(); $derniereVersion = end($versions); $projetNom = strtolower($this->ressources->getProjetNom()); return $projetNom.'_ontologies_%s_v'.$derniereVersion; } private function getConditions() { $operateurParDefaut = $this->getOperateurCondition(); $conditionsSql = array(); foreach ($this->paramsMasque as $typeMasque => $champ) { $operateur = in_array($typeMasque, $this->masquesStrictes) ? '=' : $operateurParDefaut; if ($valeurMasque = $this->parametres->getMasquePourBdd($typeMasque)) { if ($operateur == 'SOUNDEX') { $tpl = '(SOUNDEX(%s) = SOUNDEX(%s)) OR (SOUNDEX(REVERSE(%s)) = SOUNDEX(REVERSE(%s))) '; $conditionsSql[] = sprintf($tpl, $champ, $valeurMasque, $champ, $valeurMasque); } else { $conditionsSql[] = "$champ $operateur $valeurMasque"; } } } return implode(' AND ', $conditionsSql); } private function getOperateurCondition() { $operateur = ''; $recherche = $this->parametres->get('recherche'); if ($recherche == 'stricte') { $operateur = '='; } else if ($recherche == 'etendue') { $operateur = 'LIKE'; } else if ($recherche == 'floue') { $operateur = 'SOUNDEX'; } return $operateur; } private function getWhere($conditions = '') { $where = ''; if ($conditions != '') { $where = 'WHERE '; } return $where; } private function getOrdre() { $champNom = $this->getChampPourLangue('nom'); $ordre = "ORDER BY $champNom ASC "; return $ordre; } private function getChampPourLangue($champ) { $lg = $this->parametres->get('retour.langue'); if ($lg == 'en') { $champ .= '_en'; } return $champ; } private function getNavigation() { $debut = (int) $this->parametres->get('navigation.depart'); $nbre = $this->parametres->get('navigation.limite'); $navigation = "$debut,$nbre"; return $navigation; } private function transformerRequetePourNbreTermesTotal($requete) { $requete = preg_replace('/SELECT .* FROM/', 'SELECT COUNT(*) AS nbre FROM', $requete); $requete = preg_replace('/LIMIT [0-9]+,[0-9]+/', '', $requete); return $requete; } public function trierResultatsFloue($termes) { foreach ($this->paramsMasque as $typeMasque => $champ) { if ($termeDemande = $this->parametres->getMasquePourBdd($typeMasque)) { $termeDemandeSimple = strtolower(Chaine::supprimerAccents($termeDemande)); foreach ($termes as $id => $terme) { $termeFlouSimple = strtolower(Chaine::supprimerAccents($terme[$this->getChampPourLangue('nom')])); // Prime pour la ressemblance globale : $leven = levenshtein($termeFlouSimple, $termeDemandeSimple); // On affine $similar = similar_text($termeDemandeSimple, $termeFlouSimple) * 3; // Prime Soundex $soundex = (soundex($termeDemandeSimple) == soundex($termeFlouSimple)) ? 1000 : 0; // Calcul du score $score = 500 - $leven + $similar + $soundex; $termes[$id]['score'] = $score; $termes[$id]['score_calcul'] = "$termeDemandeSimple / $termeFlouSimple : 500 - $leven + $similar + $soundex = $score"; } $termes = Tableau::trierMD($termes, array('score' => SORT_DESC)); } } //echo 'ici
'.print_r($termes, true).'
';die(); return $termes; } public function recupererNombreTermesTotal() { if (Config::get('bdd_protocole') == 'mysql') { $requete = 'SELECT FOUND_ROWS() AS nbre'; } else { $requete = $this->requeteNbreNomsTotal; } $nombre = $this->bdd->recuperer($requete); return (int) $nombre['nbre']; } } ?>