Exemple de balises calculées

J'ai résolu mon souci en 3 étapes :

1. créer une fonction qui calcule un "trimestre" à partir d'une date

2. créer le champ dans la boucle

3. créer la balise qui appelle le champ

Voilou, c'est résumé dans un article en cours de validation sur spip-contrib : http://www.spip-contrib.net/Une-balise-TRIMESTRE?var_mode=preview

J'espère que ça pourra servir à quelqu'un !

A+
Cyril

Cyril MARION a écrit :

J'ai résolu mon souci en 3 étapes :

1. créer une fonction qui calcule un "trimestre" à partir d'une date
2. créer le champ dans la boucle
3. créer la balise qui appelle le champ

Voilou, c'est résumé dans un article en cours de validation sur spip-contrib : Une nouvelle balise : exemple avec #TRIMESTRE - SPIP-Contrib

J'espère que ça pourra servir à quelqu'un !
A+
Cyril

Salut,
J'ai lu ton article. Mais c'est pas un peu compliqué tout ça?

Il y a pas mal d'imprécisions dans l'article, par exemple :

  - calcule_trimestre (code) ou calculer_trimestre (exemple) ?
  - ce n'est pas [(#DATE{calculer_trimestre})], mais [(#DATE|calculer_trimestre)]
  - boucle_ARTICLE (code) ou boucle_ARTICLES (SPIP) ?
    attention : la surcharge de la boucle ARTICLES est incompatible avec le plugin acces_restreint

Il manque un exemple de boucle afin de tester l'intérêt de la solution proposée.

Est-ce qu'on peut pas arriver au même résultat plus simplement ?

un simple filtre suffirait largement :

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}

Pat

Pat a écrit :

Cyril MARION a écrit :

J'ai résolu mon souci en 3 étapes :

1. créer une fonction qui calcule un "trimestre" à partir d'une date
2. créer le champ dans la boucle
3. créer la balise qui appelle le champ

Voilou, c'est résumé dans un article en cours de validation sur spip-contrib : Une nouvelle balise : exemple avec #TRIMESTRE - SPIP-Contrib

J'espère que ça pourra servir à quelqu'un !
A+
Cyril

Salut,
J'ai lu ton article. Mais c'est pas un peu compliqué tout ça?

*Réponse privée de Cyril :*

Salut Pat, merci pour tes remarques très complètes.

J'ai corrigé quelques imprécisions, et OK pour l'exemple de boucle, j'en ferai une. Sinon à mon sens, certes l'astuce est un peu complexe, mais il peut servir pas seulement pour calculer un trimestre (on peut faire un filtre) et s'en servir comme critère (merci pour l'exemple détaillé...) mais peut aussi servir d'exemple pour créer n'importe quelle balise. J'ai galéré à trouver comment déclarer le nouveau champ, et j'ai trouvé la solution en modifiant la boucle_ARTICLE

Sur la liste ou sur contrib vous utilisez souvent le terme "surcharge"... je ne vois pas bien les implications ? si on récrit dans mes_fonctions une boucle_ARTICLE celle-ci s'exécute par dessus la boucle_ARTICLE_dist : est-ce que c'est ça une surcharge ? Si je voulais par exemple que ma nouvelle balise #TRIMESTRE soit compatible avec la boucle_ARTICLE de acces_restreint, comment faire ?

Merci encore !
A+

Cyril

Pat a écrit :

Pat a écrit :

Cyril MARION a écrit :

J'ai résolu mon souci en 3 étapes :

1. créer une fonction qui calcule un "trimestre" à partir d'une date
2. créer le champ dans la boucle
3. créer la balise qui appelle le champ

Voilou, c'est résumé dans un article en cours de validation sur spip-contrib : Une nouvelle balise : exemple avec #TRIMESTRE - SPIP-Contrib

J'espère que ça pourra servir à quelqu'un !
A+
Cyril

Salut,
J'ai lu ton article. Mais c'est pas un peu compliqué tout ça?

*Réponse privée de Cyril :*

Salut Pat, merci pour tes remarques très complètes.

Sur la liste ou sur contrib vous utilisez souvent le terme "surcharge"... je ne vois pas bien les implications ? si on récrit dans mes_fonctions une boucle_ARTICLE celle-ci s'exécute par dessus la boucle_ARTICLE_dist : est-ce que c'est ça une surcharge ? Si je voulais par exemple que ma nouvelle balise #TRIMESTRE soit compatible avec la boucle_ARTICLE de acces_restreint, comment faire ?

Oui, certaines fonction de SPIP sont codées ma_function_dist() et sont donc surchargeables par une fonction ma_fonction() que l'on peut écrire soit-même.

En fait, ces fonctions surchargeables sont apellées par charger_fonction('ma_function'). Ce système à double niveau permet donc d'utiliser ma_fonction() à la place de ma_function_dist(), mais ne peut-être effectué qu'UNE seule fois sur une installation SPIP !
Du coup, les plugins qui font la même surcharge de fonction ne sont pas compatibles.

Comme la boucle_ARTICLES (au pluriel, non ?) est une boucle très utilisée, il vaut mieux être prudent pour la réécrire.

Ce qui m'avait frappé dans ton code, c'est que le champ que tu crées est en fait une donnée calculée à partir d'un champ existant, ce qui crée une sorte de donnée redondante... Autant peut-être se débrouiller pour calculer directement dans un boucle le trimestre en fonction de la date lorsqu'on en a besoin, d'autant plus que cette fonction existe déjà en SQL : quarter().

D'ou : le filtre, le critère et la balise que je t'ai proposées...
Voila pour les 2-3 idées :slight_smile:

Pat