Migration d’un squelette de SPIP2 vers SPIP3

Attention : Pour la mise à jour de sites complexes déjà en production, nous vous conseillons vivement de tester et éventuellement mettre au point votre site localement avec SPIP3 avant de faire la mise du site en production.

Discussion

6 discussions

  • Suite à migration d’un nouveau site, j’ai révisité ou ajouté les dernières parties :
    -  Boucles avec jointures
    -  Tables de liens
    -  Jointures sans critère identifiant
    -  urls personnalisées

    Répondre à ce message

  • 6

    Bonjour !

    Je travaille actuellement sur la migration de mon site en Spip 2.1 vers Spip 3. Il me reste malheureusement un problème que je n’arrive pas à résoudre. J’utilisais jusque là une partie d’un vieux plugin de recherche multicritères que je m’étais longtemps amusé à modifier et à adapter.

    Le fichier de résultat est entièrement en php mais depuis le passage à Spip 3, il ne me retourne plus aucun résultat. Je pense que suite aux modifications de la base sur la version 3, une requête SQL n’est plus bonne mais je n’ai pas réussi à savoir quelles étaient les changements.

    Si quelqu’un pouvait m’en dire plus ou jeter un œil à mon code, ce serait cool !

    <div class="result_rm">
    <?php
    ######################################################################
    # RECHERCHE MULTI-CRITERES - MODELE AFFICHAGE DES RESULTATS          #
    #                                                                    #
    # Auteurs : Dominique (Dom) Lepaisant                                #
    # www.tispip.etab.ac-caen.fr                         #
    # Stéphanie De Nadaï - www.webdesigneuse.net                         #
    #  - Fev 2008                                                        #
    #                                                                    #
    # Adaptation de la contrib de Paul Sanchez - www.Netdeveloppeur.com  #
    #                                                                    #
    # Ce programme est un logiciel libre distribue sous licence GNU/GPL. #
    # Pour plus de details voir le fichier COPYING.txt                   #
    ######################################################################
    
    
    $url = parse_url($_SERVER['QUERY_STRING']);
    
    $param = $url['path'];
    $pos = 0;
    $indice = 255;
    
    if (isset($_POST['idmot'])) {	
    		
    	// Récupération du nombre de jours
    	// pour periodicité de la rechercher
    	$nbjour = 0;
    	if (isset($_POST['nbjour'])){
    		$nbjour = $_POST['nbjour'];
    	}
    	
    	// Récupération du nombre de jours
    	// pour periodicité de la rechercher
    	$idonlyrub = 0;
    	if (isset($_POST['onlyrub'])) {
    		if (isset($_POST['rubnum'])) {	
    			$idonlyrub = $_POST['rubnum'];
    		}
    	}
    	
    	// 1 = Tous les mots doivent être associés aux articles trouvés
    	$allword = 0;
    	if (isset($_POST['allword'])) {
    		$allword = 1;
    	}
    
    	$nbmot = count($_POST['idmot']);
    				
    	$sql = "SELECT id_mot, titre FROM spip_mots WHERE id_mot IN (". implode(",", $_POST['idmot']) .") GROUP BY id_mot,titre";
    	
    	$result = mysql_query($sql);
    	
    	$tabmot = "";
    	$nbcol = 0;
    	$nbcolmax = 4;
    	
    	if ($result) {
    		
    		$compt = 0; 
    		while ($row = mysql_fetch_assoc($result)) {
    			extract($row);
    			$titre = supprimer_numero($titre); 
    			if ($nbcol == $nbcolmax) {
    				$nbcol = 0;
    			}
    			
    			$tabmot .= "<a class=\"spanblock txtgris\" href=\"./spip.php?page=mot&mots[]=$id_mot\"><span class=\"cle\">$titre</span></a>";
    			$nbcol += 1;
    		}
    		mysql_free_result($result);
    	}
    			
    	$sql = "SELECT COUNT(*) AS num, spip_articles.id_article, spip_rubriques.id_rubrique, spip_rubriques.titre AS titrerub ";
    	$sql .= "FROM spip_articles INNER JOIN spip_rubriques ON spip_rubriques.id_rubrique = spip_articles.id_rubrique ";
    	$sql .= "INNER JOIN spip_mots_articles ON spip_mots_articles.id_article = spip_articles.id_article ";
    	$sql .= " WHERE spip_mots_articles.id_mot IN (". implode(",", $_POST['idmot']) .") ";
    	
    	$datedeb = date("Y-m-d", mktime(0, 0, 0, date("m"), (date("d") - $nbjour), date("Y")));
    	
    	if ($nbjour != 0) {
    		$sql .= "AND spip_articles.date >= '$datedeb' ";
    	}
    	
    	if ($idonlyrub != 0) {
    			$sql .= "AND spip_rubriques.id_rubrique = $idonlyrub ";
    	}
    			
    	$sql .= "AND spip_articles.statut LIKE 'publie' GROUP BY spip_articles.id_article";
    	if ($order == 1) {
    		$sql .= " ORDER BY spip_rubriques.id_rubrique, NUM DESC, spip_mots_articles.id_mot, spip_articles.date DESC";
    	}
    	else {	
    		$sql .= " ORDER BY NUM DESC, spip_mots_articles.id_mot, spip_rubriques.id_rubrique, spip_articles.date DESC";
    	}
    	
    	$result = mysql_query($sql);
    	
    	//$nbart = mysql_num_rows($result);
    	$nbart = 0;
    	
    	$resultataffiche = "";
    	if ($result) {
    		$titrerub = supprimer_numero($titrerub);
    		$idrub = 0;
    		$listidmot2 = "";
    		$listidmotprec = "";
    		
    		while ($row = mysql_fetch_assoc($result)) {
    			extract($row);
    			if (($num != $nbmot) && ($allword == 1)) {
    				break;
    			}
    			
    			if ($idrub != $id_rubrique) {
    				
    				if (($pospoint = strrpos($titrerub, ". ")) === FALSE) {
    					$titrerub2=$titrerub;
    				}
    				else {
    					if (is_numeric(substr($titrerub, 0, $pospoint)) == false)
    						$titrerub2 = $titrerub;
    					else 
    						$titrerub2 = substr($titrerub, $pospoint + 2);
    				}
    			
    				if ($order == 1) { 
    					$resultataffiche.= "<p><a href=\"./spip.php?rubrique$id_rubrique\">$titrerub2 :</a></p>";
    				}
    			}
    			
    			$sql2 = "SELECT spip_articles.id_article AS artid,spip_articles.id_secteur AS id_secteur, spip_articles.titre AS titreart, spip_articles.date, spip_mots.id_mot ";
    			$sql2 .= ", spip_mots.titre AS titremot FROM spip_articles INNER JOIN spip_mots_articles ON spip_mots_articles.id_article = spip_articles.id_article ";
    			$sql2 .= "INNER JOIN spip_mots ON spip_mots.id_mot = spip_mots_articles.id_mot ";
    			$sql2 .= "WHERE spip_articles.id_article = $id_article AND spip_mots_articles.id_mot IN (". implode(",", $_POST['idmot']) .") AND statut LIKE 'publie' ";
    			$sql2 .= "ORDER BY spip_mots.id_mot";
    			
    			$result2 = mysql_query($sql2);
    			
    			if ($result2) {
    				$listmot = "<h4 class=\"titremots_mc\">";
    				$titrearticle = "";
    				$dataffich = "";
    				$idart = 0;
    				while ($row2 = mysql_fetch_assoc($result2)) {
    					extract($row2);
    					$listidmot2 .= "$id_mot,";
    					if ($idart == 0) {
    						$titrearticle = supprimer_numero($titreart);
    						if (!(($pospoint = strpos($titrearticle, '.')) === FALSE))  {
    							if (is_numeric(substr($titrearticle, 0, $pospoint)) == true)
    								$titrearticle = substr($titrearticle, $pospoint + 2);
    														
    						}
    						if (!(($pospoint = strpos($titremot, '.')) === FALSE)) {
    							if (is_numeric(substr($titremot, 0, $pospoint)) == true)
    								$titremot = substr($titremot, $pospoint + 2);
    							
    						}
    						$dataffich = date("d/m/Y", strtotime($date));
    					
    						if ($order == 1) {
    							$nbart += 1;
    							$resultataffiche .= "<li>
    							<a class=\"titrearticle_mc\"  href=\"./spip.php?article$artid\">$titrearticle</a> 
    							<small>$dataffich </small>";
    							$resultataffiche .= "$titremot";	
    						}
    						
    						$listmot .= "<a class=\"spanblock\" href=\"./spip.php?page=mot&mots[]=$id_mot\"><span class=\"cle\">$titremot</span></a>"; 
    						$idart = 1;
    					}
    					else {
    						$listmot .= "<a class=\"spanblock\" href=\"./spip.php?page=mot&mots[]=$id_mot\"><span class=\"cle\">$titremot</span></a>"; 
    						if ($order == 1) {
    							$resultataffiche .= "<a class=\"spanblock\" href=\"./spip.php?page=mot&mots[]=$id_mot\"><span class=\"cle\">$titremot</span></a>";		
    						}
    					}
    				}		
    				if ($order == 1) {
    					$resultataffiche .= "</li>";
    				}
    				
    				mysql_free_result($result2);
    				
    				if ($order == 0) {
    					
    					if ($listidmot2 != $listmodidprec) { 
    						$resultataffiche .= " $listmot </h4>";
    					}
    					$nbart += 1;
    					
    							if ($id_secteur == 1) {$variable = 63; $secteur = "Ma classe";}
    							if ($id_secteur == 3) {$variable = 66; $secteur = "Applications";}
    							if ($id_secteur == 4) {$variable = 65; $secteur = "Tutoriels";}
    							if ($id_secteur == 5) {$variable = 64; $secteur = "Liens";}
    							$resultataffiche .= "
    							<li class=\"br\">
    							<a class=\"titrearticle_mc\" href=\"./spip.php?article$id_article\">$titrearticle</a> 
    							<small>publié le : <em>$dataffich</em> , dans la rubrique <em><a href=\"./spip.php?rubrique$id_secteur&mots[]=$variable\">$secteur</a></em></small></li>";
    							
    							
    							
    								
    								
    							$listmodidprec = $listidmot2;
    							$listidmot2 = "";
    				}
    			}
    			$idrub = $id_rubrique;
    		}
    		
    		
    		mysql_free_result($result);
    		
    		if($nbart == 0 || $nbart == 1)
    			$nbart_txt = "<:rmc:article_trouve:>";
    		else
    			$nbart_txt = "<:rmc:articles_trouves:>";
    			
    		echo "<div class=\"contre-encart\">";
    		
    		
    		
    		echo "<p class=\"mots_mc\"><span class=\"spanblock \">Mots séléctionnés : </span><br />".substr($tabmot, 0)." </p>";
    		if($nbart == 0 )
    			$nbart_txt = "Aucun article ne correspond à votre recherche";
    		else
    		if($nbart == 1 )
    			$nbart_txt = " article correspond à votre recherche";
    		else
    			$nbart_txt = "articles correspondent à votre recherche";
    		
    		if($nbart == 0 )
    		echo "
    			
    			<p class=\"mots_mc\"> $nbart_txt 
    			<br />			
    			<a href=\"#SELF\">Nouvelle recherche</a></p>";
    		else	
    		echo "
    				<p class=\"mots_mc\"> $nbart $nbart_txt 
    				<br />
    			<a href=\"#SELF\">Nouvelle recherche</a></p>";		
    			
    		
    		
    		
    		
    		echo "
    		<div class=\"liste-articles\">"
    		.$resultataffiche
    		."	</div>
    		</div>";		
    		if($nbart != 0 )
    		echo "	<br class=\"dixpixels\" />
    				<p class=\"mots_mc\"><a href=\"#SELF\">Nouvelle recherche</a></p>";	
    		
    		
    	} else {
    		echo "<p class=\"mots_mc\">Aucun article ne correspond à votre recherche</p>";			
    	}	
    } else {
    	echo "<div class=\"mots_mc\"><:rmc:selectionner_mot:></div>";
    # inutile si form recherche inclus	
    #	echo "<br /><a href=\"".$_SERVER['HTTP_REFERER']."\" onclick=\"javascript:history.back(); return false;\">Retour</a></p>";	
    }
    ?>
    </div>
    • pfiouuuu
      On peut voir la page de recherche ?
      Et aussi une petite description de comment les résultats sont affichés ?

    • Je te mets un lien vers la version qui fonctionne sur SPIP 2.1

      http://www.librairie-interactive.com/?page=recherche&type_rech=multi

      Je pense savoir d’où vient le problème mais je ne suis pas assez compétent en SQL pour le résoudre.
      En effet, je viens de réaliser que dans la nouvelle structure de la base de SPIP 3, la table spip_mots_articles n’existe plus alors que dans mon fichier, il y est souvent fait appel en SQL. Du coup mon code se comporte comme si il n’y avait aucun mot clé dans le tableau idmot et me dit qu’il n’y a pas de résultats.

      Reste à comprendre les jointures de la nouvelle base pour modifier le SQL dans mon code.

    • Bonjour Mike.

      Dites-moi si ra ré-écriture suivante marche avec la 2.1 :

      <div class="result_rm">
      <?php
      /*********************************************************************
       * RECHERCHE MULTI-CRITERES - MODELE AFFICHAGE DES RESULTATS
       *
       * @author
       * -2008-08: [Dominique (Dom) Lepaisant->www.tispip.etab.ac-caen.fr]
       * -2008-08: [Stéphanie De Nadaï->www.webdesigneuse.net]
       * - [Paul Sanchez->www.Netdeveloppeur.com] (contrib initiale)
       *
       * @copyright
       * Ce programme est un logiciel libre distribue sous licence GNU/GPL.
       *********************************************************************/
      
      
      $url = parse_url($_SERVER['QUERY_STRING']);
      
      $param = $url['path'];
      $pos = 0;
      $indice = 255;
      
      if (_request('idmot')) {
      
              // Récupération du nombre de jours
              // pour periodicité de la rechercher
              $nbjour = intval(_request('nbjour'));
      
              // Récupération du nombre de jours
              // pour periodicité de la rechercher
              if (_request('onlyrub')) {
                      $idonlyrub = intval(_request('rubnum'));
              } else
                      $idonlyrub = 0;
      
              // 1 = Tous les mots doivent être associés aux articles trouvés
              $allword = intval(_request('allword'));
      
              $sql_in_mot = implode(',', _request('idmot') );
              $nbmot = count(_request('idmot'));
      
              $result = sql_select('id_mot, titre', 'spip_mots', 'id_mot IN ('.$sql_in_mot.')', '', 'id_mot,titre"');
      
              $tabmot = "";
              $nbcol = 0;
              $nbcolmax = 4;
      
              if ($result) {
                      $compt = 0;
                      while ($row = sql_fetch($result)) {
                              extract($row);
                              $titre = supprimer_numero($titre);
                              if ($nbcol == $nbcolmax) {
                                      $nbcol = 0;
                              }
      
                              $tabmot .= "<a class=\"spanblock txtgris\" href=\"./spip.php?page=mot&mots[]=$id_mot\"><span class=\"cle\">$titre</span></a>";
                              $nbcol += 1;
                      }
                      sql_free($result);
              }
      
              $sql_where[] = "spip_mots_articles.id_mot IN (".$sql_in_mot.") ";
      
              if ($nbjour) {
                      $datedeb = date("Y-m-d", mktime(0, 0, 0, date("m"), (date("d") - $nbjour), date("Y")));
                      $sql_where[] = "spip_articles.date >= '$datedeb' ";
              }
      
              if ($idonlyrub) {
                      $sql_where[] = "spip_rubriques.id_rubrique = $idonlyrub ";
              }
      
              $sql_where[] = "spip_articles.statut = 'publie' GROUP BY spip_articles.id_article";
              if ($order) {
                      $sql_order = "spip_rubriques.id_rubrique, NUM DESC, spip_mots_articles.id_mot, spip_articles.date DESC";
              }
              else {
                      $sql_order = "NUM DESC, spip_mots_articles.id_mot, spip_rubriques.id_rubrique, spip_articles.date DESC";
              }
      
              $result = sql_select('COUNT(*) AS num, spip_articles.id_article, spip_rubriques.id_rubrique, spip_rubriques.titre AS titrerub', 'spip_articles INNER JOIN spip_rubriques ON spip_rubriques.id_rubrique = spip_articles.id_rubrique INNER JOIN spip_mots_articles ON spip_mots_articles.id_article = spip_articles.id_article', $sql_where, '', $sql_order);
      
              $nbart = 0;
      
              $resultataffiche = "";
              if ($result) {
                      $titrerub = supprimer_numero($titrerub);
                      $idrub = 0;
                      $listidmot2 = "";
                      $listidmotprec = "";
      
                      while ($row = sql_fetch($result)) {
                              extract($row);
                              if (($num != $nbmot) && ($allword)) {
                                      break;
                              }
      
                              if ($idrub != $id_rubrique) {
      
                                      if (($pospoint = strrpos($titrerub, ". ")) === FALSE) {
                                              $titrerub2=$titrerub;
                                      }
                                      else {
                                              if (is_numeric(substr($titrerub, 0, $pospoint)) == false)
                                                      $titrerub2 = $titrerub;
                                              else
                                                      $titrerub2 = substr($titrerub, $pospoint + 2);
                                      }
      
                                      if ($order) {
                                              $resultataffiche.= '<p><a href="'. generer_url_entite($id_rubrique, 'rubrique') ."\">$titrerub2 :</a></p>";
                                      }
                              }
      
                              $result2 = sql_select('spip_articles.id_article AS artid,spip_articles.id_secteur AS id_secteur, spip_articles.titre AS titreart, spip_articles.date, spip_mots.id_mot, spip_mots.titre AS titremot', 'spip_articles INNER JOIN spip_mots_articles ON spip_mots_articles.id_article = spip_articles.id_article INNER JOIN spip_mots ON spip_mots.id_mot = spip_mots_articles.id_mot ', "spip_articles.id_article = $id_article AND spip_mots_articles.id_mot IN (".$sql_in_mot.") AND statut = 'publie' ", '', 'spip_mots.id_mot');
      
                              if ($result2) {
                                      $listmot = "<h4 class=\"titremots_mc\">";
                                      $titrearticle = "";
                                      $dataffich = "";
                                      $idart = 0;
                                      while ($row2 = sql_fetch($result2)) {
                                              extract($row2);
                                              $listidmot2 .= "$id_mot,";
                                              if ($idart == 0) {
                                                      $titrearticle = supprimer_numero($titreart);
                                                      if (!(($pospoint = strpos($titrearticle, '.')) === FALSE))  {
                                                              if (is_numeric(substr($titrearticle, 0, $pospoint)) == true)
                                                                      $titrearticle = substr($titrearticle, $pospoint + 2);
      
                                                      }
                                                      if (!(($pospoint = strpos($titremot, '.')) === FALSE)) {
                                                              if (is_numeric(substr($titremot, 0, $pospoint)) == true)
                                                                      $titremot = substr($titremot, $pospoint + 2);
      
                                                      }
                                                      $dataffich = date("d/m/Y", strtotime($date));
      
                                                      if ($order) {
                                                              $nbart += 1;
                                                              $resultataffiche .= '<li><a class="titrearticle_mc"  href="'. generer_url_entite($artid, 'article') ."\">$titrearticle</a> <small>$dataffich </small>";
                                                              $resultataffiche .= "$titremot";
                                                      }
      
                                                      $listmot .= "<a class=\"spanblock\" href=\"./spip.php?page=mot&mots[]=$id_mot\"><span class=\"cle\">$titremot</span></a>";
                                                      $idart = 1;
                                              }
                                              else {
                                                      $listmot .= "<a class=\"spanblock\" href=\"./spip.php?page=mot&mots[]=$id_mot\"><span class=\"cle\">$titremot</span></a>";
                                                      if ($order) {
                                                              $resultataffiche .= "<a class=\"spanblock\" href=\"./spip.php?page=mot&mots[]=$id_mot\"><span class=\"cle\">$titremot</span></a>";
                                                      }
                                              }
                                      }
                                      if ($order) {
                                              $resultataffiche .= "</li>";
                                      }
      
                                      sql_free($result2);
      
                                      if (!$order) {
      
                                              if ($listidmot2 != $listmodidprec) {
                                                      $resultataffiche .= " $listmot </h4>";
                                              }
                                              $nbart += 1;
                                              switch ($id_secteur) {
                                                      case 1: $variable = 63; $secteur = "Ma classe"; break;
                                                      case 3: $variable = 66; $secteur = "Applications"; break;
                                                      case 4: $variable = 65; $secteur = "Tutoriels"; break;
                                                      case 5: $variable = 64; $secteur = "Liens"; break;
                                              }
                                                              $resultataffiche .= '<li class="br"><a class="titrearticle_mc" href="'. generer_url_entite($id_article, 'article'). "\">$titrearticle</a><small>publié le : <em>$dataffich</em> , dans la rubrique <em><a href=\"". generer_url_entite($id_secteur,'rubrique') ."&mots[]=$variable\">$secteur</a></em></small></li>";
      
                                                              $listmodidprec = $listidmot2;
                                                              $listidmot2 = "";
                                      }
                              }
                              $idrub = $id_rubrique;
                      }
      
      
                      sql_free($result);
      
                      if($nbart == 0 || $nbart == 1)
                              $nbart_txt = "<:rmc:article_trouve:>";
                      else
                              $nbart_txt = "<:rmc:articles_trouves:>";
      
                      echo "<div class=\"contre-encart\">";
      
                      echo "<p class=\"mots_mc\"><span class=\"spanblock \">Mots séléctionnés : </span><br />".substr($tabmot, 0)." </p>";
                      if($nbart == 0 )
                              $nbart_txt = "Aucun article ne correspond à votre recherche";
                      else
                      if($nbart == 1 )
                              $nbart_txt = " article correspond à votre recherche";
                      else
                              $nbart_txt = "articles correspondent à votre recherche";
      
                      if($nbart == 0 )
                              echo "<p class=\"mots_mc\"> $nbart_txt<br /><a href=\"#SELF\">Nouvelle recherche</a></p>";
                      else
                              echo "<p class=\"mots_mc\"> $nbart $nbart_txt<br /><a href=\"#SELF\">Nouvelle recherche</a></p>";
      
                      echo '<div class="liste-articles">'.$resultataffiche."</div></div>";
                      if($nbart)
                              echo "<br class=\"dixpixels\" /><p class=\"mots_mc\"><a href=\"#SELF\">Nouvelle recherche</a></p>";
      
              } else {
                      echo "<p class=\"mots_mc\">Aucun article ne correspond à votre recherche</p>";
              }
      } else {
              echo "<div class=\"mots_mc\"><:rmc:selectionner_mot:></div>";
      // inutile si form recherche inclus
      //        echo "<br /><a href=\"".$_SERVER['HTTP_REFERER']."\" onclick=\"javascript:history.back(); return false;\">Retour</a></p>";
      }
      ?>
      </div>

      Normalement c’est juste un portage qui utllise l’API SQL de SPIP : cela a pas mal d’avantages plus tard. Si ça marche, je peux adapter les requêtes (je soupçonne aussi les mots-clés)

      J’irai voir la page de recherche dans la soirée. Je pense que ça m’aidera à comprendre le code... Mais je pense aussi qu’il aurait été possible d’écrire cette page directement en langage de boucles SPIP avec ses bénéfices (lisibilité du HTML qui n’est pas mélangé à du PHP, portabilité et prise en main plus simples pour un non développeur, prise en charge automatique par le cache, etc.)

    • Bonsoir !

      Désolé je me suis trompé en postant tout à l’heure pour dire que c’était résolu et j’ai créé un autre post au lieu de répondre.

      C’était bien lié aux modifications de la base de données suite au passage en spip 3.

      La table spip_mot_articles est devenue spip_mots_liens et du coup spip_mots_articles.id_article devient spip_mots_liens.id_objet

      Merci d’avoir pris le temps de regarder ! :)

      Maintenant c’est vrai qu’il faudrait que je recode tout ça directement en SPIP mais j’avoue que je ne sais pas trop par quel bout commencer. J’avais déjà passé pas mal de temps à bidouiller ce code en php (dont je ne suis pas l’auteur) pour l’adapter à mes besoins. Je pense que c’est au delà de mes compétences pour le moment !

      En tous cas merci du temps que vous m’avez accordé, d’autant plus que le code est plutôt indigeste présenté comme ça !
      Mike

    • C’était ma prochaine suggestion (mais avant, s’assurer que la ré-écriture avec l’API ne casse rien) Mais ne pouvant pas tester, je n’étais pas certain que cette seule modification aurait suffit (je pensais qu’il aurait fallu rajouter dans votre cas que « objet='article' » en plus du lien sur id_objet (car la nouvelle structure permet de lier n’importe quel objet aux mots clés, pas que les articles... donc quand vous aurez des articles et des rubriques de même ID rattaché au même mot-clé...)

      <div class="result_rm">
      <?php
      /*********************************************************************
       * RECHERCHE MULTI-CRITERES - MODELE AFFICHAGE DES RESULTATS
       *
       * @author
       * -2008-08: [Dominique (Dom) Lepaisant->www.tispip.etab.ac-caen.fr]
       * -2008-08: [Stéphanie De Nadaï->www.webdesigneuse.net]
       * - [Paul Sanchez->www.Netdeveloppeur.com] (contrib initiale)
       *
       * @copyright
       * Ce programme est un logiciel libre distribue sous licence GNU/GPL.
       *********************************************************************/
      
      
      $url = parse_url($_SERVER['QUERY_STRING']);
      
      $param = $url['path'];
      $pos = 0;
      $indice = 255;
      
      if (_request('idmot')) {
      
              // Récupération du nombre de jours
              // pour periodicité de la rechercher
              $nbjour = intval(_request('nbjour'));
      
              // Récupération du nombre de jours
              // pour periodicité de la rechercher
              if (_request('onlyrub')) {
                      $idonlyrub = intval(_request('rubnum'));
              } else
                      $idonlyrub = 0;
      
              // 1 = Tous les mots doivent être associés aux articles trouvés
              $allword = intval(_request('allword'));
      
              $sql_in_mot = implode(',', _request('idmot') );
              $nbmot = count(_request('idmot'));
      
              $result = sql_select('id_mot, titre', 'spip_mots', 'id_mot IN ('.$sql_in_mot.')', '', 'id_mot,titre"');
      
              $tabmot = "";
              $nbcol = 0;
              $nbcolmax = 4;
      
              if ($result) {
                      $compt = 0;
                      while ($row = sql_fetch($result)) {
                              extract($row);
                              $titre = supprimer_numero($titre);
                              if ($nbcol == $nbcolmax) {
                                      $nbcol = 0;
                              }
      
                              $tabmot .= "<a class=\"spanblock txtgris\" href=\"./spip.php?page=mot&mots[]=$id_mot\"><span class=\"cle\">$titre</span></a>";
                              $nbcol += 1;
                      }
                      sql_free($result);
              }
      
              $sql_where[] = "spip_mots_liens.objet='article'"
              $sql_where[] = "spip_mots_liens.id_mot IN (".$sql_in_mot.") ";
      
              if ($nbjour) {
                      $datedeb = date("Y-m-d", mktime(0, 0, 0, date("m"), (date("d") - $nbjour), date("Y")));
                      $sql_where[] = "spip_articles.date >= '$datedeb' ";
              }
      
              if ($idonlyrub) {
                      $sql_where[] = "spip_rubriques.id_rubrique = $idonlyrub ";
              }
      
              $sql_where[] = "spip_articles.statut = 'publie' GROUP BY spip_articles.id_article";
              if ($order) {
                      $sql_order = "spip_rubriques.id_rubrique, num DESC, spip_mots_liens.id_mot, spip_articles.date DESC";
              }
              else {
                      $sql_order = "num DESC, spip_mots_liens.id_mot, spip_rubriques.id_rubrique, spip_articles.date DESC";
              }
      
              $result = sql_select('COUNT(*) AS num, spip_articles.id_article, spip_rubriques.id_rubrique, spip_rubriques.titre AS titrerub', 'spip_articles INNER JOIN spip_rubriques ON spip_rubriques.id_rubrique = spip_articles.id_rubrique INNER JOIN spip_mots_liens ON spip_mots_liens.id_objet = spip_articles.id_article', $sql_where, '', $sql_order);
      
              $nbart = 0;
      
              $resultataffiche = "";
              if ($result) {
                      $titrerub = supprimer_numero($titrerub);
                      $idrub = 0;
                      $listidmot2 = "";
                      $listidmotprec = "";
      
                      while ($row = sql_fetch($result)) {
                              extract($row);
                              if (($num != $nbmot) && ($allword)) {
                                      break;
                              }
      
                              if ($idrub != $id_rubrique) {
      
                                      if (($pospoint = strrpos($titrerub, ". ")) === FALSE) {
                                              $titrerub2=$titrerub;
                                      }
                                      else {
                                              if (is_numeric(substr($titrerub, 0, $pospoint)) == false)
                                                      $titrerub2 = $titrerub;
                                              else
                                                      $titrerub2 = substr($titrerub, $pospoint + 2);
                                      }
      
                                      if ($order) {
                                              $resultataffiche.= '<p><a href="'. generer_url_entite($id_rubrique, 'rubrique') ."\">$titrerub2 :</a></p>";
                                      }
                              }
      
                              $result2 = sql_select('spip_articles.id_article AS artid,spip_articles.id_secteur AS id_secteur, spip_articles.titre AS titreart, spip_articles.date, spip_mots.id_mot, spip_mots.titre AS titremot', 'spip_articles INNER JOIN spip_mots_liens ON spip_mots_liens.id_objet = spip_articles.id_article INNER JOIN spip_mots ON spip_mots.id_mot = spip_mots_liens.id_mot ', "spip_articles.id_article = $id_article AND spip_mots_liens.id_mot IN (".$sql_in_mot.") AND statut = 'publie' AND spip_mots_liens.objet = 'article' ", '', 'spip_mots.id_mot');
      
                              if ($result2) {
                                      $listmot = "<h4 class=\"titremots_mc\">";
                                      $titrearticle = "";
                                      $dataffich = "";
                                      $idart = 0;
                                      while ($row2 = sql_fetch($result2)) {
                                              extract($row2);
                                              $listidmot2 .= "$id_mot,";
                                              if ($idart == 0) {
                                                      $titrearticle = supprimer_numero($titreart);
                                                      if (!(($pospoint = strpos($titrearticle, '.')) === FALSE))  {
                                                              if (is_numeric(substr($titrearticle, 0, $pospoint)) == true)
                                                                      $titrearticle = substr($titrearticle, $pospoint + 2);
      
                                                      }
                                                      if (!(($pospoint = strpos($titremot, '.')) === FALSE)) {
                                                              if (is_numeric(substr($titremot, 0, $pospoint)) == true)
                                                                      $titremot = substr($titremot, $pospoint + 2);
      
                                                      }
                                                      $dataffich = date("d/m/Y", strtotime($date));
      
                                                      if ($order) {
                                                              $nbart += 1;
                                                              $resultataffiche .= '<li><a class="titrearticle_mc"  href="'. generer_url_entite($artid, 'article') ."\">$titrearticle</a> <small>$dataffich </small>";
                                                              $resultataffiche .= "$titremot";
                                                      }
      
                                                      $listmot .= "<a class=\"spanblock\" href=\"./spip.php?page=mot&mots[]=$id_mot\"><span class=\"cle\">$titremot</span></a>";
                                                      $idart = 1;
                                              }
                                              else {
                                                      $listmot .= "<a class=\"spanblock\" href=\"./spip.php?page=mot&mots[]=$id_mot\"><span class=\"cle\">$titremot</span></a>";
                                                      if ($order) {
                                                              $resultataffiche .= "<a class=\"spanblock\" href=\"./spip.php?page=mot&mots[]=$id_mot\"><span class=\"cle\">$titremot</span></a>";
                                                      }
                                              }
                                      }
                                      if ($order) {
                                              $resultataffiche .= "</li>";
                                      }
      
                                      sql_free($result2);
      
                                      if (!$order) {
      
                                              if ($listidmot2 != $listmodidprec) {
                                                      $resultataffiche .= " $listmot </h4>";
                                              }
                                              $nbart += 1;
                                              switch ($id_secteur) {
                                                      case 1: $variable = 63; $secteur = "Ma classe"; break;
                                                      case 3: $variable = 66; $secteur = "Applications"; break;
                                                      case 4: $variable = 65; $secteur = "Tutoriels"; break;
                                                      case 5: $variable = 64; $secteur = "Liens"; break;
                                              }
                                                              $resultataffiche .= '<li class="br"><a class="titrearticle_mc" href="'. generer_url_entite($id_article, 'article'). "\">$titrearticle</a><small>publié le : <em>$dataffich</em> , dans la rubrique <em><a href=\"". generer_url_entite($id_secteur,'rubrique') ."&mots[]=$variable\">$secteur</a></em></small></li>";
      
                                                              $listmodidprec = $listidmot2;
                                                              $listidmot2 = "";
                                      }
                              }
                              $idrub = $id_rubrique;
                      }
      
      
                      sql_free($result);
      
                      if($nbart == 0 || $nbart == 1)
                              $nbart_txt = "<:rmc:article_trouve:>";
                      else
                              $nbart_txt = "<:rmc:articles_trouves:>";
      
                      echo "<div class=\"contre-encart\">";
      
                      echo "<p class=\"mots_mc\"><span class=\"spanblock \">Mots séléctionnés : </span><br />".substr($tabmot, 0)." </p>";
                      if($nbart == 0 )
                              $nbart_txt = "Aucun article ne correspond à votre recherche";
                      else
                      if($nbart == 1 )
                              $nbart_txt = " article correspond à votre recherche";
                      else
                              $nbart_txt = "articles correspondent à votre recherche";
      
                      if($nbart == 0 )
                              echo "<p class=\"mots_mc\"> $nbart_txt<br /><a href=\"#SELF\">Nouvelle recherche</a></p>";
                      else
                              echo "<p class=\"mots_mc\"> $nbart $nbart_txt<br /><a href=\"#SELF\">Nouvelle recherche</a></p>";
      
                      echo '<div class="liste-articles">'.$resultataffiche."</div></div>";
                      if($nbart)
                              echo "<br class=\"dixpixels\" /><p class=\"mots_mc\"><a href=\"#SELF\">Nouvelle recherche</a></p>";
      
              } else {
                      echo "<p class=\"mots_mc\">Aucun article ne correspond à votre recherche</p>";
              }
      } else {
              echo "<div class=\"mots_mc\"><:rmc:selectionner_mot:></div>";
      // inutile si form recherche inclus
      //        echo "<br /><a href=\"".$_SERVER['HTTP_REFERER']."\" onclick=\"javascript:history.back(); return false;\">Retour</a></p>";
      }
      ?>
      </div>
    • christophe noisette

      Bonjour
      j’ai le même souci d’utiliser la recherche multi-critère par mot clé sous spip3 du fait du changement de table de à . J’ai donc essayer de copier / coller ce que tu proposes, que j’ai mis dnas le fichier natif ’result_rec_mc.html’.
      La recherche se fait à partir de la page : http://www.infogm.org/spip.php?rubrique657.
      Quand je lance une recherche, j’ai droit au message d’erreur suivant : « Parse error : syntax error, unexpected T_VARIABLE in /homez.95/infogm/www/ecrire/public/evaluer_page.php(55) : eval()’d code on line 63 ».
      J’ai aussi essayer de simplement faire rechercher / remplacer sur mon premier fichier tous les spip_mots_articles par spip_mots_liens et les .id_article par des id.objet...Mais cette solution ne me donnait tout simplement aucun résultat... Jamais. Or j’ai bien des articles liés à des mots clés.
      Merci pour vos lumières

    Répondre à ce message

  • 3
    philooo

    le critere par num titre, id_document ne marche plus, car les numeros devant les titres sont maintenant ignore.

    c’est quoi le nouveau critere pour prendre en compte les numeros de titres ? la documentation n’est ps encore a jour :(

    • Sisi, {par num titre} marche toujours... ce n’est que la balise #TITRE qui a le numéro supprimé d’office.

    • C’est pas si simple je crois : car je constate aussi que {par num titre} ne trie pas par titre quand les titres ne contiennent pas de numéro !

    • Dans une rubrique, il est recommandé que soit il y ait des numéros à tous les articles, soit il n’y en ait pas du tout.

    Répondre à ce message

  • Problème résolu, je poste la réponse très simple qui pourra dépanner probablement d’autres personnes

    La table spip_mot_articles est devenue spip_mots_liens et du coup spip_mots_articles_.id_article devient spip_mots_liens.id_objet

    Merci d’avoir pris le temps de regarder ! Je suis conscient que comme ça le code php est un peu indigeste ! Je pourrais d’ailleurs faire ça plus simplement maintenant sous Spip 3 mais bon !

    Mike

    Répondre à ce message

  • 6

    Bonjour,
    Sauf erreur de ma part, le critère id_groupe semble ne plus fonctionner sur une boucle « breves » dans SPIP 3 (pour sélectionner les brèves liées à un groupe de mots-clés). http://www.spip.net/fr_article906.html

    La boucle suivante qui fonctionnait très bien sous SPIP 2, n’affiche plus rien après une migration sur SPIP3, et affiche une « erreur dans le squelette » de type « critère inconnu » :
    <BOUCLE_nom_de_boucle(BREVES){id_groupe="9"}{0,5}{id_rubrique="1"}{!par date}{doublons}>

    Je précise que la boucle se situe dans un « inclure ».

    Merci !

    • Bonjour.

      Quelle est l’erreur exacte ?

      Est-ce que l’erreur persiste quand on enlève {id_groupe="9"} et qu’on recalcule la page ?

    • Bonjour,
      Voici l’erreur exacte :

      1 Erreur(s) dans le squelette
      Numéro message squelette boucle Ligne
      1 Critère inconnu = squelettes/inclure/coldroite.html _fromtheweb 63

      Et la boucle n’affiche rien.

      Si j’enlève le critère ça marche sans problème.
      Pour le moment j’ai trouvé un autre moyen d’afficher ce que je veux mais c’est tout de même étrange.

    • Bonjour.

      Vous (Abel) écriviez :

      le critère id_groupe semble ne plus fonctionner sur une boucle « breves » dans SPIP 3 (pour sélectionner les brèves liées à un groupe de mots-clés)

      Et je (gilcot) ai répondu

      Est-ce que l’erreur persiste quand on enlève {id_groupe="9"} et qu’on recalcule la page ?

      Et vous (Abel) confirmez

      Si j’enlève le critère ça marche sans problème.
      ... mais c’est tout de même étrange.

      En fait, ce n’est pas si étrange que cela : le problème des mots-clés est un peu celui des forums, même si l’article ne le mentionne pas (mais c’est un poil plus complexe aussi) Mais l’essentiel (jointures automatiques) ayant été fait pour qu’on retombe sur ses pattes dans la plupart des cas (boucles simples de ce type), cette erreur n’aurait pas du se produire non ?
      A tout hasard (je ne peux pas tester là), remplacer {id_groupe="9"} par {mots.id_groupe="9"}{mots.objet='breve'} pour voir ce que ça donne

    • Bonjour,

      Alors si je mets {mots.id_groupe="9"}{mots.objet='breve'} ça ne fonctionne pas.
      Mais si je ne mets que {mots.id_groupe="9"} alors cela semble fonctionner.

      Abel

    • Salut Abel

      Comme j’ai pas testé.. mais vous avez trouvé la version qui fonctionne. L’idée était de forcer la jointure sur la table des mots clés ;-)

      Problème résolu donc. Bonne continuation.

    • Oui,
      Bravo et merci ! ^^

    Répondre à ce message

  • 2

    Un chapitre majeur de modification de SPIP 3 reste a expliciter :
    la gestion des mots-clés est a refondre assez complètement si vous utilisez ce domaine...
    car les tables dsupport ont completement changé.

    Voir les articls descriptifs SPIP3 (actuellement seulement en interface privée, en attendant leur publication publique a la sortie officielle de SPIP3)

    Répondre à ce message

Ajouter un commentaire

Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparaît.

Merci d’avance pour les personnes qui vous aideront !

Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.

Qui êtes-vous ?
[Se connecter]

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom