SPIP - Contrib

SPIP - Contrib

[ar] [en] [es] [fr] [it]

97 visiteurs en ce moment

fontsizeup fontsizedown
Accueil du site > Contribs > Navigation > Navigation transversale > Articles connexes par pertinence > Afficher les articles connexes, triés par pertinence.
[34 commentaires]

Afficher les articles connexes, triés par pertinence.

lundi 12 mai 2008, par Beurt

3 votes

Quelques noisettes et une goutte de php pour afficher les articles qui partagent le plus de mot-clés avec un autre article.

Les articles connexes

Il est très intéressant de pouvoir présenter à nos visiteurs les articles qui traitent du même sujet que celui qu’ils sont en train de lire. Cela peut se faire simplement en listant les articles présents dans la même rubrique. On peut aussi le faire plus finement, en présentant aux visiteurs la liste des articles qui partagent les mêmes mots-clés que l’article qu’ils sont en train de consulter. Ce sont les articles connexes (pas forcément dans la même rubrique, mais reliés par leurs mots-clés à l’article courant).

Avec Spip, il est simple de faire la liste des articles connexes. Pour chaque mot-clé rattaché à l’article consulté, on affiche la liste des articles qui ont ce mot-clé. Cela donne la noisette suivante à placer dans vos squelettes d’articles :

Cette noisette qui contient une boucle dans une autre qui affiche le titre et un lien de chaque article qui a un mot-clé commun avec l’article de contexte [1]. Ainsi, on a la liste des articles connexes. On peut affiner en informant le visiteur des mots-clés communs grâce à cette autre noisette à placer dans la boucle _Articles_Connexes :

Dans cette noisette, #_Contexte_Article:ID_ARTICLE signifie #ID_ARTICLE de la boucle _Contexte_Article, à ne pas confondre avec l’#ID_ARTICLE de la boucle dans laquelle on place la noisette (_Articles_Connexes). Pour en savoir plus sur la syntaxe des balises du type : #_Nom_Boucle:#NOMBALISE allez consulter la documentation de Spip sur les Balises non ambiguës.

Même chose pour #_Mots_Communs:TOTAL_BOUCLE.

Donc, vous devez adapter cette petite noisette à votre cas, si vous êtes dans une boucle globale qui se nomme _Contexte_Article, pas de problème ; sinon, n’oubliez pas de changer son nom.

Tout ça, c’est très bien... Mais à condition d’avoir peu d’articles, et de mots-clés. Car, si comme moi, vous avez beaucoup d’articles et qu’ils ont chacun beaucoup de mots-clés ; la liste des articles connexes devient rapidement interminable (songez qu’elle contient tous les articles qui ont au moins un mot-clé commun avec l’article visité !). Pour éviter d’avoir 200 articles listés à chaque fois on peut se contenter de mettre dans la boucle _Articles_Connexes un critère {0,20} qui liste les 20 premiers articles par mots-clés. Bien sûr si vous avez beaucoup de mots-clés, il faudra lister moins de 20 articles par mots-clés, et peut-être pas tous les mots-clés non plus... Beaucoup de contraintes finalement et une solution peu satisfaisante qui est de prendre les x premiers articles des n premiers mots-clés, sans tenir compte de la pertinence de ce choix (dans les x premiers articles, il peut y en avoir qui n’ont qu’un seul mot-clé commun avec celui visité, alors qu’on voudrai plutôt afficher ceux qui en ont le plus).

Comment trier les —trop nombreux— articles connexes par pertinence et n’afficher que les plus intéressants pour le visiteur ?

Principe de la contrib’

Les articles connexes les plus pertinents sont ceux qui ont le plus de mots-clés communs avec l’article consulté. C’est ceux-là que l’on veut voir s’afficher en premier.

La contrib’ adapte donc la noisette présentée plus haut, qui est classique, pour pouvoir compter le nombre de mots-clés communs associés à chaque article connexe.

Spip, permet depuis la version 1.9.2 de faire des tableaux et de les manipuler avec les balises #SET et #GET introduites avec Spip 1.9.1 (voir la documentation de Spip). Mais, pour bien comprendre comment les utiliser, il faudra au préalable comprendre comment faire sans les utiliser. Pour cela il faut utiliser du PHP (les impatients peuvent tout de suite aller lire la noisette pour Spip 1.9.2)

Noisette et noix de coco

Il faut toujours être dans un contexte d’article (donc que id_article soit défini).

On met en place le compteur pour chaque article qui a des mots-clés communs. Avec ce compteur on compte le nombre de mots-clés en commun. C’est dans un tableau en PHP. Voilà la noisette :

Le tableau $pertinence[ ] contient donc la liste des articles ayant des mots-clés communs avec notre article de contexte. Il contient aussi, pour chaque article de la liste, une valeur de pertinence qui correspond au nombre de mot-clés communs avec l’article de contexte.

On veut afficher les articles qui ont plus de 4 mots-clés communs (variable $maxcommun à changer selon vos goûts) avec notre article de contexte. On ne veut pas afficher plus de 20 articles (variable $maxarticles à changer selon vos goûts) au total.

Cette petite noisette grosse noix de coco est entrelacée dans du php : le tableau est trié de manière à ce que les articles les plus pertinents soient traités en premier. Puis, pour chaque élément du tableau, on va faire une boucle qui affiche un lien vers l’article, le nombre de mots-clés communs et la liste de ces mots-clés.

Et cela, seulement si la pertinence est suffisante (condition sur $maxcommun) et qu’il y a moins de 20 articles connexes affichés (condition sur $maxarticles)

Cette noix de coco est complexe parce qu’elle est imbriquée dans du PHP...

À propos de l’intégration du PHP

J’ai découvert pas mal de choses sur l’intégration du PHP dans Spip. Ce qu’il faut principalement retenir ce sont les étapes du travail de Spip, telles qu’elles sont expliquées par ARNO* [2] ici : « Le PHP est interprété après les boucles ».

Donc, quand on intègre du PHP dans Spip, on doit systématiquement le séparer du reste par des balises <?php et ?> qui indiquent où commence et où finit le PHP.

Si vous souhaitez, comme dans cette contrib’, utiliser des valeurs calculées par Spip, ou issues de la base de donnée dans votre script PHP, récupérez-les en suivant cette méthode : Comment récupérer une « variable spip » en une variable PHP ?

Autre découverte : on peut couper le script PHP par ces balises partout, même au milieu d’un test de condition, si on oublie pas de le finir un peu plus loin (toujours encadré par les balises <?php et ?>). C’est ce que je fais dans la seconde noisettex, en commençant un test sur le tableau (« while (list($ks,$vs) = each($pertinence)) { » dont la fin se situe plus loin dans un autre « bloc » de PHP).

Dernière découverte et grosse difficulté (exposée par ARNO*) : on ne peut pas récupérer de variable PHP dans Spip car les BOUCLE/#BALISE sont transformées en PHP avant que le contenu du fichier ne soit lu par le serveur web ! Heureusement, les contributeurs ont trouvé deux solutions.
- l’une simple que j’ai adopté, qui est expliquée ici : utiliser une variable PHP pour sélectionner une rubrique (par exemple). Ce n’est pas très élégant, car cela m’oblige à faire une boucle dans laquelle l’ensemble des articles est sélectionné, ce qui coûte un peu au serveur web/MySQL.

- L’autre est élégante et puissante, elle utilise l’environnement de la page : en allemand : Tricks mit HTTP-Vars (moi je ne parle pas l’allemand ! Mais, la voici en plus ou moins français : variable php dans un critère de boucle ?). Elle est trop complexe pour moi.

Sans PHP et en beaucoup plus rapide !...

(mise à jour du 12/05/2008)

La noix décrite plus haut fonctionne bien. Mais, comme elle contient du PHP, il y a des désavantages. Les principaux sont :

  1. Le PHP dans le squelette, ce qui en plus de ne pas être élégant, pose des problèmes d’efficacité avec le cache de Spip.
  2. Cette noix nécessite de faire plusieurs passages par une boucle (BOUCLE_Articles_Connexes) qui liste tous les articles. Sur de grosses bases de données, cela peut prendre des proportions considérables (vraiment...) !

Jusqu’à Spip 1.9.2 c’était la seule possible. En utilisant les #ARRAY de Spip, il est possible de faire sans PHP et donc d’éviter ces deux problèmes.

Le principe sera exactement le même : On va faire une première boucle imbriquée pour fabriquer un tableau qui liste les articles ayant des mots-clés communs avec une pondération (nombre de mots-clés communs). Puis nous allons afficher les articles ayant la plus forte pondération.

On ne peut éviter totalement de faire appel au PHP pour arriver à nos fins. Mais grâce aux filtres de Spip, nous pouvons éviter d’en mettre à l’intérieur du squelette. Les filtres sont appliqués sur les balises Spip. Des filtres personnalisés peuvent être définis dans le fichier mes_fonctions.php à placer dans le dossier squelettes. Des filtres peuvent aussi être des fonctions PHP. Nous allons utiliser les deux.

Si vous avez un fichier mes_fonctions.php, vous devrez rajouter le code ci-dessous dedans. Sinon, vous devrez en créer un que vous placerez dans votre dossier squelettes :

  1. <?php
  2. //Incrémente la valeur correspondant à une clé dans un tableau.
  3. //Est utilisé pour incrémenter la pondération des articles.
  4. function ponderation ($tableau,$cle) {
  5.         $tableau[$cle]++;
  6.         return $tableau;
  7. }
  8. ?>
  9. <?php
  10. //Trie un tableau en fonction de ses valeurs
  11. //Est nécessaire, car [(#GET{un_tableau}|asort)] ne semble pas fonctionner
  12. function trie_tableau ($tableau) {
  13.         arsort ($tableau);
  14.         return $tableau;
  15. }
  16. ?>

Nous y définissons deux filtres sur les tableaux. L’un incrémente la valeur correspondant à une clé d’un tableau, l’autre trie un tableau.

Reprenons notre squelette... Commençons par pondérer les articles en fonction de leurs mots-clés communs avec l’article de contexte :

À la place du PHP, nous utilisons l’un de nos filtres pour augmenter la pondération de nos articles dans un tableau Spip (notez que le tableau est en fait initialisé par le filtre). La balise #SET sert à affecter une valeur à une variable Spip (ici tableau_pertinence), #GET permet de récupérer le contenu de la variable.

L’objectif est de pouvoir utiliser un tableau Spip pour notre boucle BOUCLE_Articles_Connexes :

Pour rendre notre tableau utilisable dans une boucle, il va falloir lui faire subir des transformations :

- classer les articles par pondération (ils sont dans le désordre pour linstant)
- Transformer le tableau pour qu’il soit une liste d’id_article seulement. Car les id_article sont pour l’instant les clés du tableau, les valeurs sont les pondérations elles-mêmes. Alors que la boucle aura besoin d’un tableau où les id_article seront des valeurs [3].

Voici la manœuvre :

Le premier filtre vient de notre fichier mes_fonctions.php, qui trie le tableau. Ce tableau subit un second filtre, qui est une fonction PHP qui renvoie un tableau avec seulement les clés d’un autre tableau : array_keys.

Nous aurons aussi besoin de connaître la pertinence maximum des articles. C’est la première valeur de notre tableau tableau_pertinence une fois trié :

C’est reset qui retourne cette valeur dans notre variable pertinence_max (reset est une fonction PHP, utilisée comme filtre à l’instar de array_keys ci-dessus).

Passons aux choses sérieuses :

Cette boucle écrit les titres des 20 articles ({0,20}) ayant le plus de mots-clés communs avec l’article passé en contexte.

Mais pourquoi avoir récupéré pertinence_max ? Pour afficher la pertinence en pourcentage : (pondération de l'article*100)/pondération_max. Soit en Spip :

table_valeur donne la valeur stockée dans un tableau pour une clé donnée (ici #ID_ARTICLE). Pour le reste, ce sont des filtres mathématiques de Spip.

Voilà ! là noix qui découle de tout ceci et qui affiche les 20 articles connexes de l’id_article de contexte est :

N’oubliez surtout pas de créer ou de compléter votre fichier mes_fonctions.php sinon, ça ne va pas fonctionner !

Voilà, j’espère que cela vous sera utile. Je trouve en tout cas très agréable de pouvoir proposer à mes visiteurs une liste restreinte d’articles connexes qui sont toujours pertinents, car ils partagent un nombre de mots-clés important.

Et vive la navigation transversale !

P.-S.

Le logo de cet article est un extrait d’une image de notafish que vous pouvez retrouver là : Chaîne du pont-levis elle est sous license cc : by-sa.

Notes

[1] Le contexte est une notion fondamentale de Spip : c’est un endroit où id_article est défini (c’est-à-dire soit dans une boucle « articles », soit en recevant id_article par inclusion).

[2] l’un des papas de Spip. Voir aussi L’histoire minuscule et anecdotique de SPIP.

[3] Pour ceux qui ne savent pas, rappelons en simplifiant, que les tableaux de Spip, comme les tableaux PHP sont des suites d’éléments indexés par des clés. À chaque clé (unique) correspond une valeur (pas forcement unique, elle.).

Retour en haut de la page

34 Messages de forum

Voir toute la discussion

Pages 1 | 2 | 3 | 4

  • Répondre à ce message

    11 février 22:09 , par Beurt

    Ah zut !

    Pour l’instant je n’ai pas d’idée... Il faudrait peut-être regarder du coté d’arsort pour voir s’il fait un tri secondaire sur les clés ? À ce moment là les articles seraient toujours triés par leurs id_article...

    Sinon, il y aurait un moyen plus lourd pour permettre ce tri qui serait de créer une troisième colonne au tableau tableau_pertinence contenant les dates des articles (format Unix) et faire un tri secondaire sur cette colonne... Mais, pour l’instant, je ne vois pas de façon simple sans fourrer du PHP partout !

    Je vais essayer d’y réfléchir ! Il doit bien y avoir un moyen de faire ça tout en Spip... J’en suis sûr...

  • Répondre à ce message

    11 février 21:07 , par Marc

    Je comprends bien ce que tu proposes, mais cela ne semble pas marcher... et je ne sais pas vraiment te dire où ça coince. J’ai tenté différents critères, et leurs inverses, je ne comprends pas DU TOUT comment ils sont interprétés...

    - un exemple avec une brève d’un mot-clef ({par date}) :

    100 % (9 janvier 2009)
    100 % (10 janvier 2009)
    100 % (6 février 2009)
    100 % (24 novembre 2008)
    100 % (13 novembre 2008)
    100 % (27 octobre 2008)
    100 % (28 octobre 2008)
    100 % (8 novembre 2008)
    100 % (20 octobre 2008)

    - le même exemple, en théorie juste inversé par rapport à ci-dessus... ({!par date}) :

    100 % (28 octobre 2008)
    100 % (27 octobre 2008)
    100 % (20 octobre 2008)
    100 % (8 novembre 2008)
    100 % (13 novembre 2008)
    100 % (10 janvier 2009)
    100 % (9 janvier 2009)
    100 % (24 novembre 2008)
    100 % (6 février 2009)

    - un autre exemple ({par date}) :

    100 % (7 janvier 2009)
    100 % (15 janvier 2009)
    66.6666666667 % (29 janvier 2009)
    66.6666666667 % (29 janvier 2009)
    66.6666666667 % (16 janvier 2009)
    66.6666666667 % (29 janvier 2009)
    66.6666666667 % (31 janvier 2009)
    66.6666666667 % (13 novembre 2008)
    66.6666666667 % (24 octobre 2008)
    66.6666666667 % (9 décembre 2008)
    66.6666666667 % (29 janvier 2009)
    66.6666666667 % (3 février 2009)
    66.6666666667 % (6 janvier 2009)
    66.6666666667 % (13 novembre 2008)
    66.6666666667 % (5 décembre 2008)
    66.6666666667 % (6 février 2009)
    66.6666666667 % (5 février 2009)
    66.6666666667 % (30 décembre 2008)
    66.6666666667 % (2 janvier 2009)
    (je coupe les 33%)

    - le même exemple, en théorie juste inversé par rapport à ci-dessus... ({!par date}) :

    100 % (7 janvier 2009)
    100 % (15 janvier 2009)
    66.6666666667 % (5 décembre 2008)
    66.6666666667 % (30 décembre 2008)
    66.6666666667 % (2 janvier 2009)
    66.6666666667 % (6 janvier 2009)
    66.6666666667 % (6 février 2009)
    66.6666666667 % (5 février 2009)
    66.6666666667 % (24 octobre 2008)
    66.6666666667 % (13 novembre 2008)
    66.6666666667 % (13 novembre 2008)
    66.6666666667 % (3 février 2009)
    66.6666666667 % (29 janvier 2009)
    66.6666666667 % (9 décembre 2008)
    66.6666666667 % (29 janvier 2009)
    66.6666666667 % (29 janvier 2009)
    66.6666666667 % (29 janvier 2009)
    66.6666666667 % (31 janvier 2009)
    66.6666666667 % (16 janvier 2009)
    (je coupe les 33%)

    Les critères influent donc sur le résultat, mais y a manifestement quelque chose qui cloche ;).

    Si tu as des idées de pistes à explorer... parce que là je ne sais pas t’en dire plus. Merci de ton aide.

  • Répondre à ce message

    11 février 19:27 , par Beurt

    Faire ce tri (par pertinence puis par date) n’est pas très simple.

    Pour expliquer je vais partir du principe que tu utilises la version « sans PHP et beaucoup plus rapide » relatée à la fin de la contrib’.

    Si dans la boucle qui affiche les articles on met un critère {!par date} on aurait :

    1. <BOUCLE_Articles_Connexes(ARTICLES){id_article IN #GET{tableau_articles}}{0,20}{!par date}>
    2. blabla
    3. </BOUCLE_Articles_Connexes>

    Et les articles seraient bien triés par date, mais plus du tout par pertinence (à moins que deux articles aient la même date à la seconde près, ces deux-là seraient alors affichés par ordre de pertinence : inutile).

    Comme on ne peut pas rajouter ce critère au moment de l’affichage, il faut sans doute le faire en amont : avant que le tableau ne soit trié par pertinence.

    Donc, quand on construit le tableau, on rajoute le (ou les) critère que l’on choisit (ici {!par date}) :

    1. <BOUCLE_Tableau_Articles_Connexes(ARTICLES){!id_article}{id_mot}{!par date}>
    2. [(#SET{tableau_pertinence,
    3.         [(#GET{tableau_pertinence}
    4.                 |ponderation{#ID_ARTICLE}
    5.         )]
    6. })]
    7.         </BOUCLE_Tableau_Articles_Connexes>

    Dans le tableau tableau_pertinence les articles sont donc triés par date. Lorsque l’on transforme ce tableau en tableau_articles (par le filtre arsort dont tu parles), les articles sont retriés par pertinence, mais je pense que si leur pertinence est identique, ils gardent alors le tri initial (ici par date).

    Je ne sais pas si je suis clair ? :-/

    En résumé, je pense qu’en mettant le critère {!par date} à la boucle _Tableau_Articles_Connexes de cette contrib’ tu auras des articles triés par pertinence puis par date... Mais comme je n’ai pas testé, si tu essaies, tu me diras ! :-)

  • Répondre à ce message

    11 février 19:04 , par Marc

    Bonjour,

    Je débute en PHP/Spip. Sauriez-vous comment trier d’abord par pertinence (comme c’est fait actuellement) puis, pour les articles ayant la même pertinence, par un autre critère (a priori date inverse).

    Actuellement, le tableau est trié grâce à arsort ($tableau);, et j’avoue ne pas savoir comment ajouter un deuxième critère...

    Des idées ?

    Merci d’avance !

  • Répondre à ce message

    19 novembre 2008 17:21 , par Marc

    Bravo Jiou, cette modif me permet à moi aussi de faire fonctionner le script :)

    Et encore merci Beurt pour cette contrib’ très efficace.

  • Répondre à ce message

    22 juillet 2008 14:00 , par Jiou

    Eurêka, j’ai trouvé ! En tout cas, chez moi, ça marche.

    En fait, j’ai modifié :

    [(#SET{tableau_pertinence,
            [(#GET{tableau_pertinence}
                    |ponderation{#ID_ARTICLE}
            )]
    })]

    en enlevant certaines [(, ce qui donne :

    [(#SET{tableau_pertinence,
            #GET{tableau_pertinence}
                    |ponderation{#ID_ARTICLE}
           
    })]
  • Répondre à ce message

    27 juin 2008 17:55 , par Marc

    Quelques précisions sur les difficultés que j’ai rencontrées.

    Étape 1 : mes_fonctions, mais fonctionne pas

    - La boucle dans article.html
    - Le code PHP dans mes_fonctions.php (créé pour l’occasion, dans /squelettes/)

    Erreur(s) dans le squelette
    Erreur : filtre « ponderation » non défini, _Tableau_Articles_Connexes

    (Ce message apparait 5 fois.)

    J’ai lu (je ne retrouve pas où) qu’on ne pouvait charger qu’un seul fichier mes_fonctions.php à la fois, or j’en ai un dans le sous-répertoire couteau_suisse du plugin du même nom. (j’en ai aussi un dans /SpipClear, mais je n’utilise pas ces squelettes actuellement - et enfin j’ai un article_pdf_mes_fonctions.php dans /article_PDF, pour être complet)

    Bref, j’ai mis les deux fonctions de cette noisette dans mes_options.php et les fonctions sont bien reconnues. Je ne suis pas certain d’être bien "propre" avec ça, mais le fait d’avoir les mêmes messages d’erreur que mes petits copains plus haut me laisse penser que c’est pas le sujet (?).

    Étape 2 : Spip m’insulte et s’arrête

    - La boucle toujours dans article.html
    - Le code PHP dans mes_options.php

    Fatal error: Cannot increment/decrement overloaded objects nor string offsets in D:\Spip\ecrire\mes_options.php on line 43

    La ligne 43 étant $tableau[$cle]++;

    Étape 3 : Spip m’insulte mais continue

    - La boucle toujours dans article.html
    - Le code PHP toujours dans mes_options.php
    - Comme suggéré plus haut, je remplace (ligne 43) $tableau[$cle]++; par $tableau[$cle] = $tableau[$cle]+1;
    Bizarrement (mais toujours comme Jiou), le résultat est différent...

    Warning: arsort() expects parameter 1 to be array, string given in D:\Spip\ecrire\mes_options.php on line 51

    Warning: array_keys() [function.array-keys]: The first argument should be an array in D:\Spip\ecrire\public\composer.php(72) : eval()'d code on line 581

    Warning: arsort() expects parameter 1 to be array, string given in D:\Spip\ecrire\mes_options.php on line 51

    Warning: reset() [function.reset]: Passed variable is not an array or object in D:\Spip\ecrire\public\composer.php(72) : eval()'d code on line 587

    Contrairement à l’erreur fatale de tout à l’heure, ce ne sont que des Warning, donc l’article apparait... Mais pas les articles connexes (nada).

    Pour info, j’ai écrit quelques mots à différents endroits dans la noisette pour voir où Spip passait :

    [(#REM) Pour chaque mot clé de l'article]
    <BOUCLE_Mots_De_Article_Contexte(MOTS){id_article}>
    Passage n°1
    [(#REM) Pour chaque article qui a ce mot clé]
            <BOUCLE_Tableau_Articles_Connexes(ARTICLES){!id_article}{id_mot}>
    [(#SET{tableau_pertinence,
            [(#GET{tableau_pertinence}
                    |ponderation{#ID_ARTICLE}
            )]
    })]
    Passage n°2
            </BOUCLE_Tableau_Articles_Connexes>
    Passage n°3
    </BOUCLE_Mots_De_Article_Contexte>
    [(#REM) On fabrique un tableau trié avec les id_article comme valeurs]
    Passage n°4
    [(#SET{tableau_articles,
            [(#GET{tableau_pertinence}
                    |trie_tableau
                    |array_keys)]}
    )]
    Passage n°5
    [(#REM) On récupère la pondération maximale pour nos pourcentages]
    [(#SET{pertinence_max,
            [(#GET{tableau_pertinence}
                    |trie_tableau|reset)]}
    )]
    Passage n°6
    [(#REM) Cette boucle affiche le titre des 20 articles connexes, c'est-à-dire les 20 articles qui ont le plus de mots-clés communs avec celui du contexte.
    Elle donne la pondération en pourcents.]
    <BOUCLE_Articles_Connexes(ARTICLES){id_article IN #GET{tableau_articles}}{0,20}>
    Passage n°7
            #TITRE (pertinence:
    [(#GET{tableau_pertinence}
            |table_valeur{#ID_ARTICLE}
            |div{#GET{pertinence_max}}
            |mult{100}
    )]                %)<br />
    Passage n°8
    </BOUCLE_Articles_Connexes>

    Résultat : Passage n°1 Passage n°2 Passage n°2 Passage n°2 Passage n°2 Passage n°2 Passage n°2 Passage n°3 Passage n°4 Passage n°5 Passage n°6

    L’article testé n’a qu’un mot-clef, contenu par ailleurs dans 6 autres articles (d’où l’apparition à 6 reprises du passage n°2). Si ça peut vous aider à localiser le problème (parce que moi, pas des masses :D).

    Je suis aussi allé voir en var_mode=debug, et je crains que cela ne dépasse mon seuil de compétences...

    A disposition pour vous donner plus d’éléments.

    Merci de chercher, Beurt. :)

  • Répondre à ce message

    27 juin 2008 15:46 , par Beurt

    Hélas, je n’ai toujours pas trouvé de solution. Est-ce qu’il y a seulement des warning qui s’affichent ou bien est-ce qu’en plus les articles connexes ne sont pas affichés ?

  • Répondre à ce message

    24 juin 2008 16:34 , par Marc

    Bonjour,

    Merci à Beurt pour cette contrib’ qui répond parfaitement à un de mes besoins !

    Néanmoins... J’ai le même problème que Jiou en local (EasyPHP 2.0b1 : PHP 5.2.0 - Apache 2.2.3 - MySQL 5.0.27) et sur OVH.
    Quelqu’un a-t-il trouvé une solution ?

    NB : j’ai testé l’« ancienne méthode » présentée ici. Pour les articles sans mot-clef commun, j’ai le même message d’erreur que précisé dans les commentaires - ça doit pouvoir se gérer. Mais surtout, les inconvénients énoncés à la sortie de la « nouvelle méthode » m’incitent à chercher un autre moyen... Etant une bille en PHP, je m’en remets aux bonnes âmes. :)

    Merci d’avance à ceux qui prendront le temps de me répondre. Forza Spip

  • Répondre à ce message

    22 mai 2008 21:18 , par Bertrand

    Salut à tous,

    Moi aussi j’ai eu le même soucis d’avoir deux lignes d’erreur quand mon article ne possède pas de mots clés...

    Ce que j’ai fais pour empêcher ça est un peu bourrin mais fonctionnel en attendant de trouver mieux...

    Pour plus de clarté dans mon code, j’ai placé le code de Thierry Gagnon (avec la correction du $ qu’il a proposé dans le post suivant) dans un fichier nommé inc-connexes.html

    Et après j’ai placé mon inclusion de fichier dans une boucle qui teste la présence de mots clés attachés à l’article...

    <BOUCLE_presence_mots(MOTS){id_article}{0,1}>
           <INCLURE{fond=inc-connexes}{id_article}>
    </BOUCLE_presence_mots>

    La boucle ne renvoie rien si jamais il n’y a pas de mots clés, donc il n’y aura pas d’erreur en cas de non-présence de mots clés. Et le {0,1} permet de n’afficher qu’une fois les articles connexes si jamais il y a présence de plusieurs mots clés.

    Ça fonctionne. Je suis tout ouïe pour quelque chose de plus propre.

    De même, il y a comme un bug. En effet, la noisette affichera $maxarticles - 1 articles connexes.

    En tout cas, merci pour cette contrib qui est très utile et merci à Thierry pour les corrections apportées !

Pages 1 | 2 | 3 | 4

Répondre à cet article

Retour en haut de la page

Ça discute par ici