Affichage du nombre de billets
Modification du composant
Bottom-blog pour
permettre l'affichage du nombre de billets dans
chaque catégorie.
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.
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.
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
Soit passer par une base de donnée au format csv.
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
Les composants
Top-blog et
Bottom-blog permettent
de gérer simplement un blog comme celui-ci, voir
le
tutorial qui lui est consacré.
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 billetsif 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;
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 billetsnum_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;
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 StringFromFileStringToFile(nom_du_fichier,variable);
// lecture d'un fichier texte
variable := StringFomFile(nom_du_fichier);
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
compilationvar 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.
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