[V4-Statiques] Recherche avec résumé
gcyrillus-nomade
Member
Bonjour
voici une derniere version :
L'installation :
creer une nouvelle page statique , editer la et copier/coller le code suivant dedans :
Ne reste plus qu'a repasser coté public et tester votre page de recherche .
remarques
Pour créer cette page statique , il est préférable de copier coller le code dans l'administration , cela vous assure un encodage compatible avec votre version et configuration de pluxml .
(pensez y si vous éditer en local , migrer ou changer de config d'encodage).
Les résultat de recherche sont stockés dans un tableau (array) , Il est donc possible , si vous en avez l'envie de vous bricoler une pagination ... attention le formulaire fonctionne en method POST uniquement , il n'est pas possible de passer votre requete par l'url . l'url sert déjà a appelé votre page statique de recherche .
Template et mise en forme :
Comme Indiqué par Sapin Tremblant , vous pouvez insérer le formulaire dans votre template .
Pour cela il vous faut au préalable créer cette page statique et récupérer son lien .
Le formulaire de base est :
Pour la mise en forme des résultat de recherche :
Ils sont stockée dans une liste ordonnée , que vous pouvez ciblée comme ceci :
Le résumé est effectué en deux étapes .
1)
ajout des 50 caractéres maximum se trouvant a gauche et a droite de chaque occurrence dans chaque article
Pour modifier cela :
dans la variable $masque
2)
regulation a 30 espaces (31 mots ou ponctuation)
Ce qui fait a peu prés 3 lignes dans le template par défaut de pluxml.
Pour modifier cela
coté php : Template et accés au differentes infos dispos :
Ce qui correspond au template d'affichage des résultat :
$tableau[$i] = N° de l'article .
$tableau[$i] = titre de l'article .
$tableau[$i] = non au format 'url' de l'article
stripslashes($tableau[$i]) = contenu du résumé
plxUtils::dateIsoToHum($tableau[$i]) = date de l'article au format de date de pluxml
$tableau[$i] = nombre de fois que le terme recherché est trouvé dans l'article
Seul ces 3 variables ...
$tableau[$i] = N° de l'article .
$tableau[$i] = titre de l'article .
$tableau[$i] = non au format 'url' de l'article
.... sont obligatoire , car elle permettent de reconstruire le lien et son libéllé vers l'article qui correspond a une recherche .
Décommenter cette ligne dans la methode : getresume()
La valeur 100 peut-etre encore descendu .
Cela correspond a ne créer le résumé approximativement a partir des 10 premieres lignes de l'articles.
Si cela ne suffit pas , c'est que vous avez atteint le nombre critiques d'articles a traité .
GC
P.S.
Ouvrez un nouveau topic si vous rencontrez des problemes specifiques
- aprés modification de ce formulaire de recherche
- avec un hebergeur (fournissez , log , message d'erreur , adresse du site , ...)
- proposez une modification
- etc ...
Pour les vrais bugs , c'est ici bien sur
En actions ici par exemple sur un pluxml de test :
http://re7net.com/pluxml/?static1/statique
voici une derniere version :
L'installation :
creer une nouvelle page statique , editer la et copier/coller le code suivant dedans :
<?php
/**
* Classe plxSearch Recherche simple
* @Pages statiques Pluxml beta 4
* @extends plxMotor
* @author Griboval Cyril
* @Stable 1.01
**/
class plxSearch extends plxMotor {
function plxSearch($filename) {
parent::plxMotor($filename);
$plxGlob_arts = & new plxGlob(PLX_ROOT.$this->aConf['racine_articles']);
$this->motif = '/^[0-9]{4}.[0-9]{3}.[0-9]{12}.[a-z0-9-]+.xml$/';
$this->aFiles = $this->plxGlob_arts->query($this->motif,'art',$ordre,0,999);
}
/**
* Méthode qui elague et fait un résumé des résultats de recherche
*
* @author Griboval Cyrille
**/
function getresume($content,$word) {
// if (preg_match('#(?:\w+\W+){100}\w+#s' , $content , $limite)) {$content =$limite[0];}
#création du contexte du mot recherché (extraits page)
#recherche de 0 à 50 caractéres avant et aprés le mot recherché
$masque ='[(\w+|&-_.;:!\'\"\#éèçàù\s )?]{0,50}';
preg_match_all('#'.$masque.'('.$word.'? )'.$masque.'#', $content, $out);
# on separe chaque extraits
foreach( $out[0] as $value ) { $resume .= ' ... '.$value.' ';}
$resume=stripslashes($resume).' ... ';
# ce mot peut apparaitre plusieurs fois !
# (0-50 caractéres + mot recherché +0-50 caractéres ) X nb occurences = ....
# on limite alors le résumé a une chaine qui ne contient qu'une trentaines d'espaces
if (preg_match('#(?:\w+\W+){30}\w+#s' , $resume , $regule)) {$resume =' ... '.$regule[0];}
# Mise en evidence visuelle : engraissage et grossisement de l'occurence
$content=preg_replace('#'.$word.'#', '<b style="font-size:110%;padding:0 1px;">'.$word.'</b>', $resume);
# renvoi du traitement
return $content;
}
/**
* Méthode qui formatte les résultats de recherche
*
* @author Griboval Cyrille
**/
function getsearch() {
if(is_array($this->aFiles)) { # Si on a des fichiers
$nbcfiles =count($this->aFiles);
$nbccount = 0;
$i = 0;
/* Nettoyage des mots recherché */
$word = $_POST['search'];
$word = addslashes($word);
$word = strtolower($word);
/* on parcours tout nos fichiers , attention ça peut-etre long */
while ($nbccount+1 <= $nbcfiles):
$file2open = PLX_ROOT.$this->aConf['racine_articles'].$this->aFiles[$nbccount];
$this->parseArticle($file2open);
$this->art =$this->parseArticle($file2open);
$nbccount++;
/* on extrait les titre chapo et content pour y rechercher notre chaine */
$content = $this->art['title'];
$content .=' '.strip_tags( $this->art['chapo']).' ';
$content .= strip_tags($this->art['content']);
$content = addslashes($content);
$content = strtolower($content);
$trouve = substr_count($content,$word);
/* si le terme recherché existe dans cette article */
if($trouve!==0){
#création du résume , appel de la methode getresume()
$content=$this->getresume($content,$word);
#on alimente notre tableau
$tableau[] = array(preg_replace('[^(000)|^(00)|^(0)]', '', $this->art['numero']),$this->art['title'],$this->art['url'],$content,$this->art['date'],$trouve);
$i++;
}
endwhile;
}
/* on initialise notre variable de resultat de recherche en ouvrant une liste ordonnée */
$search_results = '<ol class="recherche">';
#compte les enregistrement puis boucle dessus
$n=count($tableau);
for($i=$n-1;$i >= 0;$i--) {
#creations de liens vers les articles contenant la chaine recherchée et l'extrait
$search_results .= '
<li>
<h3 class="rechercheTitle"><a href="?article'.$tableau[$i]['0'].'/'.$tableau[$i]['2'].'">'.$tableau[$i]['1'].' </a> </h3>
<p class="recherche"><span class="rechercheNb"> Terme trouvé '.$tableau[$i]['5'].' fois. </span>
<span class="rechercheShowDate"> Date : '.plxUtils::dateIsoToHum($tableau[$i]['4']).'</span>
</p>
<p class="rechercheResume">'.stripslashes($tableau[$i]['3']).'</p>
<p class="rechercheTargetBlank" >
<a href="?article'.$tableau[$i]['0'].'/'.$tableau[$i]['2'].' onclick="window.open(this.href,\' _blank\');return false;" title="Oubrir dans une nouvelle page" style="font-weight:normal;font-style:italic";">( Ouvrir dans une nouvelle page )</a> .</p>
</li>';
}
/* si notre variable de resultat de recherche n'a pas changé on la remplace par un message */
if($search_results=='<ol class="recherche">') {$search_results = '<p style="display:list-item;list-style-position:inside;" class="recherche"> ... fin de la recherche</p><p class="recherche"><b>La recherche a étè infructueuse </b>, il n\'y a rien qui corresponde à vos criteres .
<br /> <b>Verifiez l\'orthographe ou changez les mots clés. </b></p>'; }
/* si notre variable de recherche a étè alimenté , on referme notre liste ordonnée */
else { $search_results .= '</ol><p style="display:list-item;list-style-position:inside;" class="recherche"> ... fin de la recherche</p>';
}
return $search_results;
}
}
?>
<div id="content">
<div class="post">
<?php
if(!empty($_POST['search'])) {
echo '<p style="color:red"> Votre Recherche : '.$_POST['search'].'</p>';
$search = new plxSearch((PLX_CONF));
$search->prechauffage();
$search->demarrage();
echo $search->getsearch();
}
/* on affiche le formulaire */
?>
<form method="post" action="">
<fieldset><legend ><?php
if (isset($_POST['search'])) echo' Faire une nouvelle recherche en changeant le(s) mot(s) clé(s).';
else echo 'Faire une recherche .';
?></legend>
<p><input name="search" size="15" maxlength=\"255\" value="<?php
if (isset($_POST['search'])) echo $_POST['search'];
?>" type="text" class="search" /> <b> >> </b> <input type="submit" value="rechercher !" /></p>
</fieldset>
</form>
</div>
</div>
enregistrer , verifier que votre page est "active" .Ne reste plus qu'a repasser coté public et tester votre page de recherche .
remarques
Pour créer cette page statique , il est préférable de copier coller le code dans l'administration , cela vous assure un encodage compatible avec votre version et configuration de pluxml .
(pensez y si vous éditer en local , migrer ou changer de config d'encodage).
Les résultat de recherche sont stockés dans un tableau (array) , Il est donc possible , si vous en avez l'envie de vous bricoler une pagination ... attention le formulaire fonctionne en method POST uniquement , il n'est pas possible de passer votre requete par l'url . l'url sert déjà a appelé votre page statique de recherche .
Template et mise en forme :
Comme Indiqué par Sapin Tremblant , vous pouvez insérer le formulaire dans votre template .
Pour cela il vous faut au préalable créer cette page statique et récupérer son lien .
Le formulaire de base est :
<div id="recherche">
<h2>Recherche</h2>
<form method="post" action=" ICI LE LIEN VERS VOTRE PAGE STATIQUE DE RECHERCHE" class="formSearch">
<p>
<input type="text" name="search" />
<input type="submit" value="OK" />
</p>
</form>
Vous pouvez ciblé ce formulaire coté CSS avec #recherche pour la boite , ou .formSearch juste pour le formulaire .Pour la mise en forme des résultat de recherche :
Ils sont stockée dans une liste ordonnée , que vous pouvez ciblée comme ceci :
ol.recherche {/* vos regles css */}
Le titre lien du nom de l'article trouvé:
h3.rechercheTitle a {/* vos regles css */}
Le paragraphe qui contient le nombre d'occurrences et la date de l'article:
ol p.recherche {/* vos regles css */}
Le nombre d'occurences :
span.rechercheNb {/* vos règles css */}
la date de l'article :
span.rechercheShowDate {/* vos règles css */}
Le resumé de l'article
p.rechercheResume {/* vos règles css */}
et enfin le lien pour ouvrir dans une nouvelle fenêtre :
p.rechercheTargetBlank {/* vos règles css */}
Modifier la taille du résumé :Le résumé est effectué en deux étapes .
1)
ajout des 50 caractéres maximum se trouvant a gauche et a droite de chaque occurrence dans chaque article
Pour modifier cela :
dans la variable $masque
#recherche de 0 à 50 caractères avant et après le mot recherché
$masque ='[(\w+|&-_.;:!\'\"\#éèçàù\s )?]{0,50}';
Modifier la valeur qui est par défaut de 50 (entre les accolades : {0,50})2)
regulation a 30 espaces (31 mots ou ponctuation)
Ce qui fait a peu prés 3 lignes dans le template par défaut de pluxml.
Pour modifier cela
# on limite alors le résumé a une chaine qui ne contient qu'une trentaines d'espaces
if (preg_match('#(?:\w+\W+){30}\w+#s' , $resume , $regule)) {$resume =' ... '.$regule[0];}
Modifier la valeur qui est par defaut de 30 (entre les accolades).coté php : Template et accés au differentes infos dispos :
Ce qui correspond au template d'affichage des résultat :
$search_results .= '
<li>
<h3 class="rechercheTitle"><a href="?article'.$tableau[$i]['0'].'/'.$tableau[$i]['2'].'">'.$tableau[$i]['1'].' </a> </h3>
<p class="recherche"><span class="rechercheNb"> Terme trouvé '.$tableau[$i]['5'].' fois. </span>
<span class="rechercheShowDate"> Date : '.plxUtils::dateIsoToHum($tableau[$i]['4']).'</span>
</p>
<p class="rechercheResume">'.stripslashes($tableau[$i]['3']).'</p>
<p class="rechercheTargetBlank" >
<a href="?article'.$tableau[$i]['0'].'/'.$tableau[$i]['2'].' onclick="window.open(this.href,\' _blank\');return false;" title="Oubrir dans une nouvelle page" style="font-weight:normal;font-style:italic";">( Ouvrir dans une nouvelle page )</a> .</p>
</li>';
Les differents contenus ou variables affichable sont donc :$tableau[$i] = N° de l'article .
$tableau[$i] = titre de l'article .
$tableau[$i] = non au format 'url' de l'article
stripslashes($tableau[$i]) = contenu du résumé
plxUtils::dateIsoToHum($tableau[$i]) = date de l'article au format de date de pluxml
$tableau[$i] = nombre de fois que le terme recherché est trouvé dans l'article
Seul ces 3 variables ...
$tableau[$i] = N° de l'article .
$tableau[$i] = titre de l'article .
$tableau[$i] = non au format 'url' de l'article
.... sont obligatoire , car elle permettent de reconstruire le lien et son libéllé vers l'article qui correspond a une recherche .
<a href="?article'.$tableau[$i]['0'].'/'.$tableau[$i]['2'].'">'.$tableau[$i]['1'].' </a>
Le nombre d'articles grossit et le moteur n'a plus assez de mémoire :Décommenter cette ligne dans la methode : getresume()
// if (preg_match('#(?:\w+\W+){100}\w+#s' , $content , $limite)) {$content =$limite[0];}
Pour decommenter , ou si vous préferez 'activé' cette ligne retire les : // en debut de ligne .La valeur 100 peut-etre encore descendu .
Cela correspond a ne créer le résumé approximativement a partir des 10 premieres lignes de l'articles.
Si cela ne suffit pas , c'est que vous avez atteint le nombre critiques d'articles a traité .
GC
P.S.
Ouvrez un nouveau topic si vous rencontrez des problemes specifiques
- aprés modification de ce formulaire de recherche
- avec un hebergeur (fournissez , log , message d'erreur , adresse du site , ...)
- proposez une modification
- etc ...
Pour les vrais bugs , c'est ici bien sur
En actions ici par exemple sur un pluxml de test :
http://re7net.com/pluxml/?static1/statique
Cordialement,
gcyrillus , simple membre du forum et utilisateur de pluxml
Mon site PluXml: https://re7net.com | Plugins: https://ressources.pluxopolis.net/banque-plugins/index.php?all_versions | demos sur free http://gcyrillus.free.fr/new | Thèmes: tester et télécharger @ https://pluxthemes.com
Indiquez [RESOLU] dans le titre de votre question une fois le soucis réglè, Merci
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Tout d'abord, bonne année à toi et à tous les pluxmliens et les mypluxmliens.
Je viens d'installer ton moteur de recherche dans une page statique de pluxml beta 4. Ça marche du tonnerre.
J'ai deux petites remarques :
- une recherche sur "voila" (sans accent) ne trouve pas "voilà" (avec un accent). Avec la réforme de la langue française de Toubon, 50% écrivent "événement" et 50% écrivent "évènement" par exemple. Donc autant pouvoir trouver "evenement", "évènement", "événement"...
- le contexte où se trouve le mot ne s'affiche pas dans les résultats de la recherche. Je n'obtiens que des points de suspension.
Et encore, bravo pour ton travail.
je te propose de tester ce code suivant (reprise de la derniere 'beta' proposé a hamtaro , avec pagination et tri par année ) J'ai réinserer les fonctions de plxUtils::removeAccent() de pluxml , je pense que cela devrait suffire , les accents autant dans les resumé sont donc remplacé , exepté dans le formulaire de recherche et les liens de pagination .
un é devient e , ç devient c , etc ...
Dis moi si cela te convient .
edit , cette version minimise les ressources et rempli les résumé même si le mot rechercher n'est pas present dans l'extrait affiché</>
Cordialement,
gcyrillus , simple membre du forum et utilisateur de pluxml
Mon site PluXml: https://re7net.com | Plugins: https://ressources.pluxopolis.net/banque-plugins/index.php?all_versions | demos sur free http://gcyrillus.free.fr/new | Thèmes: tester et télécharger @ https://pluxthemes.com
Indiquez [RESOLU] dans le titre de votre question une fois le soucis réglè, Merci
en effet et c'est bien ce qu'il me semblait , sans avoir les compétences d'expliquer le pourquoi du comment , mais ce "defaut" est probablement liée a la config serveur , l'encodage choisit dans la config de pluxml et l'encodage dans lequel a étè generé les fichiers (+ os : windows ou linux) (si MAJ des noms de fichier ou sauvegarde), etc ...
Sur ma page test , aucun soucis avec la version initiale , caractéres accentués retournés sans bug , recherche effective sur le caractéres accentué et malgré le fait d'etre hebergé par ovh , ça roule :
http://re7net.com/pluxml/?static1/statique avec une recherche sur à par exemple . (autre bugs de pluxml mis a part , mais provoqués ) ... hmmmm , pas tester a partir d'un nav autre que FF sous Win ceci-dit .
Les caractéres latin accentué c'est une vrai soupe ... j'avoue ne pas en saisir toutes les subtilité , peut-etre qu'un encode() machin chose remettrai ça en place quelque soit le serveur et son os , l'encodage utilisé a la création des fichiers , de l'applen ligne , etc ....
Sur ce que la , j'ai besoin que quelqu'un m'allume une lanterne , pas moyen de foutre la main sur un briquet , lol .
GC
Cordialement,
gcyrillus , simple membre du forum et utilisateur de pluxml
Mon site PluXml: https://re7net.com | Plugins: https://ressources.pluxopolis.net/banque-plugins/index.php?all_versions | demos sur free http://gcyrillus.free.fr/new | Thèmes: tester et télécharger @ https://pluxthemes.com
Indiquez [RESOLU] dans le titre de votre question une fois le soucis réglè, Merci
P.S. : pense à effacer mes articles qd tu le peux parce que je crois savoir que Google n'aime pas trop le double contenu à des adresses différentes et j'ai pas envie qu'ils me sortent de leur index de recherche...
Cordialement,
gcyrillus , simple membre du forum et utilisateur de pluxml
Mon site PluXml: https://re7net.com | Plugins: https://ressources.pluxopolis.net/banque-plugins/index.php?all_versions | demos sur free http://gcyrillus.free.fr/new | Thèmes: tester et télécharger @ https://pluxthemes.com
Indiquez [RESOLU] dans le titre de votre question une fois le soucis réglè, Merci
Garde tout de même au chaud le contenu pour tes tests, car j'espère que tu ne vas pas t'arrêter là et proposer encore de nouvelles versions ! ^^
TCho, Hamtaro.
Non , je ne m'arretes pas la , c'est que je me suis égarée sur d'autre chemin , en fait reste
a) les 'conditions de recherche' a glisser dans le script ,
b)voir comment glisser proposer un 'mode d'emploi ' sans alourdir la page , popup en css , rollover , une page d'aide , generé en AJAX , ... la page d'aide me semble le plus pertinent ...
C) puis , reste encore un peu ces pages d'erreur que tu as , peut-etre administré les variables de recherche pour palier aux hebergement 'court' en mémoire dispo pour les scripts.
d) limiter la recherche a des mots d'au moins quatre lettre (exit les artciles ou faux mots , lol )
GC
GC
Cordialement,
gcyrillus , simple membre du forum et utilisateur de pluxml
Mon site PluXml: https://re7net.com | Plugins: https://ressources.pluxopolis.net/banque-plugins/index.php?all_versions | demos sur free http://gcyrillus.free.fr/new | Thèmes: tester et télécharger @ https://pluxthemes.com
Indiquez [RESOLU] dans le titre de votre question une fois le soucis réglè, Merci
Que de good news ^^
J'ai hâte de voir le boulot, bon courage !
TCho, Hamtaro.
ces codes sont deja publique :
recherche simple : http://forum.pluxml.org/viewtopic.php?id=1044
recherche paginer + résumé : http://forum.pluxml.org/viewtopic.php?id=1062
recherche avec tri sur date pour soulager memoire serveur : http://forum.pluxml.org/viewtopic.php?pid=8798#p8798
Le test sur les accents est ci-dessus , il ne semble pas fonctionné chez toi , peut-etre est le nom de la fonction :plxUtils::removeAccents(); qui s'ecrit sans majuscule .
Ceci dit , je n'utilise pas cette version (gestion des accents) . Quand les articles genere par pluxml sont sur le serveur ou hebergement d'origine , le probléme ne semble pas apparaitre .
En rapatriant , la copie de mon site en local , sous wamp ou easyphp (win ) , j'ai un probléme d'encodage avec les accents , La fonction removeAccent() , n'arrange rien , elle reencode simplement les accents .. qui ne s'affichent déja pas normalement .
As tu generer et sauvegarder ta ta page statique a partir de l'administration de pluxml ?
As tu migrer d'un pluxml encoder en iso vers une v4 , par defaut en utf-8 ?
Je n'arrive pas a reproduire ton probleme d'accent , sauf
- en modifiant l'encodage de pluxml -
- en récuperant des articles generer a partir d'un autre
- en modifiant ma page statique sans passer par l'admin de pluxml.
Désolé de ne pas te donné une solution 'clés en mains '.
++
<ouf> je suis pris d'un gros doute , la version prochaine du moteur permettra d'affiner la recherche .. j'utilise les caractéres suivants :
- & pour recherher un article contenant deux mots 'un' et(&) 'deux'.
- | pour rechercher un article contenant tel ou tel mot 'un' ou(|) deux'.
- ! pour rechercher un article ne contenant pas tel mot 'un' mais pas (!] 'deux' .
....
je vais peut-etre alors m'orientez vers : + , - , * ( et plus facile a tapé )
</ouf>
Le code indiqué via ce lien http://forum.pluxml.org/viewtopic.php?id=1044 affiche les résultats, mais pas le résumé. Un peu comme celui-ci :
J'ai essayé celui là hier-soir: http://forum.pluxml.org/viewtopic.php?pid=8703#p8703
Il fonctionne bien chez moi, il affiche bien des résumés pour le résultat mais par contre est sensible aux accents.