Changeset 82917 in spip-zone


Ignore:
Timestamp:
Jun 9, 2014, 7:44:28 PM (5 years ago)
Author:
teddy.spip@…
Message:

On remonte la recherche des logos dans le foreach de la table. Autant attaquer directement dans cette boucle. Ça nous permet de retrouver les objets en BDD grâce au nom de la table, sa clé primaire, etc.

Location:
_plugins_/medias_nettoyage/trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/medias_nettoyage/trunk/medias_nettoyage_fonctions.php

    r82915 r82917  
    403403
    404404    include_spip('inc/chercher_logo');
     405    include_spip('base/abstract_sql');
    405406
    406407    if (intval(spip_version()) == 2) {
     
    425426    $docs_fichiers_on   = array();
    426427    $docs_fichiers_off  = array();
    427     // Avec l'utilisation de type_du_logo(), ceci n'est plus obligatoire
    428     // mais à garder par sécurité.
    429     $logos_objet        = array('art','rub','breve','site','mot','aut');
    430428    $fichiers           = array();
    431429
    432430    // On va chercher toutes les tables principales connues de SPIP
    433431    foreach ($tables_objets as $table) {
    434         // On cherche son type d'objet et on l'ajoute aux logos
     432        // On cherche son type d'objet.
    435433        // Il y a aussi dans ces objets la référence à `article`,
    436434        // `rubrique` et `auteur`
    437435        // Grâce à la fonction `id_table_objet()`, on retrouve le nom de la clé primaire de l'objet.
    438436        // `type_du_logo()` retourne le type de logo tel que `art` depuis le nom de la clé primaire de l'objet
    439         $logos_objet[] = type_du_logo(id_table_objet($table));
    440     }
    441     // On enlève les doublons
    442     $logos_objet = array_unique($logos_objet);
    443     sort($logos_objet);
     437        $type_du_logo = type_du_logo(id_table_objet($table));
     438
     439        // On va chercher dans IMG/$type_du_logo(on|off)*.*
     440        // On fait un foreach pour ne pas avoir de
     441        // "Pattern exceeds the maximum allowed length of 260 characters"
     442        // sur glob()
     443        $liste = glob($repertoire_img . "{" . $type_du_logo ."}{on,off}*.*", GLOB_BRACE);
     444        if (is_array($liste) and count($liste) > 0) {
     445            $fichiers = array_merge($fichiers, $liste);
     446        }
     447        // Il faut avoir au moins un élément dans le tableau de fichiers.
     448        if (is_array($fichiers) and count($fichiers) > 0) {
     449            foreach ($fichiers as $fichier) {
     450                // ... Donc on fait une regex plus poussée avec un preg_match
     451                if (
     452                    preg_match(
     453                        "/("
     454                        . $type_du_logo
     455                        .")on(\d+).("
     456                        . join("|", $formats_logos)
     457                        .")$/",
     458                        $fichier,
     459                        $r
     460                    )
     461                ) {
     462                    // On fait une requête sql pour savoir si ce logo a toujours un objet référencé en bdd.
     463                    $requete = sql_fetsel('*', $table, id_table_objet($table) . "=" . $r[2]);
     464                    if ($requete) {
     465                        $docs_fichiers_on[] = preg_replace("/\/\//", "/", $fichier);
     466                    }
     467                }
     468                if (
     469                    preg_match(
     470                        "/("
     471                        . $type_du_logo
     472                        .")off(\d+).("
     473                        . join("|", $formats_logos)
     474                        .")$/",
     475                        $fichier,
     476                        $r
     477                    )
     478                ) {
     479                    $requete = sql_fetsel('*', $table, id_table_objet($table) . "=" . $r[2]);
     480                    if ($requete) {
     481                        $docs_fichiers_off[] = preg_replace("/\/\//", "/", $fichier);
     482                    }
     483                }
     484            }
     485        }
     486    }
    444487
    445488    // On va chercher le logo du site.
     
    447490    // devrait gérer cela initialement…
    448491    $logo_site = glob($repertoire_img . "site{on|off}0.*", GLOB_BRACE);
    449     // On évite d'utiliser la fonction `glob()` directement dans le if car ça peut créer un bug pour PHP <5.4
     492    // On évite d'utiliser la fonction `glob()` directement dans le `if` car ça peut créer un bug pour PHP <5.4
    450493    // S'il n'y a pas de siteon0.ext, `glob()` va retourner un `false`. Donc, on regarde si c'est bien un tableau.
    451494    // cf. http://contrib.spip.net/Nettoyer-la-mediatheque#forum475712
    452495    if (is_array($logo_site) and count($logo_site) > 0) {
    453         $fichiers = array_merge($fichiers, $logo_site);
    454     }
    455 
    456     // On va chercher dans IMG/*(on|off)*.*
    457     // On fait un foreach pour ne pas avoir de
    458     // "Pattern exceeds the maximum allowed length of 260 characters"
    459     // sur glob()
    460     foreach ($logos_objet as $logo_pattern) {
    461         // la regex de GLOB_BRACE est très basique...
    462         $liste = glob($repertoire_img . "{" . $logo_pattern ."}{on,off}*.*", GLOB_BRACE);
    463         if (is_array($liste) and count($liste) > 0) {
    464             $fichiers = array_merge($fichiers, $liste);
    465         }
    466     }
    467 
    468     // Il faut avoir au moins un élément dans le tableau de fichiers.
    469     if (is_array($fichiers) and count($fichiers) > 0) {
    470         foreach ($fichiers as $fichier) {
    471             // ... Donc on fait une regex plus poussée avec un preg_match
    472             if (
    473                 preg_match(
    474                     "/("
    475                     . join("|", $logos_objet)
    476                     .")on(\d+).("
    477                     . join("|", $formats_logos)
    478                     .")$/",
    479                     $fichier,
    480                     $resultat
    481                 )
    482             ) {
    483                 $docs_fichiers_on[] = preg_replace("/\/\//", "/", $fichier);
    484             }
    485             if (
    486                 preg_match(
    487                     "/("
    488                     . join("|", $logos_objet)
    489                     .")off(\d+).("
    490                     . join("|", $formats_logos)
    491                     .")$/",
    492                     $fichier
    493                 )
    494             ) {
    495                 $docs_fichiers_off[] = preg_replace("/\/\//", "/", $fichier);
    496             }
    497         }
    498     }
     496        if (
     497            preg_match(
     498                "/siteon0.("
     499                . join("|", $formats_logos)
     500                .")$/",
     501                $fichier
     502            )
     503        ) {
     504            $docs_fichiers_on[] = preg_replace("/\/\//", "/", $fichier);
     505        }
     506        if (
     507            preg_match(
     508                "/siteoff0.("
     509                . join("|", $formats_logos)
     510                .")$/",
     511                $fichier
     512            )
     513        ) {
     514            $docs_fichiers_off[] = preg_replace("/\/\//", "/", $fichier);
     515        }
     516    }
     517
     518
    499519    if ($mode == 'on') {
    500520        $docs_fichiers_on = array_unique($docs_fichiers_on);
     
    510530        return $docs_fichiers;
    511531    }
    512 
    513532}
    514533
     
    530549{
    531550    return medias_calculer_taille_fichiers(medias_lister_logos_fichiers($mode));
    532 }
    533 
    534 /**
    535  * Vérifier si l'objet associé au logo passé en paramètre est toujours
    536  * enresgitré en base de données.
    537  *
    538  * @param  string $fichier
    539  *         nom du fichier de logo
    540  * @return bool
    541  *         - `true` : si l'objet est toujours en bdd ;
    542  *         - `false` : si l'objet n'est plus en bdd.
    543  */
    544 function medias_verifier_logos_objet ($fichier = 'on')
    545 {
    546     if ($fichier == null) {
    547         return;
    548     }
    549     $composer = charger_fonction('composer', 'public');
    550     $chercher_logo = charger_fonction('chercher_logo', 'inc');
    551551}
    552552
  • _plugins_/medias_nettoyage/trunk/paquet.xml

    r82915 r82917  
    22        prefix="medias_nettoyage"
    33        categorie="outil"
    4         version="0.9.6"
     4        version="0.9.7"
    55        etat="stable"
    66        compatibilite="[2.1.0;3.0.*]"
  • _plugins_/medias_nettoyage/trunk/plugin.xml

    r82915 r82917  
    55        <icon>prive/themes/spip/images/medias_nettoyage-64.png</icon>
    66        <prefix>medias_nettoyage</prefix>
    7         <version>0.9.6</version>
     7        <version>0.9.7</version>
    88        <etat>stable</etat>
    99        <categorie>outil</categorie>
Note: See TracChangeset for help on using the changeset viewer.