developer.jelix.org is not used any more and exists only for history. Post new tickets on the Github account.
developer.jelix.org n'est plus utilisée, et existe uniquement pour son historique. Postez les nouveaux tickets sur le compte github.

Opened 13 years ago

Closed 13 years ago

Last modified 13 years ago

#375 closed new feature (fixed)

plugin jtpl counter

Reported by: nuks Owned by: nuks
Priority: lowest Milestone: Jelix 1.0 RC1
Component: jelix:tpl Version: 1.0 beta 3.1
Severity: trivial Keywords: jtpl plugin counter
Cc: Blocked By:
Blocking: Documentation needed:
Hosting Provider: Php version:

Description

Il faudrait avoir un plugin jtpl pour afficher un nombre s'incrémentant ou se décrémentant dans une boucle. Plus d'info dans les commentaires par la suite

Attachments (3)

tpl_counter_patch.diff (6.5 KB) - added by nuks 13 years ago.
without tests
patch_counter_with_testes.diff (18.2 KB) - added by nuks 13 years ago.
patchpatch_counter_with_testes2.diff (14.2 KB) - added by nuks 13 years ago.

Download all attachments as: .zip

Change History (15)

comment:1 Changed 13 years ago by nuks

  • Type changed from bug to new feature

Changed 13 years ago by nuks

without tests

comment:2 Changed 13 years ago by nuks

Les testes unitaires n'ont pas encore été fait pour la première version.

Pour l'utilisation : {counter [$param[,$on = true]]}

Quand $on est à false, seul l'enregistrement des paramètres est pris en compte, il n'y à aucun affichage et ça ne compte pas comme une incrémentation.

Pour $param, c'est un tableau de paramètre (tous sont facultatifs. Si ils sont omis, la valeur par défaut est prise.) :

'name' => string : ( Le nom du compteur. Par défaut 'default'. )
'type' => string : ( '0' pour un affichage numérique | '00' idem mais à 2 chiffres | 'aa' pour un affichage alphabet en minuscule | 'AA' idem en majuscule. Par défaut '0'. )
'start' => int ( Si type = 0|00. Par défaut 1|01  ) | string ( Si type = aa|AA. Par défaut 'a'|'A' ) : ( Là ou le conteur commence a compter. )
'skip' => int : ( L'intervalle de séparation. Par défaut 1. Par exemple, si skip=5, {counter} renverrai 1 la première fois, 6 la deuxième fois, …)
'order' => string : ( L'ordre dans le quel s'affiche les {counter}. Soit 'asc' pour un ordre croissant, soit 'desc' pour un ordre décroissant. Par défaut 'asc'. )
'reset' => bool : ( True pour ré-initialiser les paramètres. Par défaut false. )
'resetAll' => bool : ( True pour ré-initialiser les paramètres de tout les conteurs. Par défaut false. )

Les paramètres restent enregistrer pour un conteur jusqu'à modification sauf pour reset, resetAll et $on qui reviennent à leur valeur initial à chaque fois.

Exemple d'utilisation :

<p>
    {counter array('name' => 'first', 'type' => 'AA'), false}
    {counter array('type' => '00'), false}
    {foreach $categs as $categ}
        #{counter array('name' => 'first')} {$categ->title} ( {$categ->date} ).<br/>
        {foreach $categ['news'] as $news}
            {counter}. {$news->title} ( {$news->date} ).<br/>
        {/foreach}
    {/foreach}
</p>

Changed 13 years ago by nuks

comment:3 Changed 13 years ago by nuks

Bon bah voilà. Avec les testes unitaires. Nouvelle chose : Un même compteur peut interagir sur plusieurs templates. C'est utile dans des cas très rares mais bon.. Pour cela, il suffit de définir la même valeur à la variable 'counterTemplateId' dans les templates partagent les mêmes conteurs. Attention, si elle n'est pas définie manuellement, cette variable est sélectionnée automatiquement. Ainsi, il vaut mieux ne pas choisir l'id soit même mais plutôt utiliser l'id du template déjà parsé avec lequel on veut partagé les conteurs, ou alors utiliser un id négatif (pas sure que ça fonctionne, mais si les tableaux à index négatifs fonctionnent, ce qui est très probable, ça fonctionnera).

comment:4 Changed 13 years ago by laurentj

  • Milestone changed from Jelix 1.1 to Jelix 1.0 RC1

comment:5 Changed 13 years ago by nuks

  • Owner changed from nuKs to nuks

comment:6 Changed 13 years ago by nuks

  • Component changed from jelix to jelix:tpl

comment:7 follow-up: Changed 13 years ago by laurentj

Je propose une API que je pense plus simple. Il y aurait plutôt 4 plugins :

{counter_init 'name', 'type', 'start', 'incr'}

{counter 'name'}

{counter_reset 'name'}

{counter_reset_all}

Cela évite l'utilisation d'un array (qui est embétant à taper), surtout pour le nom. Les paramètres type start et incr seraient facultatifs. Pas de paramètre order : pour avoir un sens decremental, il suffit d'avoir un incr négatif ;-) Peut être aussi que le paramètre type serait bien à la fin (je pense que c'est rare de devoir l'utilisation non ?).

Donc pour créer un compteur, on appel counter_init. Puis on appelle counter juste pour afficher. Si on appelle counter sans faire de counter_init, il utilise un counter default numerique, commençant à 1 (ou 0 ?), incrementant de 1.

Counter_reset et counter_reset_all parlent d'eux même.

Qu'en penses-tu ?

Ton exemple deviendrait :

<p>
    {counter_init 'first', 'AA'}
    {counter_init '','00'}
    {foreach $categs as $categ}
        #{counter 'first'} {$categ->title} ( {$categ->date} ).<br/>
        {foreach $categ['news'] as $news}
            {counter}. {$news->title} ( {$news->date} ).<br/>
        {/foreach}
    {/foreach}
</p>

Sinon, quelques remarques sur le code :

+    $counterTemplateId = $tpl->get('counterTemplateId');
+    if($counterTemplateId === NULL) {
+        $tpl->assign('counterTemplateId', $counterTemplateLastId);

D'une part, sache que tu peux accéder directement au tableau des variables par $tpl->_vars. De plus, tu as à ta diposition un $tpl->_privateVars, qui permet de stocker des variables "privées" pour les plugins, ce qui évite une éventuelle collision avec les variables créées par le développeur (donc celles qui sont dans _vars).

Enlever aussi les espaces en fin de ligne et les sauts de lignes en trop.

comment:8 Changed 13 years ago by nuks

Erf.. Je vais devoir refaire tous les templates des testes unitaires alors :/ Pour annuler partage des différents templates ( $tpl->_privateVars ), c'est vrai que ça n'est pas indispensable. Sinon, si j'ai utilisé un array, c'est justement pour ne pas avoir d'ordre dans les paramètres, m'enfin, c'est comme tu veux. Pour le paramètre type, je pense qu'il reste plus utilisé que start et incr, donc je le laisse là.

Bon, je vais te faire tout ça.

PS : Si tu as des idées sur que faire quand un compteur type 'aa' ou 'AA' sort de l'alphabet (actuellement, le type passe à '0' et le compteur recommence à 0), ou alors, pour les noms des différents type de compter, je suis preneur.

comment:9 in reply to: ↑ 7 Changed 13 years ago by nuks

Replying to laurentj:

Je propose une API que je pense plus simple. Il y aurait plutôt 4 plugins :

{counter 'name'}

Je me suis permis d'ajouter un deuxième argument permettant de ne pas afficher le compteur. Je fini les testes unitaires et puis je up tout ça.

Changed 13 years ago by nuks

comment:10 Changed 13 years ago by nuks

Voilà, tout est fait. Je n'ai pas testé sur mon application personnelle, mais les testes unitaires ont tous fonctionné du premier coup donc je ne pense pas qu'il y ai de problème. Maintenant, va falloir y ajouter une doc, quoique, les commentaires sont très explicites :) PS : La séparation en 4 fonctions a permis d'optimiser le truc je pense :d

comment:11 follow-up: Changed 13 years ago by laurentj

  • Resolution set to fixed
  • Status changed from new to closed

Review+.

Patch inclus dans le trunk.

Merci pour cette contribution !

comment:12 in reply to: ↑ 11 Changed 13 years ago by nuks

Replying to laurentj:

Review+.

Patch inclus dans le trunk.

Merci pour cette contribution !

Pas de problème :)

Note: See TracTickets for help on using tickets.