Changeset 114612 in spip-zone


Ignore:
Timestamp:
Mar 22, 2019, 8:13:50 PM (11 months ago)
Author:
bruno@…
Message:

report à l'arrache de r114572 pour sauver les stats de tonton sur plugin.spip :)

Location:
_core_/branches/spip-3.2/plugins/svp
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • _core_/branches/spip-3.2/plugins/svp

  • _core_/branches/spip-3.2/plugins/svp/inc/where_compatible_spip.php

    r93656 r114612  
    1515/**
    1616 * Construit le WHERE d'une requête SQL de selection des plugins ou paquets
    17  * compatibles avec une version ou une branche de spip.
     17 * compatibles avec une version, une branche de spip ou une liste de branches.
    1818 *
    1919 * Cette fonction est appelée par le critère {compatible_spip}
    2020 *
    21  * @used-by svp_compter()
    2221 * @used-by critere_compatible_spip_dist()
    2322 *
    2423 * @param string $version
    25  *     Numéro de version de SPIP, tel que 2.0.8
     24 *     Numéro de version de SPIP, tel que 2.0.8 ou de branche tel que 3.1 ou une liste de branche '3.1,3.2'
    2625 * @param string $table
    2726 *     Table d'application ou son alias SQL
     
    3130 *     Expression where de la requête SQL
    3231 */
    33 function inc_where_compatible_spip($version = '', $table, $op) {
     32function inc_where_compatible_spip($version, $table, $op) {
    3433
    35         // le critere s'applique a une VERSION (1.9.2, 2.0.8, ...)
    36         if (count(explode('.', $version)) == 3) {
    37                 $min = 'SUBSTRING_INDEX(' . $table . '.compatibilite_spip, \';\', 1)';
    38                 $max = 'SUBSTRING_INDEX(' . $table . '.compatibilite_spip, \';\', -1)';
     34        // En cas d'erreur sur le critère on annule l'effet du critère.
     35        $where = '1=1';
    3936
    40                 $where = 'CASE WHEN ' . $min . ' = \'\'
    41         OR ' . $min . ' = \'[\'
    42         THEN \'1.9.0\' <= \'' . $version . '\'
    43         ELSE TRIM(LEADING \'[\' FROM ' . $min . ') <= \'' . $version . '\'
    44         END
    45 AND
    46         CASE WHEN ' . $max . ' = \'\'
    47         OR ' . $max . ' = \']\'
    48         THEN \'99.99.99\' >= \'' . $version . '\'
    49         WHEN ' . $max . ' = \')\'
    50         OR ' . $max . ' = \'[\'
    51         THEN \'99.99.99\' > \'' . $version . '\'
    52         WHEN RIGHT(' . $max . ', 1) = \')\'
    53         OR RIGHT(' . $max . ', 1) = \'[\'
    54         THEN LEFT(' . $max . ', LENGTH(' . $max . ') - 1) > \'' . $version . '\'
    55         ELSE LEFT(' . $max . ', LENGTH(' . $max . ') - 1) >= \'' . $version . '\'
    56         END';
    57         } // le critere s'applique a une BRANCHE (1.9, 2.0, ...)
    58         elseif (count(explode('.', $version)) == 2) {
    59                 $where = 'LOCATE(\'' . $version . '\', ' . $table . '.branches_spip) ' . $op . ' 0';
    60         } // le critere est vide ou mal specifie
    61         else {
    62                 $where = '1=1';
     37        // On verifie en premier si on a affaire à une liste de branches ou à une version/branche unique.
     38        if (strpos($version, ',') === false) {
     39                // Le critère concerne une version ou une branche unique.
     40                if (count(explode('.', $version)) == 3) {
     41                        // le critere s'applique a une version x.y.z (1.9.2, 2.0.8, ...)
     42                        $min = 'SUBSTRING_INDEX(' . $table . '.compatibilite_spip, \';\', 1)';
     43                        $max = 'SUBSTRING_INDEX(' . $table . '.compatibilite_spip, \';\', -1)';
     44
     45                        $where = 'CASE WHEN ' . $min . ' = \'\'
     46                                OR ' . $min . ' = \'[\'
     47                                THEN \'1.9.0\' <= \'' . $version . '\'
     48                                ELSE TRIM(LEADING \'[\' FROM ' . $min . ') <= \'' . $version . '\'
     49                                END
     50                                AND
     51                                CASE WHEN ' . $max . ' = \'\'
     52                                OR ' . $max . ' = \']\'
     53                                THEN \'99.99.99\' >= \'' . $version . '\'
     54                                WHEN ' . $max . ' = \')\'
     55                                OR ' . $max . ' = \'[\'
     56                                THEN \'99.99.99\' > \'' . $version . '\'
     57                                WHEN RIGHT(' . $max . ', 1) = \')\'
     58                                OR RIGHT(' . $max . ', 1) = \'[\'
     59                                THEN LEFT(' . $max . ', LENGTH(' . $max . ') - 1) > \'' . $version . '\'
     60                                ELSE LEFT(' . $max . ', LENGTH(' . $max . ') - 1) >= \'' . $version . '\'
     61                                END';
     62                } elseif (count(explode('.', $version)) == 2) {
     63                        // le critere s'applique a une branche x.y unique (par exemple 1.9)
     64                        $where = 'LOCATE(\'' . $version . '\', ' . $table . '.branches_spip) ' . $op . ' 0';
     65                }
     66        } else {
     67                // Le critère concerne forcément une liste de branches (la liste n'est pas disponible pour une version).
     68                $branches = explode(',', $version);
     69                $where_liste = '';
     70                foreach ($branches as $_branche) {
     71                        // On vérifie qu'on est bien en présence d'une branche.
     72                        if (count(explode('.', $_branche)) == 2) {
     73                                $where_liste .= ($where_liste ? ' AND ' : '') . 'LOCATE(\'' . $_branche . '\', ' . $table . '.branches_spip) ' . $op . ' 0';
     74                        }
     75                }
     76               
     77                // Si non vide, on renvoie le where calculé.
     78                if ($where_liste) {
     79                        $where = $where_liste;
     80                }
    6381        }
    64 
     82       
    6583        return $where;
    6684}
  • _core_/branches/spip-3.2/plugins/svp/svp_fonctions.php

    r104601 r114612  
    708708
    709709/**
    710  * Critère de compatibilité avec une version précise ou une branche de SPIP.
    711  *
    712  * Fonctionne sur les tables spip_paquets et spip_plugins
    713  *
    714  * Si aucune valeur n'est explicité dans le critère, tous les enregistrements
    715  * sont retournés.
    716  *
    717  * Le ! (NOT) fonctionne sur le critère BRANCHE
     710 * Critère de compatibilité avec une version précise ou une branche de SPIP ou une liste de branches séparées par
     711 * une virgule.
     712 *
     713 * Fonctionne sur les tables spip_paquets et spip_plugins.
     714 * Si aucune valeur n'est explicité dans le critère on interroge le contexte pour trouver une variable
     715 * compatible_spip et sinon tous les objets sont retournés.
     716 *
     717 * Le ! (NOT) ne fonctionne que sur une branche ou une liste de branches SPIP.
    718718 *
    719719 * @critere
     
    723723 *   {compatible_spip #ENV{vers}} ou {compatible_spip #ENV{vers, 1.9.2}}
    724724 *   {compatible_spip #GET{vers}} ou {compatible_spip #GET{vers, 2.1}}
     725 *   {compatible_spip '2.0,2.1'}
     726 *   {!compatible_spip 2.0}
     727 *   {!compatible_spip '2.0,2.1'}
     728 *   {!compatible_spip #ENV{vers}} ou {!compatible_spip #GET{vers}}
    725729 *
    726730 * @param string $idb Identifiant de la boucle
    727731 * @param array $boucles AST du squelette
    728732 * @param Critere $crit Paramètres du critère dans cette boucle
     733 *
    729734 * @return void
    730735 */
    731736function critere_compatible_spip_dist($idb, &$boucles, $crit) {
    732737
     738        // Initialisation de la table (spip_plugins ou spip_paquets)
    733739        $boucle = &$boucles[$idb];
    734740        $table = $boucle->id_table;
    735741
    736         // Si on utilise ! la fonction LOCATE doit retourner 0.
    737         // -> utilise uniquement avec le critere BRANCHE
     742        // Initialisation du numéro de critère pour utiliser plusieurs fois le critère dans la même boucle
     743        static $i = 1;
     744
     745        // La fonction LOCATE retourne soit 0 (pas trouvée) soit une valeur strictement supérieure à 0 (trouvée).
     746        // Donc avec le modificateur not l'opérateur est un "=", sinon un ">".
     747        // Le NOT s'utilise uniquement avec une branche SPIP (ex 2.0).
    738748        $op = ($crit->not == '!') ? '=' : '>';
    739749
     750        // On calcule le code des critères.
     751        // -- Initialisation avec le chargement de la fonction de calcul du critère.
    740752        $boucle->hash .= '
    741753        // COMPATIBILITE SPIP
    742754        $creer_where = charger_fonction(\'where_compatible_spip\', \'inc\');';
    743755
    744         // version/branche explicite dans l'appel du critere
    745         if (isset($crit->param[0][0])) {
    746                 $version = calculer_liste(array($crit->param[0][0]), array(), $boucles, $boucle->id_parent);
    747                 $boucle->hash .= '
    748                 $where = $creer_where(' . $version . ', \'' . $table . '\', \'' . $op . '\');
    749                 ';
    750         }
    751         // pas de version/branche explicite dans l'appel du critere
    752         // on regarde si elle est dans le contexte
    753         else {
     756        // On traite le critère suivant que la version ou la branche est explicitement fournie ou pas.
     757        if (!empty($crit->param)) {
     758                // La ou les versions/branches sont explicites dans l'appel du critere.
     759                // - on boucle sur les paramètres sachant qu'il est possible de fournir une liste séparée par une virgule
     760                //   (ex 3.2,3.1)
     761                foreach ($crit->param as $_param) {
     762                        if (isset($_param[0])) {
     763                                $version = calculer_liste(array($_param[0]), array(), $boucles, $boucle->id_parent);
     764                                $boucle->hash .= '
     765                                $where' . $i . ' = $creer_where(' . $version . ', \'' . $table . '\', \'' . $op . '\');
     766                                ';
     767                                $boucle->where[] = '$where' . $i;
     768                                $i++;
     769                        }
     770                }
     771        } else {
     772                // Pas de version ou de branche explicite dans l'appel du critere.
     773                // - on regarde si elle est dans le contexte
    754774                $boucle->hash .= '
    755775                $version = isset($Pile[0][\'compatible_spip\']) ? $Pile[0][\'compatible_spip\'] : \'\';
    756                 $where = $creer_where($version, \'' . $table . '\', \'' . $op . '\');
     776                $where' . $i . ' = $creer_where($version, \'' . $table . '\', \'' . $op . '\');
    757777                ';
    758         }
    759 
    760         $boucle->where[] = '$where';
     778                $boucle->where[] = '$where' . $i;
     779                $i++;
     780        }
    761781}
    762782
Note: See TracChangeset for help on using the changeset viewer.