Modification du composant Bottom-blog pour permettre l'affichage du nombre de billets dans chaque catégorie.

Les composants Top-blog et Bottom-blog permettent de gérer simplement un blog comme celui-ci, voir le tutorial qui lui est consacré.

1


La principale difficulté pour obtenir le nombre de billets est qu'une même rubrique peut se retrouver dans plusieurs catégories, il suffit de lui attribuer un mot clef au nom de celle-ci.

 // si nous avons des catégories on affiche le bloc
  if categories.text<> '' then
  begin
   writeln('<<WEB(<div id="categories"><h2 class="categorie">)>>'+GetParam( 'categorie','Catégories')+'<<WEB(</h2>)>>');
   writeln('<<WEB(<ul>)>>');
   // pour chaque catégorie...
   for i:=0 to categories.count- 1 do
   begin 
    titre_categorie := categories.strings[i]; 
    // si on doit afficher le nombre de billets de la catégorie
    if billets then
    begin
     // trouver le nombre de billets dans la catégorie
     num_billets := GetVarInt(titre_categorie+ '.NB',-1);
     // s'il n'est pas en cache il nous faut le calculer
     if num_billets=-1 then
     begin
      // on compte le nombre de rubriques directement dans la catégorie
      num_billets := GetChildCountOf(GetNumOf(titre_categorie));
      // rajouter les billets accolés par mot-clef
      for j:=0 to categories.count- 1 do
      // pour cela il faut regarder toutes les rubriques des autres catégories
      if j<>i  then
      begin
        // n = numéro d'une catégorie a explorer
       n := GetNumOf(categories.strings[j]);
        // m = numéro de la dernière rubrique de cette catégorie
       m := n+GetChildCountOf(n);
        // pour toutes les rubriques de cette catégorie
        for num_rubrique:=n+1 to m do
        begin
         // k = nombre total de mot clef de la rubrique numéro o
        k := GetKeysOf(num_rubrique);
         // on parcours l'ensemble des mots clefs
         for l:=0 to k do
          // si un des mots clefs correspond à la catégorie de départ on augmente le nombre de billets
          if GetKey(l)=titre_categorie  then num_billets := num_billets +  1;
         end;
      end;
      // on va mettre en cache le nombre de billet pour éviter de refaire le calcul lors d'une prochaine demande
      SetVarInt(titre_categorie+ '.NB',num_billets);
     end;
     n_billets :=  ' ('+inttostr(num_billets)+')';
    end else n_billets :=  ''
    
    // si l'on ne se trouve pas sur la page de la catégorie on met un lien vers elle
    if getTitreReel<>titre_categorie  then
       writeln( '<<WEB(<li>)>><<MCR(JI(qchPath,`')>>+titre_categorie+<<FNT(NUMBER.-,-,-,-:#39)>>+<<FNT(STRING.-,-,-,-:'):')>>+GetShortTitre(titre_categorie)+n_billets+<<FNT(STRING.-,-,-,-:')>><<WEB(</li>)>>')
    else
    // sinon on l'affiche simplement sans lien
     writeln('<<WEB(<li>)>>'+GetShortTitre(titre_categorie)+n_billets+ '<<WEB(</li>)>>');
    end;
    // fin de notre liste de catégorie et du bloc
    writeln('<<WEB(</ul></div>)>>');
   end
  categories.free;
  outopic.free;
 end;
Code gérant le calcul des billets
Pour éviter d'avoir à recalculer on utilise un système de cache de manière à n'avoir à le faire qu'une seule fois par catégorie.

  // trouver le nombre de billets dans la catégorie
     num_billets := GetVarInt(titre_categorie+ '.NB',-1);
  // s'il n'est pas en cache il nous faut le calculer
     if num_billets=-1 then
     begin
      ...      
     // on va mettre en cache le nombre de billet pour éviter de refaire le calcul
      SetVarInt(titre_categorie+'.NB',num_billets);
     end;
   
Utilisation d'un cache pour le nombre de billets

Le couple GetVarInt/SetVarInt permet de stocker des entiers, pour les chaînes de texte vous avez GetVarString/SetVarString, le cache n'est valable que pendant le temps de la compilation .

Si vous souhaitez pouvoir conserver et réutiliser des données il vous faut soit passer par des fichiers textes au travers des fonctions StringFromFile et StringToFile

// sauvegarder d'une variable contenant du texte
StringToFile(nom_du_fichier,variable);
// lecture d'un fichier texte
variable := StringFomFile(nom_du_fichier);
Utilisation des fonctions StringToFile et StringFromFile
Soit passer par une base de donnée au format csv.

// déclaration variables
var database,datepub: string;
    maj,min,build:integer;
begin
  // n'exécuter le script qu'une fois par compilation
  if  GetVarInt( 'COMPIL_LOG',0)=0 then
  begin
   SetVarInt('COMPIL_LOG',1);
   // la base portera le nom du projet
   database := GetProjet+ '.csv';
   // si elle n'existe pas, on crée les champs
   if dbRowCount(database)= 0 then
   begin
    dbAddField(database, 'Version');
    dbAddField(database, 'Date');
    dbAddField(database, 'Compilation');
   end;
   // obtenir les infos sur la version de l'aide 
   GetVersion(maj,min,build,datepub);
   // on ajoute une ligne à notre base
   dbAddRow(database);
   // on renseigne les champs de la ligne créée
   dbSetData(database,'Version',intToStr(maj)+ '.'+intToStr(min)+'.'+inttostr(build));
   dbSetData(database,'Date',FormatDateTime('',Now));
   if Condition('_HLP_')       then dbSetData(database,'Compilation','Hlp')       else
   if Condition('_HTMLHELP_'then dbSetData(database, 'Compilation','HtmlHelp'else
   if Condition('_HTML_')      then dbSetData(database,'Compilation','Html')      else
   if Condition('_PDF_')       then dbSetData(database,'Compilation','Pdf')       else
   if Condition('_RTF_WORD_'then dbSetData(database, 'Compilation','Rtf')       else
                                 dbSetData(database, 'Compilation','???');
 end;
end;
end.
Enregistrement du numéro de version, de la date et du format de compilation

Vous pouvez télécharger composant-bottom-blog.zip et placer son contenu dans le répertoire system.hew/script.
Révisé le : 03/10/2006 16:45:36
Imprimer