SPIP - Contrib

[ar] [en] [es] [fr] [it]



Accueil du site > Agendas et Dates > Affichage selon dates > Balise #TRIMESTRE

Une nouvelle balise : exemple avec #TRIMESTRE

mardi 21 août 2007, par Cyril MARION. Dernier ajout mardi 21 août 2007


Un exemple de création d’une balise #TRIMESTRE dans les boucles articles.


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 :

  1.  
  2. function calculer_trimestre($la_date) {
  3.   $la_date = normaliser_date($la_date);
  4.   $le_mois = mois($la_date);
  5.   $l_annee = annee($la_date);
  6.   $le_trimestre = $l_annee.'-'.ceil ($le_mois/3);
  7.   return $le_trimestre;
  8. }
  9.  

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 :

  1.  
  2. function boucle_ARTICLE($id_boucle, &$boucles) {
  3.   $boucle = &$boucles[$id_boucle];
  4.   $id_table = $boucle->id_table;
  5.   $boucle->select[] = "CONCAT(year(date), '-', quarter(date)) AS trimestre";
  6.   $boucle->from[$id_table] = "spip_article";
  7.   $mstatut = $id_table .'.statut';
  8.  
  9.   // Restreindre aux elements publies
  10.   if (!$boucle->modificateur['criteres']['statut']) {
  11.     if (!$GLOBALS['var_preview']) {
  12.       $boucle->where[]= array("'='", "'$mstatut'", "'\"publie\"'");
  13.       if ($GLOBALS['meta']["post_dates"] == 'non')
  14.       $boucle->where[]= array("'<'", "'$id_table" . ".date'", "'NOW()'");
  15.     }
  16.     else $boucle->where[]= array("'IN'", "'$mstatut'", "'(\"publie\",\"prop\")'");
  17.   }
  18.  
  19.   return calculer_boucle($id_boucle, $boucles);
  20.  
  21. }
  22.  

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

  1.  
  2. function balise_TRIMESTRE($p) {
  3.   $date_evenement = champ_sql('date', $p);
  4.   $p->code = "calculer_trimestre($date_evenement)";
  5.   $p->interdire_scripts = false;
  6.   return $p;   
  7. }
  8.  

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é

P.-S.

De la même manière il doit être possible de créer une nouvelle balise qui provienne d’une requête avec plein de join sur plusieurs tables...

Notes

[1] Nota : « mes_fonctions.php » est à créer, s’il n’existe pas, dans votre répertoire « squelettes ». C’est un fichier php il doit être ouvert et fermé par les balises <?php et ?>, avec rien avant et après

[2] on peut appeler aussi la fonction boucle_ARTICLE_dist s’il s’agit d’ajouter la fonction en dehors d’un plugin


Répondre à cet article

  • Une nouvelle balise : exemple avec #TRIMESTRE

    26 décembre 2007 16:48, par Patrice Vanneufville

    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

    Retour au début des forums



Suivre la vie du site RSS 2.0 | Plan du site | Espace privé | Charte et vie SPIP-Contrib | SPIP | L'autre.net