Cette contrib permet de créer, puis d’utiliser une nouvelle balise #TRIMESTRE, à la fois en tant que balise dans une boucle articles, mais aussi comme critère dans la boucle.
Il faut ajouter ces 3 fonctions dans le fichiers « mes_fonctions.php » [1].
1. Créer la fonction qui calcule le trimestre à partir d’une date
Le format choisi pour le trimestre est de la forme « annee - trimestre » de manière à pouvoir opérer des tris. Le calcul s’effectue à partir des fonctions date de SPIP :
- function calculer_trimestre($la_date) {
- $la_date = normaliser_date($la_date);
- $le_mois = mois($la_date);
- $l_annee = annee($la_date);
- return $le_trimestre;
- }
A noter : cette fonction peut aussi s’utiliser telle quelle en tant que filtre sur une date à la manière classique : [(#DATE|calculer_trimestre)].
2. Ajouter la nouvelle colonne (le nouveau champ) dans la boucle
Afin de « déclarer » la nouvelle colonne, il faut modifier la fonction boucle_ARTICLE [2] de la façon suivante :
- function boucle_ARTICLE($id_boucle, &$boucles) {
- $boucle = &$boucles[$id_boucle];
- $id_table = $boucle->id_table;
- $boucle->select[] = "CONCAT(year(date), '-', quarter(date)) AS trimestre";
- $boucle->from[$id_table] = "spip_article";
- $mstatut = $id_table .'.statut';
- // Restreindre aux elements publies
- if (!$boucle->modificateur['criteres']['statut']) {
- if (!$GLOBALS['var_preview']) {
- if ($GLOBALS['meta']["post_dates"] == 'non')
- }
- }
- return calculer_boucle($id_boucle, $boucles);
- }
Cette modification peut s’apprécier en mode debug en cliquant sur « résultat » : on voit que la requête appelle un nouveau champ.
3. Créer la balise #TRIMESTRE qui retournera le trimestre
- function balise_TRIMESTRE($p) {
- $date_evenement = champ_sql('date', $p);
- $p->code = "calculer_trimestre($date_evenement)";
- $p->interdire_scripts = false;
- return $p;
- }
Désormais il est possible dans une boucle ARTICLES d’utiliser un critère « trimestre », et d’afficher une balise #TRIMESTRE dans les squelettes.
Le débat
L’interêt de cette contrib réside plus sur la méthode pour se créer une nouvelle balise (boucle + balise), ou un nouveau champ virtuel, que dans l’obtention d’un trimestre à partir d’une date (que l’on obtient aussi facilement avec un petit filtre utilisant la fonction « quarter(date) » de MySQL).
L’interrogation est plutôt : qu’est-ce qui est mieux (pour un résultat équivalent et un boulot équivalent) ?
- soit : filtre + critère => 2 fonctions dans mes_fonctions
- soit : nouveau champ virtuel => idem, 2 fonctions de plus (boucle et balise)
Le débat est lancé



Vos commentaires
# Le 26 décembre 2007 à 16:48, par Patrice Vanneufville
En réponse à : Une nouvelle balise : exemple avec #TRIMESTRE
Salut à tous,
Voici qq idées qui ont été évoquées en août et que je trouve utile de replacer ici, le débat n’est peut-être pas encore clos...
La surcharge de la boucle ARTICLES est incompatible avec le plugin acces_restreint.
Est-ce qu’on peut pas arriver au même résultat sans cette surcharge ?
un simple filtre trimestre ?
function trimestre($la_date) {$la_date = normaliser_date($la_date);
$le_mois = mois($la_date);
return ceil($le_mois/3);
}
à utiliser comme ceci :
[(#DATE|trimestre)]ou même :
[(#DATE|annee)]-[(#DATE|trimestre)]Ok pour le code de ta balise #TRIMESTRE :
function balise_TRIMESTRE($p) {$date = champ_sql('date', $p);
$p->code = "trimestre($date)";
$p->interdire_scripts = false;
return $p;
}
Pour le critère d’une boucle, voici une solution :
function critere_trimestre($idb, &$boucles, $crit) {$params = $crit->param;
if (count($params) < 1)
erreur_squelette(_T('zbug_info_erreur_squelette'), BOUCLE$idb : trimestre ?");
$trimestre= array_shift($params);
$trimestre = $trimestre[0]->texte;
if (strpos($trimestre, '|')!=false) $op = "REGEXP \'$trimestre\'";
$op = "REGEXP \'$trimestre\'";
else $op = "= $trimestre";
$boucle = &$boucles[$idb];
$table = $boucle->id_table;
$where = "quarter($table.date) $op";
if ($crit->not) $where = "NOT($where)";
$boucle->where[] = "'$where'";
}
Exemples :
<BOUCLE_articles(ARTICLES) {trimestre 3}>ou : {trimestre 3|4}
ou : {!trimestre 3}
ou : {!trimestre 3|4}
Mais tout ce binz peut-être aussi obtenu comme ceci :
<BOUCLE_articles(ARTICLES) {quarter(date)=3}>ou : {quarter(date)==3|4}
ou : {quarter(date)!=3}
ou : {quarter(date)!==3|4}
Répondre à ce message