Glossaire - Création de liens nom -> définition

Glossaire - Création de liens nom -> définition - PHP - Programmation

Marsh Posté le 27-04-2004 à 09:29:21    

Salut à tous :)
 
la question aurait aussi pu être posée dans d'autres catégories (HTML par exemple), mais je pense qu'elle a sa place ici ;)
 
Je suis en train de coder un petit site, utilisant PHP et mySQL.
J'ai une table GLOSSAIRE, dans laquelle j'ai une association entre en terme, et sa définition.
 
La plupart des pages du site sont dynamiques, générées par du PHP.
 
Je voudrais que chaque terme qui apparait dans le glossaire soit 'cliquable' et qu'un clic dessus affiche la définition provenant du glossaire.
 
Pour les quelques pages statiques du site, pas de problème, je code en dur le lien vers la définition.
 
Pour les pages dynamiquement créées par du PHP, c'est plus compliqué ...
Je pense qu'avant d'afficher une page html produite par du PHP, il faut stoquer le résultat (html) produit par le script PHP dans une chaîne, et appeler une fonction PHP qui parse cette chaîne, et pour chaque mot, regarde si le mot est dans le glossaire, et si c'est le cas, remplace <le mot> par <le mot et le lien vers le glossaire>.
 
Bien sûr, il faut mettre le contenu de la table GLOSSAIRE en cache (dans un tableau), pour ne pas faire une requête à chaque mot rencontré ...
 
Est-ce viable ? Trop gourmand ?
 
Quelqu'un a déjà fait quelque chose de ce genre ?
 
Merci d'avance :)

Reply

Marsh Posté le 27-04-2004 à 09:29:21   

Reply

Marsh Posté le 27-04-2004 à 09:32:04    

gourmand, peut-être, faut faire le test
un coup d'ob_start() et Cie pour récupérer la sortie html puis des regexp [:proy]

Reply

Marsh Posté le 27-04-2004 à 09:34:26    

faudrait peut être faire la liaison avec les définitions au moment de l'ajout en base des cnotenus plutot qu'à l'affichage...

Reply

Marsh Posté le 27-04-2004 à 09:35:06    

ça peut se faire en une grosse expression régulière ?
ou plusieurs (autant que de termes dans le glossaire) ?
 
je vais jeter un coup d'oeil à ob_start() ;)

Reply

Marsh Posté le 27-04-2004 à 09:36:01    

benou a écrit :

faudrait peut être faire la liaison avec les définitions au moment de l'ajout en base des cnotenus plutot qu'à l'affichage...


 
je préfererais éviter ...
Ca deviendrait le souk à maintenir, surtout si on veut changer l'arborescence du site, etc.

Reply

Marsh Posté le 27-04-2004 à 09:42:31    

Beegee a écrit :

je préfererais éviter ...
Ca deviendrait le souk à maintenir, surtout si on veut changer l'arborescence du site, etc.


faut juste prévoir une fonction de mise à jour des "liens définitions" en base.  
 
Franchement, ca ressemble à une usine à gaz ce que tu es en train de penser ... Rien que la page d'accueil de ton site : pour chaque visite va falloir faire à chaque fois le même traitement, qui génèrera exactement le même contenu ...
 
pour l'histoire de l'arborescence, tu peux ruser : plutot que d'ajouter un lien genre <a href="/def/http.html">HTTP</a>, tu peux plutot faire <a href="javascript: def('http');">HTTP</a>.
Ensuite, libre à toi de mettre ce que tu veux dans la fonction javascript def() ... Et en cas de mise à jour de l'arbo, tu as juste à modifier cette fonction.
 
Si j'étais toi, je mettrai aussi un attribut class="def" de façon à pouvoir facilement repérer les "liens définitions" après coup ...


Message édité par benou le 27-04-2004 à 09:43:49
Reply

Marsh Posté le 27-04-2004 à 09:48:39    

benou a écrit :

Franchement, ca ressemble à une usine à gaz ce que tu es en train de penser ... Rien que la page d'accueil de ton site : pour chaque visite va falloir faire à chaque fois le même traitement, qui génèrera exactement le même contenu ...


faut voir, avec un petit système de cache associé, ça peut le faire [:proy]
 
c'est plus au niveau de la recherche des mots à définir qu'il risque d'avoir un problème... par exemple, si un des mots est "body", il faudrait pas flinguer le code html :D

Reply

Marsh Posté le 27-04-2004 à 09:50:46    

Je peux pas trop mettre à jour le contenu des tables en fait, j'en ai plus de 80 à me taper, ce serait vraiment trop lourd à faire ...
 
Si vraiment j'arrive pas à faire les liens dynamiquement (ou si c'est trop coûteux), tant pis, je ferai un glossaire statique, sans lien pointant dessus ...

Reply

Marsh Posté le 27-04-2004 à 09:51:45    

dropsy a écrit :

faut voir, avec un petit système de cache associé, ça peut le faire [:proy]
 
c'est plus au niveau de la recherche des mots à définir qu'il risque d'avoir un problème... par exemple, si un des mots est "body", il faudrait pas flinguer le code html :D


 
ça c'est ok, les termes apparaissant dans le glossaire sont assez scientifiques (le site parle de champignon et emploie des termes assez incompréhensibles pour un néophyte ;) ).

Reply

Marsh Posté le 27-04-2004 à 10:08:23    

autre solution : faire le traitement de recherche des mots et d'ajout des liens côté client en javascript ...
 
avantage : tu ne modifies pas tes données en base, et le cout du traitement à la volée n'est pas payé par ton serveur mais est réparti sur les postes clients


Message édité par benou le 27-04-2004 à 10:08:38
Reply

Marsh Posté le 27-04-2004 à 10:08:23   

Reply

Marsh Posté le 27-04-2004 à 10:49:18    

c'est une possibilité, oui ...
 
faut voir si c'est viable, je vais faire quelques essais ;)

Reply

Marsh Posté le 27-04-2004 à 16:26:04    

une autre question, maintenant que je commence à implanter un appel à ereg_replace :)
 
J'aimerais remplacer par exemple :
- les occurences du mot 'blanc' par '<a href=...>blanc</a>'
- mais aussi les occurences du mot 'blancs' par '<a href=...>blancs</a>'
 
etc. (en réalité tous les mots 'blanc[ .,;s]' par eux-mêmes entourés du lien html :) )
 
Mais le problème c'est que j'arrive pas à récupérer la chaîne 'blancs' par exemple, pour la mettre au milieu des balises <a> ...
 
Exemple de code qui ne marche pas :

Code :
  1. function creerLiensGlossaire($buffer)
  2. {
  3.  // Parcours des données de la table GLOSSAIRE.
  4. $res = mysql_query("SELECT  GLOSSAIRE.TERME, GLOSSAIRE.DEFINITION
  5.      FROM  GLOSSAIRE;" );
  6. while ($row = mysql_fetch_array($res))
  7. {
  8.  $terme = $row['TERME']."[ .,;s]";
  9.  $remplacant = "<a target=\"_blank\" href=\"../script/glossaire.php?terme=".$row['TERME']."\" >".$row['TERME']."</a>";
  10.  // Création d'un lien vers le glossaire pour chaque terme y apparaissant
  11.  $buffer = ereg_replace($terme, $remplacant, $buffer);
  12. }
  13.  return $buffer;
  14. }


 
(ça ne marche pas puisque ça remplace 'blancs' par 'blanc' à l'affichage ...)
 
Des idées ?

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed