Changeset 106028 in spip-zone for _plugins_/notation


Ignore:
Timestamp:
Sep 1, 2017, 3:31:49 PM (14 months ago)
Author:
marcimat@…
Message:

Introduction de 3 calculs facilitant l’analyse des notes avec les formulaires JAIME/JAIMEPAS avec le critère {notation}, dans son usage le plus simple,
tel que (FORUMS){notation} (pas dans l’usage (AUTEURS articles){notation articles} dans ce commit)

  • nombre_votes_moins : retourne le nombre de votes 'jaimepas', c'est à dire valant 1 étoile
  • nombre_votes_plus : retourne le nombre de votes 'jaime', c'est à dire valant {max} étoiles (5 par défaut, selon la configuration)
  • nombre_votes_diff : retourne… la différence des 2 nombres. Si 5 votes + et 2 votes -, cela retournera 3 donc.

Les balises #NOTATION_NOMBRE_VOTES_PLUS, #NOTATION_NOMBRE_VOTES_MOINS et #NOTATION_NOMBRE_VOTES_DIFF
permettent de retrouver ces calculs ensuite.

On peut donc faire dans une boucle : <BOUCLE_sujets(FORUMS){notation}{!par nombre_votes_diff}{pagination 10}>
pour avoir les sujets les mieux placés.

À la différence de {!par moyenne_ponderee} ou {!par moyenne} les éléments exclusivements négatifs seront
placés après les éléments n’ayant pas reçus de votes.

Location:
_plugins_/notation/trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/notation/trunk/inc/notation_balises.php

    r102527 r106028  
    135135        $boucle = &$boucles[$idb];
    136136
    137         $table = calculer_liste($crit->param[0], array(), $boucles, $boucles[$idb]->id_parent);
    138 
    139         if (!preg_match(",^'\w+'$,",$table)){
     137        $table = null;
     138        if (isset($crit->param[0])) {
     139                $table = calculer_liste($crit->param[0], array(), $boucles, $boucles[$idb]->id_parent);
     140        }
     141
     142        if (!$table or !preg_match(",^'\w+'$,",$table)){
    140143                $table = $boucle->type_requete;
    141144                $id_table = $boucle->id_table;
     
    146149                include_spip('inc/notation');
    147150                $ponderation = notation_get_ponderation();
     151                $note_max = notation_get_nb_notes();
     152
    148153                $boucle->select[]= 'COUNT(notations.note) AS nombre_votes';
     154                // Pour formulaires jaime et jaime/jaimepas : nombre de votes j’aime, j’aime pas et différence
     155                $boucle->select[]= 'COALESCE(SUM(notations.note=1), 0) AS nombre_votes_moins';
     156                $boucle->select[]= 'COALESCE(SUM(notations.note=' . intval($note_max) . '), 0) AS nombre_votes_plus';
     157                $boucle->select[]= 'COALESCE(SUM(notations.note=' . intval($note_max) . ') - SUM(notations.note=1), 0) AS nombre_votes_diff';
     158                // Calculs utiles : moyenne et moyenne pondérée.
    149159                $boucle->select[]= 'ROUND(AVG(notations.note),2) AS moyenne';
    150160                $boucle->select[]= 'ROUND(AVG(notations.note)*(1-EXP(-5*COUNT(notations.note)/'.$ponderation.')),2) AS moyenne_ponderee';
     
    160170       
    161171                // Cas d'un {notation moyenne>3}
    162                 $op='';
    163                 $params = $crit->param;
    164                 $type = array_shift($params);
    165                 $type = $type[0]->texte;
    166                 if(preg_match(',^(\w+)([<>=]+)([0-9]+)$,',$type,$r)){
    167                         $type=$r[1];
    168                         $op=$r[2];
    169                         $op_val=$r[3];
    170                 }
    171                 if ($op)
    172                         $boucle->having[]= array("'".$op."'", "'".$type."'",$op_val);
     172                if ($crit->param and count($crit->param) > 1) {
     173                        $op = '';
     174                        $params = $crit->param;
     175                        $type = array_shift($params);
     176                        $type = $type[0]->texte;
     177                        if (preg_match(',^(\w+)([<>=]+)([0-9]+)$,', $type, $r)) {
     178                                $type = $r[1];
     179                                $op = $r[2];
     180                                $op_val = $r[3];
     181                        }
     182                        if ($op) {
     183                                $boucle->having[] = array("'" . $op . "'", "'" . $type . "'", $op_val);
     184                        }
     185                }
    173186        }
    174187        // on utilise la notation sur une table jointe
     
    204217
    205218/**
    206  * Retourne le nombre de vote sur un objet de SPIP.
    207  * Necessite le critere {notation} sur la boucle
    208  * <BOUCLE_(ARTICLES){notation}>#NOTATION_NOMBRE_VOTES ...
     219 * Retourne le nombre de votes sur un objet de SPIP.
     220 *
     221 * Nécessite le critère {notation} sur la boucle `<BOUCLE_(ARTICLES){notation}>#NOTATION_NOMBRE_VOTES ...`
     222 * ou objet/id_objet en paramètre `#NOTATION_NOMBRE_VOTES{article,3}`
    209223 */
    210224function balise_NOTATION_NOMBRE_VOTES_dist($p) {
    211         if (($_objet = interprete_argument_balise(1,$p))!==NULL
    212                 AND ($_id = interprete_argument_balise(2,$p))!==NULL) {
    213                 $p->code = "notation_generer_info($_id,$_objet,'nombre_votes')";
     225        return calculer_balise_notation_champ($p, 'nombre_votes');
     226}
     227
     228/**
     229 * Retourne la moyenne des votes sur un objet de SPIP.
     230 *
     231 * Nécessite le critère {notation} sur la boucle `<BOUCLE_(ARTICLES){notation}>#NOTATION_MOYENNE ...`
     232 * ou objet/id_objet en paramètre `#NOTATION_MOYENNE{article,3}`
     233 */
     234function balise_NOTATION_MOYENNE_dist($p) {
     235        return calculer_balise_notation_champ($p, 'moyenne');
     236}
     237
     238/**
     239 * Retourne la moyenne ponderée des votes sur un objet de SPIP.
     240 *
     241 * Nécessite le critère {notation} sur la boucle `<BOUCLE_(ARTICLES){notation}>#NOTATION_MOYENNE_PONDEREE ...`
     242 * ou objet/id_objet en paramètre `#NOTATION_MOYENNE_PONDEREE{article,3}`
     243 */
     244function balise_NOTATION_MOYENNE_PONDEREE_dist($p) {
     245        return calculer_balise_notation_champ($p, 'moyenne_ponderee');
     246}
     247
     248/**
     249 * Retourne le nombre de votes positifs (jaime) sur un objet de SPIP.
     250 *
     251 * Nécessite le critère {notation} sur la boucle `<BOUCLE_(ARTICLES){notation}>#NOTATION_NOMBRE_VOTES_PLUS ...`
     252 */
     253function balise_NOTATION_NOMBRE_VOTES_PLUS_dist($p) {
     254        return rindex_pile($p, 'nombre_votes_plus', 'notation');
     255}
     256
     257/**
     258 * Retourne le nombre de votes négatifs (jaimepas) sur un objet de SPIP.
     259 *
     260 * Nécessite le critère {notation} sur la boucle `<BOUCLE_(ARTICLES){notation}>#NOTATION_NOMBRE_VOTES_MOINS ...`
     261 */
     262function balise_NOTATION_NOMBRE_VOTES_MOINS_dist($p) {
     263        return rindex_pile($p, 'nombre_votes_moins', 'notation');
     264}
     265
     266/**
     267 * Retourne la différence entre le nombre de votes positifs et négatifs (jaime - jaimepas) sur un objet de SPIP.
     268 *
     269 * Nécessite le critère {notation} sur la boucle `<BOUCLE_(ARTICLES){notation}>#NOTATION_NOMBRE_VOTES_DIFF ...`
     270 */
     271function balise_NOTATION_NOMBRE_VOTES_DIFF_dist($p) {
     272        return rindex_pile($p, 'nombre_votes_diff', 'notation');
     273}
     274
     275/**
     276 * Retourne champ calculé par le critère `{notation}`.
     277 *
     278 * Si objet et id_objet est passé en paramètre de la balise,
     279 * alors on calcule sans le critère.
     280 * @param Champ $p
     281 * @param string $champ Nom du champ souhaité.
     282 * @return Champ
     283 */
     284function calculer_balise_notation_champ($p, $champ) {
     285        if (
     286                ($_objet = interprete_argument_balise(1, $p))  !== NULL
     287                AND ($_id = interprete_argument_balise(2, $p)) !== NULL
     288        ) {
     289                $p->code = "notation_generer_info($_id, $_objet, $champ)";
    214290                $p->interdire_scripts = false;
    215291                return $p;
    216         }
    217         else
    218                 return rindex_pile($p, 'nombre_votes', 'notation');
    219 }
    220 
    221 /**
    222  * Retourne la moyenne des votes sur un objet de SPIP.
    223  * Necessite le critere {notation} sur la boucle
    224  * <BOUCLE_(ARTICLES){notation}>#NOTATION_NOMBRE_VOTES ...
    225  */
    226 function balise_NOTATION_MOYENNE_dist($p) {
    227         if (($_objet = interprete_argument_balise(1,$p))!==NULL
    228                 AND ($_id = interprete_argument_balise(2,$p))!==NULL) {
    229                 $p->code = "notation_generer_info($_id,$_objet,'moyenne')";
    230                 $p->interdire_scripts = false;
    231                 return $p;
    232         }
    233         else
    234                 return rindex_pile($p, 'moyenne', 'notation');
    235 }
    236 
    237 /**
    238  * Retourne la moyenne ponderee des votes sur un objet de SPIP.
    239  * Necessite le critere {notation} sur la boucle
    240  * <BOUCLE_(ARTICLES){notation}>#NOTATION_NOMBRE_VOTES ...
    241  */
    242 function balise_NOTATION_MOYENNE_PONDEREE_dist($p) {
    243         if (($_objet = interprete_argument_balise(1,$p))!==NULL
    244                 AND ($_id = interprete_argument_balise(2,$p))!==NULL) {
    245                 $p->code = "notation_generer_info($_id,$_objet,'moyenne_ponderee')";
    246                 $p->interdire_scripts = false;
    247                 return $p;
    248         }
    249         else
    250                 return rindex_pile($p, 'moyenne_ponderee', 'notation');
     292        } else {
     293                return rindex_pile($p, $champ, 'notation');
     294        }
    251295}
    252296
    253297function notation_generer_info($id_objet,$objet,$info){
    254298        static $infos = array();
    255         if (!in_array($info,array('nombre_votes','moyenne','moyenne_ponderee')))
     299        if (!in_array($info,array('nombre_votes','moyenne','moyenne_ponderee'))) {
    256300                return '';
     301        }
    257302
    258303  if (!isset($infos[$objet][$id_objet])){
  • _plugins_/notation/trunk/paquet.xml

    r105962 r106028  
    22        prefix="notation"
    33        categorie="communication"
    4         version="2.3.2"
     4        version="2.4.0"
    55        etat="test"
    66        compatibilite="[3.0.0;3.1.*]"
Note: See TracChangeset for help on using the changeset viewer.