[spip-dev] [Bug CVs Spip-contrib]

Bonsoir,

Spip-contrib ayant un grand nombre d'auteurs, la page
http://www.spip-contrib.net/ecrire/auteurs.php3?tri=nom&debut=180 permet de
se rendre compte d'un bug.
Description :
Les liens « 0 | 30 | 60 | 90 | 120 | 150 | 161 | 180 » permettent bien de
passer d'une page auteurs à l'autre
Mais les liens « - 3 6 9 < A B C D E É F G H I J K L M N O P Q R S T U V W X
Y Z ^ _ » eux renvoient sur n'importe quoi ; ex, P renvois sur
http://www.spip-contrib.net/ecrire/auteurs.php3?tri=nom&debut=1300
Piste de résolution :
Manifestement, les premiers liens et le deuxièmes n'ont pas la même echelle.

Le code fautif est ici : lignes 256 et suivantes :
if (($tri == 'nom' OR !$tri) AND $options == 'avancees') {
  // affichage des lettres
  echo "<tr bgcolor='white'><td colspan='5'>";
  echo "<font face='Verdana,Arial,Sans,sans-serif' size=2>";
  while (list($key,$val) = each($lettre)) {
   if ($val == $debut)
    echo "<b>$key</b> ";
   else
    echo "<a href=$retour&debut=$val>$key</a> ";
  }
  echo "</font>";
  echo "</td></tr>\n";
}

Il doit falloir remplacer &debut=$val> par
&debut=".intval($val/$max_par_page).">

Mais comme je n'ai pas assez d'auteurs sur ma base, je ne peux pas vérifier.

Cordialement,

Jacques PYRAT wrote:
Re-Bonsoir,

J'ai continué à lire le code et je suis tombé sur ce commentaire:
// si on n'est pas minirezo, supprimer les auteurs sans article publie
// sauf les admins, toujours visibles.

Alors, je comprend mieux ce qui se passe : le calcul des pages est bon, mais
le calcul des premiers auteurs commençant par telle lettre est fait *avant*
cette suppression.

Donc, pour constater le bug, il ne faut pas être connecté avec le statut
minirezo.

Cordialement,

Vu, c'est dans le Todo.txt (comme quoi, celui-ci a au moins un lecteur)
Une remarque sur Nouveautés et Todo : est-ce que les mettre dans le wiki de
spip-contrib n'améliorerait pas leur audience et leur lisibilité ?

Jacques PYRAT wrote:

Jacques PYRAT wrote:

Bonsoir,

Spip-contrib ayant un grand nombre d'auteurs, la page
http://www.spip-contrib.net/ecrire/auteurs.php3?tri=nom&debut=180
permet de se rendre compte d'un bug.
Description :
Les liens « 0 | 30 | 60 | 90 | 120 | 150 | 161 | 180 » permettent
bien de passer d'une page auteurs à l'autre
Mais les liens « - 3 6 9 < A B C D E É F G H I J K L M N O P Q R S T
U V W X Y Z ^ _ » eux renvoient sur n'importe quoi ; ex, P renvois sur
http://www.spip-contrib.net/ecrire/auteurs.php3?tri=nom&debut=1300
Piste de résolution :
Manifestement, les premiers liens et le deuxièmes n'ont pas la même
echelle.

Et voici le diff du correctif :

--- D:\wwwrootDev\spip.net\spip\ecrire\auteurs.php3 Thu Sep 23 15:36:38 2004
UTC
+++ D:\wwwrootDev\spip.net\testspipcvs\ecrire\auteurs.php3 Tue Oct 5
21:34:38 2004 UTC
@@ -115,11 +115,6 @@
   $nombre_auteurs ++;

   $nom_auteur = $row['nom'];
- $premiere_lettre = addslashes(strtoupper(substr($nom_auteur,0,1)));
- if ($premiere_lettre != $lettre_prec) {
- $lettre[$premiere_lettre] = $nombre_auteurs-1;
- }
- $lettre_prec = $premiere_lettre;
  }

  $result_nombres = spip_query("SELECT auteurs.id_auteur, UPPER(auteurs.nom)
AS unom, COUNT(articles.id_article) AS compteur
@@ -143,6 +138,19 @@
   }
  }

+ // Apres avoir supprim'es les auteurs sans article publi'e
+ // Generer les paires Lettres/Indice pour l'acces direct sur la premiere
lettre
+ unset($lettres_nombre_auteurs);
+ reset($auteurs);
+ while (list(,$auteur) = each ($auteurs)) {
+ $lettres_nombre_auteurs ++;
+ $premiere_lettre = addslashes(strtoupper(substr($auteur['nom'],0,1)));
+ if ($premiere_lettre != $lettre_prec) {
+ $lettre[$premiere_lettre] = $lettres_nombre_auteurs-1;
+ }
+ $lettre_prec = $premiere_lettre;
+ }

Et voici le diff du correctif :

Excellent, merci. (Pour affiner encore cette page il faudrait sortir
la "vraie" première lettre y compris en unicode ou notation &#215; --
pour affiner encore plus il faudrait gérer les blocs multi...)

-- Fil

Fil wrote:

Et voici le diff du correctif :

Excellent, merci. (Pour affiner encore cette page il faudrait sortir
la "vraie" première lettre y compris en unicode ou notation &#215; --
pour affiner encore plus il faudrait gérer les blocs multi...)

Tout se joue ligne 147 : $premiere_lettre =
addslashes(strtoupper(substr($auteur['nom'],0,1)));
$auteur['nom'] contient la valeur du champ nom de l'auteur

Donc, si je comprends bien ta requète, il faut appliquer 2 filtres existant
déjà dans spip :
- typo ou propre ou autre pour échaper les caractère
- eclate_multi (valeur, langue courante) pour gérer les "traductions" du nom
de l'auteur (et ne pas avoir un auteur dont la première lettre est < )

Peux-tu me dire qu'elles sont précisément les fonctions de SPIP à utiliser
(je chercherai la syntaxe) ?
Merci

Fil a écrit :

Et voici le diff du correctif :

Excellent, merci. (Pour affiner encore cette page il faudrait sortir
la "vraie" première lettre y compris en unicode ou notation &#215; --
pour affiner encore plus il faudrait gérer les blocs multi...)

-- Fil

Et encore plus, permettre de faire ca dans la partie publique avec une boucle et un filtre. :slight_smile: