Changeset 114572 in spip-zone


Ignore:
Timestamp:
Mar 19, 2019, 8:27:32 PM (5 weeks ago)
Author:
eric@…
Message:

Amélioration du critère compatible_spip qui permet maintenant de multiplier les critères dans une boucle et d'utiliser une liste de branches (ex : {compatible_spip '2.0,2.1'})

Location:
_core_/plugins/svp
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • _core_/plugins/svp/inc/where_compatible_spip.php

    r93656 r114572  
    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_/plugins/svp/svp_fonctions.php

    r114548 r114572  
    711711
    712712/**
    713  * Critère de compatibilité avec une version précise ou une branche de SPIP.
    714  *
    715  * Fonctionne sur les tables spip_paquets et spip_plugins
    716  *
    717  * Si aucune valeur n'est explicité dans le critère, tous les enregistrements
    718  * sont retournés.
    719  *
    720  * Le ! (NOT) fonctionne sur le critère BRANCHE
     713 * Critère de compatibilité avec une version précise ou une branche de SPIP ou une liste de branches séparées par
     714 * une virgule.
     715 *
     716 * Fonctionne sur les tables spip_paquets et spip_plugins.
     717 * Si aucune valeur n'est explicité dans le critère on interroge le contexte pour trouver une variable
     718 * compatible_spip et sinon tous les objets sont retournés.
     719 *
     720 * Le ! (NOT) ne fonctionne que sur une branche ou une liste de branches SPIP.
    721721 *
    722722 * @critere
     
    726726 *   {compatible_spip #ENV{vers}} ou {compatible_spip #ENV{vers, 1.9.2}}
    727727 *   {compatible_spip #GET{vers}} ou {compatible_spip #GET{vers, 2.1}}
     728 *   {compatible_spip '2.0,2.1'}
     729 *   {!compatible_spip 2.0}
     730 *   {!compatible_spip '2.0,2.1'}
     731 *   {!compatible_spip #ENV{vers}} ou {!compatible_spip #GET{vers}}
    728732 *
    729733 * @param string $idb Identifiant de la boucle
    730734 * @param array $boucles AST du squelette
    731735 * @param Critere $crit Paramètres du critère dans cette boucle
     736 *
    732737 * @return void
    733738 */
    734739function critere_compatible_spip_dist($idb, &$boucles, $crit) {
    735740
     741        // Initialisation de la table (spip_plugins ou spip_paquets)
    736742        $boucle = &$boucles[$idb];
    737743        $table = $boucle->id_table;
    738744
    739         // Si on utilise ! la fonction LOCATE doit retourner 0.
    740         // -> utilise uniquement avec le critere BRANCHE
     745        // Initialisation du numéro de critère pour utiliser plusieurs fois le critère dans la même boucle
     746        static $i = 1;
     747
     748        // La fonction LOCATE retourne soit 0 (pas trouvée) soit une valeur strictement supérieure à 0 (trouvée).
     749        // Donc avec le modificateur not l'opérateur est un "=", sinon un ">".
     750        // Le NOT s'utilise uniquement avec une branche SPIP (ex 2.0).
    741751        $op = ($crit->not == '!') ? '=' : '>';
    742752
     753        // On calcule le code des critères.
     754        // -- Initialisation avec le chargement de la fonction de calcul du critère.
    743755        $boucle->hash .= '
    744756        // COMPATIBILITE SPIP
    745757        $creer_where = charger_fonction(\'where_compatible_spip\', \'inc\');';
    746758
    747         // version/branche explicite dans l'appel du critere
    748         if (isset($crit->param[0][0])) {
    749                 $version = calculer_liste(array($crit->param[0][0]), array(), $boucles, $boucle->id_parent);
    750                 $boucle->hash .= '
    751                 $where = $creer_where(' . $version . ', \'' . $table . '\', \'' . $op . '\');
    752                 ';
    753         }
    754         // pas de version/branche explicite dans l'appel du critere
    755         // on regarde si elle est dans le contexte
    756         else {
     759        // On traite le critère suivant que la version ou la branche est explicitement fournie ou pas.
     760        if (!empty($crit->param)) {
     761                // La ou les versions/branches sont explicites dans l'appel du critere.
     762                // - on boucle sur les paramètres sachant qu'il est possible de fournir une liste séparée par une virgule
     763                //   (ex 3.2,3.1)
     764                foreach ($crit->param as $_param) {
     765                        if (isset($_param[0])) {
     766                                $version = calculer_liste(array($_param[0]), array(), $boucles, $boucle->id_parent);
     767                                $boucle->hash .= '
     768                                $where' . $i . ' = $creer_where(' . $version . ', \'' . $table . '\', \'' . $op . '\');
     769                                ';
     770                                $boucle->where[] = '$where' . $i;
     771                                $i++;
     772                        }
     773                }
     774        } else {
     775                // Pas de version ou de branche explicite dans l'appel du critere.
     776                // - on regarde si elle est dans le contexte
    757777                $boucle->hash .= '
    758778                $version = isset($Pile[0][\'compatible_spip\']) ? $Pile[0][\'compatible_spip\'] : \'\';
    759                 $where = $creer_where($version, \'' . $table . '\', \'' . $op . '\');
     779                $where' . $i . ' = $creer_where($version, \'' . $table . '\', \'' . $op . '\');
    760780                ';
    761         }
    762 
    763         $boucle->where[] = '$where';
     781                $boucle->where[] = '$where' . $i;
     782                $i++;
     783        }
    764784}
    765785
Note: See TracChangeset for help on using the changeset viewer.