Changeset 61311 in spip-zone


Ignore:
Timestamp:
May 15, 2012, 11:52:37 AM (7 years ago)
Author:
marcimat@…
Message:

Réparer {compteur_publie forum} pour SPIP 3.

Il y a au moins encore le critere {archive?} qui plante.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • _squelettes_/aveline/trunk/aveline_fonctions.php

    r61221 r61311  
    4343
    4444function critere_compteur_publie($idb, &$boucles, $crit){
    45  $op='';
    46  $boucle = &$boucles[$idb];
    47  $params = $crit->param;
    48  $type = array_shift($params);
    49  $type = $type[0]->texte;
    50  if(preg_match(',^(\w+)([<>=])([0-9]+)$,',$type,$r)){
    51      $type=$r[1];
    52      $op=$r[2];
    53      $op_val=$r[3];
    54  }
    55  $type_id = 'compt.id_'.$type;
    56  $type_requete = $boucle->type_requete;
    57  $id_table = $boucle->id_table . '.' . $boucle->primary;
    58  $boucle->select[]= 'COUNT('.$type_id.') AS compteur_'.$type;
    59  $boucle->from['compt']="spip_".$type;
    60  $boucle->from_type['compt']= "LEFT";
    61  // On passe par cette jointure pour que les articles avec 0 commentaires soient comptés
    62  // Merci notation !
    63  $boucle->join["compt"]= array("'$boucle->id_table'","'$boucle->primary'","'$boucle->primary'","'compt.statut='.sql_quote('publie')");
    64  $boucle->group[]=$id_table;
    65  if ($op)
    66      $boucle->having[]= array("'".$op."'", "'compteur_".$type."'",$op_val);
     45        $op='';
     46        $boucle = &$boucles[$idb];
     47        $params = $crit->param;
     48        $type = array_shift($params);
     49        $type = $type[0]->texte;
     50        if (preg_match(',^(\w+)([<>=])([0-9]+)$,',$type,$r)){
     51                $type=$r[1];
     52                $op=$r[2];
     53                $op_val=$r[3];
     54        }
     55        // champ que l'on doit compter
     56        $type_id = 'compt.' . id_table_objet($type);
     57
     58        $type_requete = $boucle->type_requete;
     59        $id_table = $boucle->id_table . '.' . $boucle->primary;
     60        $boucle->select[]= 'COUNT('.$type_id.') AS compteur_'.$type;
     61        $boucle->from['compt'] = table_objet_sql($type);
     62        $boucle->from_type['compt']= "LEFT";
     63        // On passe par cette jointure pour que les articles avec 0 commentaires soient comptés
     64        // Merci notation !
     65        // on verifie que la table dispose d'un champ sur notre table
     66        // sinon on tente  objet id_objet
     67        $trouver_table = charger_fonction('trouver_table', 'base');
     68        $desc = $trouver_table($type);
     69        if (isset($desc['field'][ $boucle->primary ])) {
     70                # spip_forum du temps de id_article en vrai colonne
     71                # LEFT JOIN spip_forum AS compt ON ( compt.id_article = articles.id_article AND compt.statut='publie')
     72                $boucle->join["compt"] = array(
     73                        "'$boucle->id_table'",
     74                        "'$boucle->primary'",
     75                        "'$boucle->primary'",
     76                        "'compt.statut='.sql_quote('publie')"
     77                );
     78        } elseif (isset($desc['field']['objet']) and isset($desc['field']['id_objet'])) {
     79                # spip_forum spip 3
     80                # LEFT JOIN spip_forum AS compt ON ( compt.id_objet = articles.id_article AND compt.objet='article' AND compt.statut='publie')
     81                $objet = objet_type($boucle->primary);
     82                $boucle->join["compt"] = array(
     83                        "'$boucle->id_table'",
     84                        "'id_objet'",
     85                        "'$boucle->primary'",
     86                        "'compt.objet='.sql_quote('$objet').' AND compt.statut='.sql_quote('publie')"
     87                );
     88        } else {
     89                // bug...
     90                erreur_squelette(
     91                        _T('zbug_erreur_critere',
     92                                array('critere' => 'compteur_publie')
     93                        ), $p->id_boucle);
     94        }
     95        $boucle->group[] = $id_table;
     96        if ($op) {
     97                $boucle->having[]= array("'".$op."'", "'compteur_".$type."'", $op_val);
     98        }
    6799}
    68100
Note: See TracChangeset for help on using the changeset viewer.