[V4-Statiques] Recherche avec résumé

décembre 2008 modifié dans Modifications
Bonjour
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

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

Réponses

  • Bonjour Cyril,

    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.
  • janvier 2009 modifié
    oui en effet ,

    je te propose de tester ce code suivant (reprise de la derniere 'beta' proposé a hamtaro , avec pagination et tri par année )
    <?php
    # On démarre la session
    session_start();
    /**
     * Classe plxSearch Recherche avancée avec résumé et pagination
     * @Pages statiques Pluxml beta 4
     * @extends plxMotor
     * @author    Griboval Cyril
     * @BETA
     **/
    class plxSearch extends plxMotor {
    
    function plxSearch($filename) {
    parent::plxMotor($filename);
    # repertoire ou sont stocké les articles
    $plxGlob_arts = & new plxGlob(PLX_ROOT.$this->aConf['racine_articles']);
    # masque de nom de fichier correspondant a un article publié
    //$this->motif = '/^[0-9]{4}.[0-9]{3}.[0-9]{12}.[a-z0-9-]+.xml$/';
    if (!empty($_GET['year'])){$this->year=$_GET['year'];}
    else {$this->year ='(08) | ('. date("y") .') ';}
    $this->motif = '/^[0-9]{4}.[0-9]{3}.[0-9]{2}['.$this->year.']{2}[0-9]{8}.[a-z0-9-]+.xml$/';
    
    #extraction de touts les noms d'articles
    $this->aFiles = $this->plxGlob_arts->query($this->motif,'art',$ordre,0,999);
    #nettoyage et recupération de l'url de base
    $this->sUrl = $this->getsurl();
    $this->form = $this->makeForm();
    }
    function makeForm() {
    #mise en place provisoire formulaire
    
    #LE FORMULAIRE :
    $url = $this->getsUrl();
    if ($this->word !='')  $formMsg='  Faire une nouvelle recherche en changeant le(s) mot(s) clé(s).';
    		  else $formMsg = 'Faire une recherche .';
    $form ='         <form method="post" action="'. $url.'"  class="recherchePagination">
              <fieldset><legend >'.$formMsg.'</legend>
                <p>
    				<input name="search" size="15" maxlength=\"255\" 
    					value="'.$this->wordform.'"
    					type="text" class="search" /> 
    				<b> >> </b> 
    				<input type="submit" value="rechercher !" />
    			</p>
              </fieldset>
    		  
            </form> 
    		<p>Rechercher par année (par défaut 2008/2009): 
    			<a href="'. $url.'&search='.$this->wordform.'&year=06">2006</a> -
    			<a href="'. $url.'&search='.$this->wordform.'&year=07">2007</a> -
    			<a href="'. $url.'&search='.$this->wordform.'&year=08">2008</a> -
    			<a href="'. $url.'&search='.$this->wordform.'&year=09">2009</a>
    		</p> ';
    return $form;
    }
    
    	/**
    	 * Méthode qui retourne l'url de base de la page statique
    	 * 
    	 * @author	Griboval Cyrille
    	 **/
    		function getsUrl() {
    			// decoupage de l'url  
    				$geturl = explode("?", $_SERVER['REQUEST_URI']);
    				/*initialisation  de la variable reconstruisant l'url */
    				$redourl='';
    				
    			// recuperation des valeurs $_GET uniquement ( aprés le '?' )
    				for($i=1;$i < count($geturl);$i++) 
    					{
    						$redourl .=$geturl[$i];
    				    }
    			
    			// découpage des valeur $_GET (si '&' présent , se trouve dés la seconde clé du tableau )
    				$topurl = explode("&", $redourl);	
    			
    			// on ne garde que la premiere valeur
    				$finalurl = '?'.$topurl[0];
    
    			// nettoyage des $_POST au passage ...
    				if (!empty($_POST)) {
    					plxUtils::unSlash($_POST);
    				}
    			
    			#renvoi de l'url de base
    				return $finalurl ;
    		}
    
    
    
    	/**
    	 * Méthode qui elague et fait un résumé des résultats de recherche
    	 * 
    	 * @author	Griboval Cyrille
    	 **/
      function getresume($content,$word) {
     
    
    
    		#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 ($resume='... ') $resume=$content; 
    			if (preg_match('#(?:\W+\w+){0,30}\W+\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() {
    
    $totalResult=0;
    # variables de pagination
    $nbPerPage =15;
    $countResult = 1;
    $page=1;
    if ($_GET['page']) {
    $page = $_GET['page'];
    if (is_numeric($page)) {
    		$countResult = ($_GET['page']-1)*$nbPerPage+1;
    	}
    }
    	/* Recuperation  des mots recherché */  
            if(isset($_GET['search']))$wordform =$_GET['search'];
    				# on privilégie la requete $_POST
    		if(isset($_POST['search']))$wordform =$_POST['search'];
    		$this->wordform = $wordform;
    $countEnd = $countResult + $nbPerPage - 1;
    		
            $i = 0;	
    
    	/* Recuperation et Nettoyage des mots recherché */  
            if(isset($_GET['search']))$word =plxUtils::removeAccents($_GET['search'],PLX_CHARSET);
    				# on privilégie la requete $_POST
    		if(isset($_POST['search']))$word =plxUtils::removeAccents($_POST['search'] ,PLX_CHARSET);
    		$this->word = $word;	
            $word = addslashes($word);
            $word = strtolower($word); 	
    		
    		# Si on a des fichiers
            if(is_array($this->aFiles)) { 
            $nbcfiles =count($this->aFiles);
            $nbccount = 0;
            $i = 1;
    	
    	/* 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);
    			$content = plxUtils::removeAccents($content,PLX_CHARSET);
                $trouve = substr_count($content,$word);
    			
    	/* si le terme recherché existe dans cette article */
    			if($trouve!==0){ 
    		
    		# extraction des résultat pour la page affichée uniquement 
    		if($i >= $countResult && $i<= $countEnd ) 		
    			{
     # museliere pour les trés long articles on se limite aux 200 premiers mots
     if (preg_match('#(?:\W+\w+){0,199}\W+\w+#s' , $content , $limite)) {$content =$limite[0].' ';}
    
    				#création du résume , appel de la methode getresume() 
    					$content=$this->getresume($content,$word);
    					
    				#on alimente notre tableau 
    					$tableau[] = array($i,preg_replace('[^(000)|^(00)|^(0)]', '', $this->art['numero']),$this->art['title'],$this->art['url'],$content,$this->art['date'],$trouve);
    				}
    			# comptage des résultats positifs	
                $i++;
    		
    			}
    
    			endwhile;
            }			
    
    		/* on initialise notre variable de resultat de recherche en ouvrant une liste ordonnée */
            $search_results = '<ul class="recherche">';
    		
    		# nombre total des articles trouvées 
    		if ($i ==-1) $i=0;
    		$totalResult = $i;
    		$this->total = $totalResult;
    		
    		
    		#on rafraichit leformulaire
    		$this->form = $this->makeForm();
    		#Mise en place de la barre de pagination 
    		$pagination = '<p class="recherchePagination"> Votre Recherche : <strong>'.$this->wordform.'</strong> Année(s):  '.$this->year.' .<br/> Il y a '.$this->total.' résultats .</p>';
    		// si total superieur au nb de resultat par page 
    		if ($this->total > $nbPerPage) {
    		$nbPage= ceil($this->total/$nbPerPage);
    		
    		// verification que la page demnadé existe 
    		if (($page > $nbPage) || ($nbPage ==NULL) ) header('location: '.$this->getsUrl().'&search='.$this->word);
    		$pagination = '<p class="recherchePagination"> Votre Recherche : <strong>'.$this->wordform.'</strong> . Année(s):  '.$this->year.'.<br/> Il y a '.$this->total.' résultats  sur '.$nbPage.' Pages :</p><p class="recherchePagination"><b>Page n° </b> ';
    				
        for($numpage=1;$numpage <= $nbPage;$numpage++)
         {
    		if($numpage == $page) {
    		$pagination .= ' : <b>'.$numpage.'</b> ';
    		}
    		else {
               $pagination .= ' : <a href="'.$this->getsUrl().'&search='.$this->wordform.'&page='.$numpage.'">'.$numpage.'</a> ';
    		   }
         } 
    		 $pagination .= ' : .</p>
    		 ';
    
    		}
    		$search_result = $pagination.'<ul class="recherche">';		
    		
            
    		# compte les enregistrement gardés
    		$n=count($tableau);	
    		# tri inverse sur le tableau (article récents mis en avant )
    		if ($tableau){rsort($tableau);
    		$search_result = '';}			
    		# puis on boucle dessus 	
            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]['1'].'/'.$tableau[$i]['3'].'">'.$tableau[$i]['2'].' </a> </h3>
    				<p ><span class="rechercheNumero">('.$tableau[$i]['0'].')</span><span class="rechercheNb">  Terme trouvé '.$tableau[$i]['6'].' fois. </span>
    				<span class="rechercheShowDate"> Date : '.plxUtils::dateIsoToHum($tableau[$i]['5']).'</span>
    				</p>
    				<p class="rechercheResume">'.stripslashes($tableau[$i]['4']).'</p>
    				<p class="rechercheTargetBlank" >
    					<a href="?article'.$tableau[$i]['1'].'/'.$tableau[$i]['3'].'" 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_result==$pagination.'<ul class="recherche">')  {$search_results = $pagination.' <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 =$pagination.$this->form.$search_results.'</ul><p style="display:list-item;list-style-position:inside;" class="recherche"> ... fin de la recherche </p>'.$pagination ;
    		
    		 
    		}
    		
            return $search_results;
        }
    
    }
    
    ?>
    <div id="content">
    		<div class="post">
    	
    	
    <?php
    		$search = new plxSearch((PLX_CONF));
    
    if(!empty($_POST['search']) || !empty($_GET['search'])) {
    		$search->prechauffage();
    		$search->demarrage();
    		$affichage =  $search->getsearch();
    
    echo $affichage;	
    
    	}
    	
    #LE FORMULAIRE :
    $url = !$search->getsUrl() ? $search->getsUrl() : NULL;
    $formMsg = !$search->word ? $search->word : NULL;
    
    
    		/* on (re)affiche le formulaire */
    		echo $search->form;
    
             ?>
    
             <!--<form method="post" action="<?php if($search) echo $search->getsUrl(); ?>">
              <fieldset><legend ><?php
    		  if ($search->word)  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
    		    echo $search->word; 
    		  ?>" type="text" class="search" /> <b> >> </b> <input type="submit" value="rechercher !" /></p>
              </fieldset>
    		  
            </form> 
    		<p>Rechercher par année (par défaut 2008/2009): 
    		<a href="<?php echo $search->getsUrl().'&search='.$search->word; ?>&year=06">2006</a> -
    		<a href="<?php echo $search->getsUrl().'&search='.$search->word; ?>&year=07">2007</a> -
    		<a href="<?php echo $search->getsUrl().'&search='.$search->word; ?>&year=08">2008</a> -
    		<a href="<?php echo $search->getsUrl().'&search='.$search->word; ?>&year=09">2009</a> -
    		</p>-->
    		<?php if ($search->total > 5) echo '<a href="#top" title="haut de page">haut de page</a>'; ?>
    		</div>
    </div>
    <?php
    #ADMINISTRATION
    
    	include_once(PLX_CORE.'lib/class.plx.admin.php');
    	# Creation de l'objet plxAdmin et test sur connection
    $plxAdmin = & new plxAdmin(PLX_CONF);
    $pwd = $plxAdmin->getPasswd(PLX_ROOT.$plxAdmin->aConf['passwords']);
    
    # Test sur l'identification
    if (@!$auth_page AND (empty($_SESSION['admin']) OR empty($pwd[ $_SESSION['author'] ]) OR $pwd[ $_SESSION['author'] ] !== $_SESSION['pass'])) {}
    else {
    echo '<p>Vous étes connecté en tant qu\'administrateur  :P.</p>';
    }
    ?>
    
    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

    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

  • Quelle réactivité... Mais cette version semble marcher moins bien que la précédente... Voir sur ce projet de maquette plus que provisoire : http://ml.roure.org/pluxml/?static6/recherche . Bonne journée à toi.
  • bonsoir,
    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

    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

  • HamtaroHamtaro Member
    janvier 2009 modifié
    En ce qui me concerne, cela ne marche pas très bien. J'ai souvent des erreurs 500... :(

    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...
  • oups , voilà qui est fait :)


    Cordialement,
    gcyrillus

    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

  • 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.
  • oui , je conserve précieusement ce zip trés utile ;) .

    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

    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

  • Wahouuuuuuu
    Que de good news ^^

    J'ai hâte de voir le boulot, bon courage !

    TCho, Hamtaro.
  • bricabrica Member
    janvier 2009 modifié
    Bonsoir, je vois que ce script moteur de recherche fonctionne : http://re7net.com/pluxml/?static1/statique serait-il possible de rendre le code public ou en faire un zip ? (restera à le rendre ensuite insensible aux accents) Merci !
  • gcyrillusgcyrillus Member
    janvier 2009 modifié
    bonsoir,

    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>
  • Je suis désolé mais le code indiqué via ce lien http://forum.pluxml.org/viewtopic.php?id=1062 ne retourne aucun résultat après une recherche.

    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 :
    <?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>
    
  • Salut,

    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.
  • Mille mercis : c'est la bonne, ça marche nickel.
Connectez-vous ou Inscrivez-vous pour répondre.