diff --git a/core/core.php b/core/core.php index d4761f31..4b39e73c 100644 --- a/core/core.php +++ b/core/core.php @@ -42,7 +42,8 @@ class common { 'page', 'sitemap', 'theme', - 'user' + 'user', + 'search' ]; private $data = []; private $hierarchy = [ diff --git a/core/module/search/search.php b/core/module/search/search.php new file mode 100644 index 00000000..d970d71e --- /dev/null +++ b/core/module/search/search.php @@ -0,0 +1,152 @@ + self::GROUP_VISITOR, + ]; + +// Liste de fonctions correspondant aux vues + + public function index() { + if($this->isPost()) { + // Récupération de l'ensemble des données d'un site ZWII + // Lire le fichier core.json si il existe + // Traitement du formulaire + $success = true; + $result = ''; + if(file_exists ('./site/data/core.json')) { + $json_source = file_get_contents('./site/data/core.json'); + + // Décoder le JSON en un array + $array = json_decode($json_source,true); + + // Récupération du mot clef passé par le formulaire de ...view/index.php, avec caractères accentués + $motclef=$this->getInput('searchMotphraseclef'); + + $result = '

Recherche avec le mot clef : '.$motclef.'

'; + if ($motclef !== "" && strlen($motclef) > 2) { + $dejavu = ''; + $nboccutotal = 0; + foreach ($array as $key1 => $value1) { + // Déterminer le chemin de tous les contenus (content) dans page ou module + if (($key1 ==='page' || $key1 ==='module') && is_array($value1) ) + { + foreach ($value1 as $key2 => $value2) + { + if (is_array($value2)) + { + foreach ($value2 as $key3 => $value3) { + if ($key3 === "content" && is_string($value3)) { + // compte le nombre d'occurrences dans la page + $nboccu=0; + // le contenu à explorer est dans $value3, le nom de la page est $key2 + //Nettoyage de $value3 : on enlève tout ce qui est inclus entre < et > + $value3=$this->nettoyer_html($value3); + //accentuation + $value3=html_entity_decode($value3); + // Recherche et affichage des occurrences + do { + $occu = stristr($value3,$motclef); + if ($occu !== '') { + if ($key2!=$dejavu) { + $result .= '


Mot clef trouvé dans la page : '.$key2.'

'; + } + $dejavu=$key2; + $nboccu++; + //Affichage d'un extrait de $value3 + $result .= '

'.$nboccu.' - "...'.substr($occu,0,200).'..."

'; + //pour recherche d'une autre occurence dans le même contenu + $value3=substr($occu,100); + } + } while($occu != ''); + $dejavu = ''; + $nboccutotal = $nboccutotal + $nboccu; + $nboccu = 0; + } elseif ($key1 == "module" && is_array($value3)) { + foreach ($value3 as $key4 => $value4) { + if ($key4 == "content" && is_string($value4) ) { + $nboccu = 0; + // le contenu à explorer est dans $value4, le nom du module/page est $key2/$key3 + //Nettoyage de $value4 : on enlève tout ce qui est inclus entre < et > + $value4 = $this->nettoyer_html($value4); + //accentuation + $value4 = html_entity_decode($value4); + // Recherche et affichage des occurrences + do { + $occu = stristr($value4,$motclef); + if ($occu != '') { + if ($key3 != $dejavu) { + $result .= '


Mot clef trouvé dans la page : '.$key2.'/'.$key3.'

'; + } + $dejavu = $key3; + $nboccu++; + $result .= '

'.$nboccu.' - "...'.substr($occu,0,200).'..."

'; + } + //pour recherche d'une autre occurrence dans le même contenu + $value4 = substr($occu,100); + } while($occu != ''); + $dejavu = ''; + $nboccutotal = $nboccutotal + $nboccu; + $nboccu = 0; + } + } + } + } + } + } + } + } + if ($nboccutotal==0) { + $notification = '


Mot clef non trouvé, avez-vous pensé aux accents ?

'; + $success = false; + } else { + $result .= '


Nombre total d\'occurrences : '.$nboccutotal.'

'; + $notification = 'Nombre total d\'occurrences : '.$nboccutotal; + $success = true; + } + } else { + $notification = 'Trop court ! minimum 3 caractères'; + $result = '


Trop court ! minimum 3 caractères

'; + $success = false; + } + + } else { + $notification = 'Fichier core.json introuvable'; + $success = false; + } + $_POST['result'] = $result; + $_POST['occurence'] = $nboccutotal; + // Valeurs en sortie, affichage du résultat + $this->addOutput([ + 'title' => 'Rechercher dans le site', + 'view' => 'result', + 'notification' => $notification, + 'state' => $success + ]); + } else { + // Valeurs en sortie, affichage du formulaire + $this->addOutput([ + 'title' => 'Rechercher dans le site', + 'view' => 'index' + ]); + } + } + + /* Déclaration de la fonction nettoyer(string $contenu) : string + * Supprime de $contenu les caractères placés entre < et >, donc les balises html comme


etc... + * Retourne $contenu nettoyée, le résultat est sensiblement différent de celui obtenu avec la fonction strip_tags() + */ + private function nettoyer_html($contenu){ + do { + $pos1=strpos($contenu,chr(60)); + if($pos1!==false) { + $pos2=strpos($contenu,chr(62)); + if($pos2!==false) $contenu=substr_replace($contenu," ",$pos1,($pos2 - $pos1 + 1)); + } + } while($pos1!==false); + return $contenu; + } + +} +?> \ No newline at end of file diff --git a/core/module/search/view/index/index.php b/core/module/search/view/index/index.php new file mode 100644 index 00000000..d197609e --- /dev/null +++ b/core/module/search/view/index/index.php @@ -0,0 +1,28 @@ + +

+
+ getUrl(2); ?> + getData(['page', $this->getUrl(2), 'moduleId']) === 'redirection' || 'code')$href = helper::baseUrl(); ?> + 'buttonGrey', + 'href' => $href, + 'ico' => 'left', + 'value' => 'Retour' + ]); ?> +
+
+ +
+
+
+
+

Zone de saisie :

+ 'Mot ou phrase clef', + 'value' => '', + 'help' => 'Saisir un mot ou une phrase clef pour votre recherche, n\'oubliez pas les accents.' + ]); ?> +
+
+ + diff --git a/core/module/search/view/result/result.php b/core/module/search/view/result/result.php new file mode 100644 index 00000000..e98abb36 --- /dev/null +++ b/core/module/search/view/result/result.php @@ -0,0 +1,21 @@ + +
+
+ getUrl(2); ?> + getData(['page', $this->getUrl(2), 'moduleId']) === 'redirection' || 'code')$href = helper::baseUrl(); ?> + 'buttonGrey', + 'href' => $href . 'search', + 'ico' => 'left', + 'value' => 'Retour' + ]); ?> +
+
+
+
+

Résulats

+ +
+
+ + \ No newline at end of file