source: spip-zone/_plugins_/medias_nettoyage/trunk/medias_nettoyage_fonctions.php @ 82705

Last change on this file since 82705 was 82705, checked in by teddy.spip@…, 7 years ago

On met un glob() particulier pour retrouver les logos du site SPIP. (pierretux)

  • Property svn:executable set to *
File size: 28.2 KB
Line 
1<?php
2/**
3 * Fonctions principales du plugin "Nettoyer la médiathèque"
4 *
5 * @plugin     Nettoyer la médiathèque
6 * @copyright  2014
7 * @author     Teddy Payet
8 * @licence    GNU/GPL
9 * @package    SPIP\Medias_nettoyage\Fonctions
10 */
11
12if (!defined('_ECRIRE_INC_VERSION')) {
13    return;
14}
15include_spip('base/abstract_sql');
16include_spip('inc/documents');
17include_spip('inc/chercher_logo');
18
19/**
20 * Lister les extensions enregistrées dans la table spip_documents.
21 *
22 * @return array
23 *         Tableau des extensions uniques
24 */
25function medias_lister_extensions_documents ()
26{
27    $extensions = array();
28    $extensions_cibles = sql_allfetsel('DISTINCT extension', 'spip_documents');
29    foreach ($extensions_cibles as $extension) {
30        $extensions[] = $extension['extension'];
31    }
32    // On rajoute le répertoire "vignettes"
33    $extensions[] = 'vignettes';
34    return $extensions ;
35}
36
37/**
38 * Créer les répertoires des extensions des documents enregistrés en BDD.
39 *
40 * @uses medias_lister_extensions_documents()
41 * @uses _DIR_IMG
42 *
43 * @param  string $repertoire_img
44 *         Par défaut, on prend _DIR_IMG en référence.
45 *         On peut l'utiliser aussi pour le répertoire IMG/orphelins
46 * @return void
47 */
48function medias_creer_extensions_repertoires ($repertoire_img = _DIR_IMG)
49{
50    $extensions = medias_lister_extensions_documents();
51
52    foreach ($extensions as $extension) {
53        if (!is_dir($repertoire_img . $extension)) {
54            @mkdir($repertoire_img . $extension, _SPIP_CHMOD);
55        }
56    }
57    return;
58}
59
60/**
61 * Créer le répertoire "IMG/orphelins".
62 * Plus pratique d'avoir une fonction qu'on appellera en cas de besoin.
63 *
64 * @uses _MEDIAS_NETTOYAGE_REP_ORPHELINS
65 *
66 * @return void
67 */
68function medias_creer_repertoires_orphelins ()
69{
70    if (!is_dir(_MEDIAS_NETTOYAGE_REP_ORPHELINS)) {
71        @mkdir(_MEDIAS_NETTOYAGE_REP_ORPHELINS, _SPIP_CHMOD);
72    }
73    return;
74}
75
76/**
77 * Lister les répertoires présents dans IMG/ sans les sous-répertoires.
78 *
79 * @param  string $repertoire_img
80 *         Par défaut, on prend _DIR_IMG en référence.
81 *         On peut l'utiliser aussi pour le répertoire IMG/orphelins ou tout autre nom de répertoire.
82 * @return array
83 */
84function medias_lister_repertoires ($repertoire_img = _DIR_IMG)
85{
86    $repertoires = array();
87    // On vérifie que $repertoire_img passé en paramètre est bien un répertoire existant.
88    // cf. ../IMG/orphelins qui ne serait pas encore créé.
89    if (is_dir($repertoire_img)) {
90        $rep_img = array_diff(scandir($repertoire_img), array('..','.','.svn')); // On ne liste pas le répertoire .svn
91        foreach ($rep_img as $repertoire) {
92            if (is_dir($repertoire_img . $repertoire)) {
93                $repertoires[] = $repertoire_img . $repertoire;
94            }
95        }
96    }
97
98    return (array) $repertoires;
99}
100
101/**
102 * Lister tous les fichiers non distants enregistrés en BDD
103 *
104 * @uses get_spip_doc()
105 *
106 * @return array
107 *         Tableau contenant les urls des fichiers
108 */
109function medias_lister_documents_bdd ()
110{
111    $docs_fichiers = array();
112
113    $docs_bdd = sql_allfetsel('fichier', 'spip_documents', "distant='non' AND fichier!=''");
114    foreach ($docs_bdd as $doc) {
115        /**
116         * On formate par rapport au répertoire ../IMG/
117         * On évite les doubles // qu'il peut y avoir
118         */
119        $docs_fichiers[] = preg_replace("/\/\//", "/", get_spip_doc($doc['fichier']));
120    }
121    // on enlève les url vides issues de la base :
122    $docs_fichiers = array_filter($docs_fichiers);
123
124    // On trie dans l'ordre alphabétique :
125    sort($docs_fichiers);
126
127    return (array) $docs_fichiers;
128}
129
130/**
131 * Donner la taille en octets des documents non-distants enregistrés en BDD
132 *
133 * @return integer
134 */
135function medias_lister_documents_bdd_taille()
136{
137    $docs_bdd = sql_fetsel('SUM(taille) AS taille_totale', 'spip_documents', "distant='non' AND fichier!=''");
138    return $docs_bdd['taille_totale'];
139}
140
141/**
142 * Afficher le nombre de documents enregistrés en BDD
143 *
144 * @return integer|string
145 */
146function medias_lister_documents_bdd_complet_compteur ()
147{
148    return sql_countsel('spip_documents');
149}
150
151/**
152 * Donner la taille en octets de tous les documents enregistrés en BDD
153 *
154 * @return integer|string
155 */
156function medias_lister_documents_bdd_complet_taille()
157{
158    $docs_bdd = sql_fetsel('SUM(taille) AS taille_totale', 'spip_documents', "id_document > 0");
159    return $docs_bdd['taille_totale'];
160}
161
162/**
163 * Lister les documents enregistrés en BDD
164 * mais n'ayant plus de fichiers physiques dans IMG/
165 *
166 * @uses medias_lister_documents_bdd()
167 * @uses medias_lister_documents_repertoire()
168 *
169 * @return array
170 */
171function medias_lister_documents_bdd_orphelins()
172{
173    $docs_bdd = array_unique(array_diff(medias_lister_documents_bdd(), medias_lister_documents_repertoire()));
174    sort($docs_bdd);
175    return (array) $docs_bdd;
176}
177
178/**
179 * Donner la taille en octets des documents enregistrés en BDD
180 *
181 * @uses medias_lister_documents_bdd_orphelins()
182 * @uses _DIR_IMG
183 * @uses get_spip_doc()
184 *
185 * @return integer
186 */
187function medias_lister_documents_bdd_orphelins_taille()
188{
189    $documents_orphelins    = medias_lister_documents_bdd_orphelins();
190    $taille         = 0;
191    $pattern_img        = "/" . preg_replace("/\//", "\/", _DIR_IMG) . "/";
192
193    if (count($documents_orphelins) > 0) {
194        $documents_bdd = sql_allfetsel(
195            'fichier,taille',
196            'spip_documents',
197            "fichier IN ('"
198            . join("','", preg_replace($pattern_img, '', $documents_orphelins)) . "')"
199        );
200        foreach ($documents_bdd as $document_bdd) {
201            if (!file_exists(get_spip_doc($document_bdd['fichier']))) {
202                $taille = $taille + ($document_bdd['taille']/1000);
203                // On divise par 1000 pour éviter la limite de l'integer php.
204            }
205        }
206    }
207    return $taille * 1000;
208}
209
210/**
211 * Lister les documents présents dans le répertoire des extensions de IMG/
212 *
213 * @uses medias_lister_extensions_documents()
214 * @uses medias_lister_logos_fichiers()
215 *
216 * @param string $repertoire_img
217 *        On peut passer un nom de répertoire/chemin en paramètre.
218 *        Par défaut, on prend le répertoire IMG/
219 * @return array
220 */
221function medias_lister_documents_repertoire ($repertoire_img = _DIR_IMG)
222{
223    $docs_fichiers = array();
224
225    foreach (medias_lister_extensions_documents() as $extension) {
226        // On va chercher dans IMG/$extension/*.*
227        $fichiers = glob($repertoire_img . "$extension/*.*");
228        foreach ($fichiers as $fichier) {
229            $docs_fichiers[] = preg_replace("/\/\//", "/", $fichier);
230        }
231    }
232    // On va chercher dans IMG/*.*
233    $fichiers = glob($repertoire_img . "*.*");
234    foreach ($fichiers as $fichier) {
235        $docs_fichiers[] = $fichier;
236    }
237    $docs_fichiers = array_unique(
238        array_diff(
239            $docs_fichiers,
240            medias_lister_logos_fichiers()
241        )
242    );
243    sort($docs_fichiers);
244
245    return (array) $docs_fichiers;
246}
247
248/**
249 * Retourner la taille en octets des fichiers physiques présents
250 * dans les répertoires d'extensions de IMG
251 *
252 * @uses medias_lister_documents_repertoire()
253 * @uses medias_calculer_taille_fichiers()
254 *
255 * @return integer
256 */
257function medias_lister_documents_repertoire_taille ()
258{
259    return medias_calculer_taille_fichiers(medias_lister_documents_repertoire());
260}
261
262/**
263 * Lister les fichiers physiques présents dans IMG/ mais qui ne sont plus dans la BDD.
264 *
265 * @uses medias_lister_documents_repertoire()
266 * @uses medias_lister_documents_bdd()
267 *
268 * @return array
269 */
270function medias_lister_documents_repertoire_orphelins ()
271{
272    $docs_fichiers = array_unique(array_diff(medias_lister_documents_repertoire(), medias_lister_documents_bdd()));
273    sort($docs_fichiers);
274    return (array) $docs_fichiers;
275}
276
277/**
278 * Retourner la taille en octets des fichiers physiques orphelins
279 * présents dans les répertoires d'extensions de IMG
280 *
281 * @uses medias_lister_documents_repertoire_orphelins()
282 * @uses medias_calculer_taille_fichiers()
283 *
284 * @return integer
285 */
286function medias_lister_documents_repertoire_orphelins_taille ()
287{
288    return medias_calculer_taille_fichiers(medias_lister_documents_repertoire_orphelins());
289}
290
291/**
292 * Lister tous les fichiers contenus dans le répertoire IMG/
293 * y compris les logos.
294 *
295 * @param string $repertoire_img
296 *        On peut passer un nom de répertoire/chemin en paramètre.
297 *        Par défaut, on prend le répertoire IMG/
298 * @return array
299 */
300function medias_lister_documents_repertoire_complet ($repertoire_img = _DIR_IMG)
301{
302    $docs_fichiers = array();
303
304    // On va chercher dans IMG/distant/*/*.*
305        // Exemple : IMG/distant/jpg/nom_fichier.jpg
306    $fichiers = glob($repertoire_img . "*/*/*.*");
307    foreach ($fichiers as $fichier) {
308        $docs_fichiers[] = preg_replace("/\/\//", "/", $fichier);
309        // On évite les doubles slashs '//' qui pourrait arriver comme un cheveu sur la soupe.
310    }
311
312    // On va chercher dans IMG/*/*.*
313        // Exemple : IMG/pdf/nom_fichier.pdf
314    $fichiers = glob($repertoire_img . "*/*.*");
315    foreach ($fichiers as $fichier) {
316        $docs_fichiers[] = preg_replace("/\/\//", "/", $fichier);
317    }
318
319    // On va chercher dans IMG/*.*
320        // Exemple : IMG/arton4.png
321    $fichiers = glob($repertoire_img . "*.*");
322    foreach ($fichiers as $fichier) {
323        $docs_fichiers[] = preg_replace("/\/\//", "/", $fichier);
324    }
325
326    $docs_fichiers = array_unique($docs_fichiers);
327    sort($docs_fichiers);
328
329    return (array) $docs_fichiers;
330}
331
332/**
333 * Retourner la taille en octets des fichiers physiques présents
334 * dans IMG/
335 *
336 * @uses medias_lister_documents_repertoire_complet()
337 * @uses medias_calculer_taille_fichiers()
338 *
339 * @param string $repertoire_img
340 *        On peut passer un nom de répertoire/chemin en paramètre.
341 *        Par défaut, on prend le répertoire IMG/
342 * @return integer
343 */
344function medias_lister_documents_repertoire_complet_taille ($repertoire_img = _DIR_IMG)
345{
346    return medias_calculer_taille_fichiers(medias_lister_documents_repertoire_complet($repertoire_img));
347}
348
349/**
350 * Lister les logos des objets éditoriaux
351 * Prend en compte les cas particuliers suivants :
352 * - articles (art)
353 * - rubriques (rub)
354 * - brèves (breve)
355 * - sites syndiqués (site)
356 * - mot-clé (mot)
357 * - auteurs (aut)
358 *
359 * @todo étendre à d'autres objets éditoriaux.
360 *
361 * @param null|string $mode
362 *        + `null` : stockera dans le tableau tous les logos,
363 *        quelque soit le mode du logo
364 *        + `on` : stockera dans le tableau tous les logos du mode "on"
365 *        + `off` : stockera dans le tableau tous les logos du mode "off"
366 * @param string $repertoire_img
367 *        On peut passer un nom de répertoire/chemin en paramètre.
368 *        Par défaut, on prend le répertoire IMG/
369 * @return array
370 */
371function medias_lister_logos_fichiers ($mode = null, $repertoire_img = _DIR_IMG)
372{
373
374    if (intval(spip_version()) == 2) {
375        include_spip('base/connect_sql');
376        $tables_objets = (isset($GLOBALS['tables_principales']))
377        ? $GLOBALS['tables_principales']
378        : array('spip_articles',
379            'spip_rubriques',
380            'spip_auteurs',
381            'spip_breves',
382            'spip_documents',
383            'spip_syndic',
384            'spip_mots',
385            'spip_forum',
386            'spip_groupes_mots');
387    } elseif (intval(spip_version()) == 3) {
388        include_spip('base/objets');
389        $tables_objets = array_keys(lister_tables_principales());
390    }
391
392    global $formats_logos;
393    $docs_fichiers_on   = array();
394    $docs_fichiers_off  = array();
395    $logos_objet        = array('art','rub','breve','site','mot','aut');
396    $fichiers           = array();
397
398    // On va chercher toutes les tables principales connues de SPIP
399    foreach ($tables_objets as $table) {
400        // On cherche son type d'objet et on l'ajoute aux logos
401        // Il y a aussi dans ces objets la référence à 'article',
402        // 'rubrique' et 'auteur'
403        // On peut les laisser, ça ne mange pas de pain de prendre
404        // en compte les "tordus" ;-)
405        $logos_objet[] = objet_type($table);
406    }
407    // On enlève les doublons
408    $logos_objet = array_unique($logos_objet);
409    sort($logos_objet);
410
411    // On va chercher le logo du site.
412    // On force la recherche sur cet élément même si la recherche "classique"
413    // devrait gérer cela initialement…
414    if ($logo_site = glob($repertoire_img . "site{on|off}0.*", GLOB_BRACE)
415        and count($logo_site) > 0) {
416        $fichiers = array_merge($fichiers, $logo_site);
417    }
418
419    // On va chercher dans IMG/*(on|off)*.*
420    // On fait un foreach pour ne pas avoir de
421    // "Pattern exceeds the maximum allowed length of 260 characters"
422    // sur glob()
423    foreach ($logos_objet as $logo_pattern) {
424        // la regex de GLOB_BRACE est très basique...
425        $liste = glob($repertoire_img . "{" . $logo_pattern ."}{on,off}*.*", GLOB_BRACE);
426        $fichiers = array_merge($fichiers, $liste);
427    }
428
429    foreach ($fichiers as $fichier) {
430        // ... Donc on fait une regex plus poussée avec un preg_match
431        if (preg_match("/(" . join("|", $logos_objet) .")on\d+.(" . join("|", $formats_logos) .")$/", $fichier)) {
432            $docs_fichiers_on[] = preg_replace("/\/\//", "/", $fichier);
433        }
434        if (preg_match("/(" . join("|", $logos_objet) .")off\d+.(" . join("|", $formats_logos) .")$/", $fichier)) {
435            $docs_fichiers_off[] = preg_replace("/\/\//", "/", $fichier);
436        }
437    }
438    if ($mode == 'on') {
439        $docs_fichiers_on = array_unique($docs_fichiers_on);
440        sort($docs_fichiers_on); // On trie dans l'ordre alphabétique
441        return $docs_fichiers_on;
442    } elseif ($mode == 'off') {
443        $docs_fichiers_off = array_unique($docs_fichiers_off);
444        sort($docs_fichiers_off); // On trie dans l'ordre alphabétique
445        return $docs_fichiers_off;
446    } else {
447        $docs_fichiers = array_unique(array_merge($docs_fichiers_on, $docs_fichiers_off));
448        sort($docs_fichiers); // On trie dans l'ordre alphabétique
449        return $docs_fichiers;
450    }
451
452}
453
454/**
455 * Retourner la taille en octets des logos présents
456 * dans IMG/
457 *
458 * @uses medias_lister_logos_fichiers()
459 * @uses medias_calculer_taille_fichiers()
460 *
461 * @param null|string $mode
462 *        + `null` : calculera le poids de tous les logos,
463 *        quelque soit le mode du logo
464 *        + `on` : calculera le poids de tous les logos du mode "on"
465 *        + `off` : calculera le poids de tous les logos du mode "off"
466 * @return integer|string
467 */
468function medias_lister_logos_fichiers_taille ($mode = null)
469{
470    return medias_calculer_taille_fichiers(medias_lister_logos_fichiers($mode));
471}
472
473/**
474 * Fonction générique pour calculer la taille des fichiers passés en paramètre
475 *
476 * @param  array  $fichiers
477 *         Tableau contenant l'url des fichiers physiques
478 * @return integer
479 *         On multiplie par 1000 la variable $taille pour avoir le chiffre réel
480 *         C'est un hack pour contourner la limite d'integer (4 bytes => 0xefffffff).
481 *         Au dessus de 4026531839, il passe à float négatif.
482 *         // a vérifier tout de même selon l'OS 32bit ou 64bit.
483 */
484function medias_calculer_taille_fichiers ($fichiers = array())
485{
486    $taille = 0;
487    if (count($fichiers) > 0) {
488        foreach ($fichiers as $fichier) {
489            if (file_exists($fichier)) {
490                $taille += filesize($fichier) /1000;
491            }
492        }
493        if (is_float($taille) or $taille > 0) {
494            return $taille *1000;
495        } else {
496            return $taille;
497        }
498    } else {
499        return $taille;
500    }
501}
502
503/**
504 * Lister les répertoires à la racine de IMG/orphelins.
505 * Cette fonction vérifie l'existence du répertoire IMG/orphelins
506 * avant de lister les répertoires.
507 *
508 * @uses medias_lister_repertoires()
509 * @uses _MEDIAS_NETTOYAGE_REP_ORPHELINS
510 *
511 * @return array
512 */
513function medias_lister_repertoires_orphelins ()
514{
515    if (is_dir(_MEDIAS_NETTOYAGE_REP_ORPHELINS)) {
516        return medias_lister_repertoires(_MEDIAS_NETTOYAGE_REP_ORPHELINS);
517    } else {
518        return array();
519    }
520}
521
522/**
523 * Lister le contenu du répertoire IMG/orphelins
524 *
525 * @uses medias_lister_documents_repertoire_complet()
526 * @uses _MEDIAS_NETTOYAGE_REP_ORPHELINS
527 *
528 * @return array
529 */
530function medias_lister_repertoires_orphelins_fichiers ()
531{
532    $repertoire_orphelins   = _MEDIAS_NETTOYAGE_REP_ORPHELINS;
533    $docs_fichiers      = array();
534
535    if (is_dir($repertoire_orphelins)) {
536        $docs_fichiers = medias_lister_documents_repertoire_complet($repertoire_orphelins);
537    }
538    return (array) $docs_fichiers;
539}
540
541/**
542 * Lister le contenu du répertoire IMG/orphelins
543 *
544 * @uses medias_calculer_taille_fichiers()
545 * @uses medias_lister_documents_repertoire_complet()
546 * @uses _MEDIAS_NETTOYAGE_REP_ORPHELINS
547 *
548 * @return integer
549 */
550function medias_lister_repertoires_orphelins_fichiers_taille ()
551{
552    $repertoire_orphelins   = _MEDIAS_NETTOYAGE_REP_ORPHELINS;
553    $taille         = 0;
554
555    if (is_dir($repertoire_orphelins)) {
556        return medias_calculer_taille_fichiers(medias_lister_documents_repertoire_complet($repertoire_orphelins));
557    } else {
558        return intval($taille);
559    }
560}
561
562/**
563 * Fonction 'bidon' pour tester une fonction rapidement sur la page ?exec=test_medias
564 *
565 * @return array
566 */
567function test_medias ()
568{
569    $test = array();
570    $test = @unserialize($GLOBALS['meta']['medias_nettoyage']);
571    return $test;
572}
573
574/**
575 * Déplacer tous les répertoires de types 'cache-*' et 'icones*'
576 * SPIP normalement, avec la page "réparer la base", devrait répérer ce type
577 * de dossier. Mais il peut arriver parfois qu'on récupère des sites qui
578 * pour X raisons n'ont pas été nettoyé de ces coquilles.
579 *
580 * @uses medias_creer_repertoires_orphelins()
581 * @uses _DIR_IMG
582 * @uses _MEDIAS_NETTOYAGE_REP_ORPHELINS
583 *
584 * @return void
585 */
586function medias_deplacer_rep_obsoletes ()
587{
588    spip_log(
589        date_format(date_create(), 'Y-m-d H:i:s')
590        . ' : Début de la procédure de déplacement des répertoires obsolètes.',
591        "medias_nettoyage"
592    );
593
594    $pattern_obsoletes  = array("cache-","icones");
595    $repertoire_img     = _DIR_IMG;
596    $repertoire_orphelins   = _MEDIAS_NETTOYAGE_REP_ORPHELINS;
597    $repertoires_obsoletes  = array();
598    $message_log        = array();
599    $pattern_img        = "/" . preg_replace("/\//", "\/", $repertoire_img) . "/";
600
601    // On crée le répertoire IMG/orphelins
602    medias_creer_repertoires_orphelins();
603
604    // on cherche les fichiers de type IMG/cache-20x20-blabla.ext
605    $fichiers_obsoletes = find_all_in_path('IMG/', '/cache-');
606
607    foreach ($pattern_obsoletes as $pattern) {
608        $repertoires = glob($repertoire_img . $pattern . "*");
609        $repertoires_obsoletes = array_merge($repertoires_obsoletes, $repertoires);
610    }
611    // on fusionne avec les fichiers obsolètes
612    $repertoires_obsoletes = array_merge($repertoires_obsoletes, $fichiers_obsoletes);
613
614    // on enlève les valeurs vides du tableau.
615    $repertoires_obsoletes = array_filter($repertoires_obsoletes);
616
617    if (count($repertoires_obsoletes) > 0) {
618        foreach ($repertoires_obsoletes as $repertoire_source) {
619            $repertoire_destination = preg_replace($pattern_img, $repertoire_orphelins, $repertoire_source);
620            @rename($repertoire_source, $repertoire_destination);
621            $message_log[] = date_format(date_create(), 'Y-m-d H:i:s')
622            . ' : Déplacement de '
623            . $repertoire_source
624            . ' vers '
625            . $repertoire_destination;
626        }
627    } else {
628        // S'il n'y a pas de dossiers obsolètes, on met un message histoire de ne pas rester dans le brouillard.
629        $message_log[] = date_format(date_create(), 'Y-m-d H:i:s')
630        . ' : Il n\'y a pas de dossiers ou de fichiers obsolètes';
631    }
632    spip_log(
633        "\n-------\n"
634        . join("\n", $message_log)
635        . "\n-------\n",
636        "medias_nettoyage"
637    );
638    spip_log(
639        date_format(date_create(), 'Y-m-d H:i:s')
640        . ' : Fin de la procédure de déplacement des répertoires obsolètes.',
641        "medias_nettoyage"
642    );
643    return;
644}
645
646/**
647 * On déplace tous les fichiers orphelins vers un répertoire orphelins dans IMG/
648 * On ne les supprime pas!
649 *
650 * @uses medias_creer_repertoires_orphelins()
651 * @uses medias_creer_extensions_repertoires()
652 * @uses medias_lister_documents_repertoire_orphelins()
653 * @uses _DIR_IMG
654 * @uses _MEDIAS_NETTOYAGE_REP_ORPHELINS
655 *
656 * @return array
657 */
658function medias_deplacer_documents_repertoire_orphelins ()
659{
660    /**
661     * On crée un log vraiment au début du script.
662     * Ainsi, on sait déjà en regardant les logs
663     * si le script est lancé ou pas.
664     */
665    spip_log(
666        date_format(date_create(), 'Y-m-d H:i:s')
667        . ' : Début de la procédure de déplacement.',
668        "medias_nettoyage"
669    );
670
671    $fichiers_orphelins     = medias_lister_documents_repertoire_orphelins();
672    $fichiers_deplaces  = array();
673    $message_log        = array();
674    $repertoire_orphelins   = _MEDIAS_NETTOYAGE_REP_ORPHELINS;
675    $pattern_img        = "/" . preg_replace("/\//", "\/", _DIR_IMG) . "/";
676
677    // On crée le répertoire IMG/orphelins s'il n'existe pas
678    medias_creer_repertoires_orphelins();
679    // On crée les répertoires d'extensions dans IMG/orphelins
680    medias_creer_extensions_repertoires($repertoire_orphelins);
681
682    // Si on n'a pas de fichiers orphelins, on ne lance pas la procédure.
683    if (count($fichiers_orphelins) > 0) {
684        foreach ($fichiers_orphelins as $fichier) {
685            $destination = preg_replace($pattern_img, $repertoire_orphelins, $fichier);
686            $chemin = explode('/', $destination);
687            $repertoires = '';
688            $profondeur = count($chemin) - 1;
689            $i = 0;
690            // On a déjà créé les répertoires d'extensions,
691            // mais on laisse cette sécu au cas où on a d'autres répertoires à créer.
692            while ($i < $profondeur) {
693                $repertoires = $repertoires . $chemin[$i] . '/';
694                $i++;
695            }
696            if (!is_dir($repertoires)) {
697                @mkdir($repertoires, _SPIP_CHMOD);
698                $message_log[] = date_format(date_create(), 'Y-m-d H:i:s')
699                . ' : le répertoire '
700                . $repertoires
701                . ' a été créé.';
702            }
703            // Hop, on déplace notre fichier vers IMG/orphelins
704            @rename($fichier, $destination);
705            $message_log[] = date_format(date_create(), 'Y-m-d H:i:s')
706            . ' : le fichier '
707            . $fichier
708            . ' a été déplacé vers '
709            . $destination
710            .'.';
711            // On construit un tableau dans le cas où qqn voudrait utiliser cette donnée.
712            // Pour le moment inutilisé.
713            $fichiers_deplaces[] = $destination;
714        }
715    } else {
716        $message_log[] = date_format(date_create(), 'Y-m-d H:i:s')
717        . ' : Il ne semble pas avoir de documents orphelins dans IMG/';
718    }
719
720    spip_log(
721        "\n-------\n"
722        . join("\n", $message_log)
723        . "\n-------\n",
724        "medias_nettoyage"
725    );
726    /**
727     * Et là, on marque bien la fin du script dans les logs.
728     */
729    spip_log(
730        date_format(date_create(), 'Y-m-d H:i:s')
731        . ' : Fin de la procédure de déplacement.',
732        "medias_nettoyage"
733    );
734
735    return true;
736}
737
738/**
739 * Réparer les documents.
740 * Il arrive parfois que suite à un problème de droits,
741 * les documents ne soient plus rangés correctement dans IMG/ext/fichier.ext
742 * mais dans un faux sous répertoire IMG/ext_fichier.ext
743 * Le présent script va recopier les fichiers mal placés,
744 * et changer leur référence dans la table spip_documents ;
745 * il donnera ensuite la liste des fichiers recopiés et
746 * des erreurs recontrées dans un fichier de log.
747 *
748 * Script repris de ce fichier :
749 * http://zone.spip.org/trac/spip-zone/browser/_outils_/repare_doc.html
750 *
751 * @uses medias_lister_logos_fichiers()
752 * @uses _DIR_IMG
753 *
754 * @return bool
755 */
756function medias_reparer_documents_fichiers ()
757{
758    /**
759     * On crée un log vraiment au début du script.
760     * Ainsi, on sait déjà en regardant les logs
761     * si le script est lancé ou pas.
762     */
763    spip_log(
764        date_format(date_create(), 'Y-m-d H:i:s')
765        . ' : Début de la procédure de réparation des documents.',
766        "medias_nettoyage"
767    );
768
769    $repertoire_img     = _DIR_IMG ;
770    $docs_fichiers      = array();
771    $pattern_img        = "/" . preg_replace("/\//", "\/", $repertoire_img) . "/";
772    $message_log        = array();
773
774    // On va chercher dans IMG/*.*
775    $fichiers = glob($repertoire_img . "*.*");
776    foreach ($fichiers as $fichier) {
777        $docs_fichiers[] = $fichier;
778    }
779    $docs_fichiers = array_filter(
780        array_diff(
781            $docs_fichiers,
782            medias_lister_logos_fichiers()
783        )
784    ); // a voir si on n'a pas de logos ce que ça donne comme ça…
785    $docs_fichiers = preg_replace($pattern_img, '', $docs_fichiers);
786
787    if (count($docs_fichiers) > 0) {
788        // On va échapper chaque valeur d'url de fichier car
789        // il peut arriver d'avoir des apostrophes dans le nom de fichier...
790        // #fail
791        foreach ($docs_fichiers as $url_fichier) {
792            $url_fichiers[] = sql_quote($url_fichier);
793        }
794        $docs_bdd = sql_allfetsel(
795            'id_document,fichier',
796            'spip_documents',
797            "fichier IN ("
798            . join(",", $url_fichiers)
799            . ")"
800        );
801        foreach ($docs_bdd as $document) {
802            $destination = preg_replace(',^([a-z0-3]+)_([^/]+\.(\1))$,i', '$1/$2', $document['fichier']);
803            // On va vérifier si on est bien sous la forme ../IMG/ext/nom_fichier.ext
804            // Sinon, on le construit manuellement.
805            // (ne pas oublier d'enlever '../IMG/' à notre variable de test
806            // car cette variable sera enresgitrée en BDD)
807            $destination_test = preg_replace($pattern_img, '', $destination);
808            if (count(explode("/", $destination_test)) == 1) {
809                $destination = $document['extension'] . '/' . $destination_test ;
810            }
811            if ($document['fichier'] != $destination
812                and rename($repertoire_img . $document['fichier'], $repertoire_img . $destination)) {
813                sql_updateq(
814                    'spip_documents',
815                    array('fichier' => $destination),
816                    'id_document=' . $document['id_document']
817                );
818                $message_log[] = date_format(date_create(), 'Y-m-d H:i:s')
819                . ' : le fichier '
820                . $repertoire_img
821                . $document['fichier']
822                . ' a été déplacé vers '
823                . $repertoire_img
824                . $destination
825                .'.';
826            } else {
827                $message_log[] = date_format(date_create(), 'Y-m-d H:i:s')
828                . ' : le fichier '
829                . $repertoire_img
830                . $document['fichier']
831                . ' n\'a pu être déplacé vers '
832                . $repertoire_img
833                . $destination
834                . '.';
835            }
836        }
837    } else {
838        $message_log[] = date_format(date_create(), 'Y-m-d H:i:s') . ' : Il n\'y a pas de documents à réparer.';
839    }
840
841    spip_log(
842        "\n-------\n"
843        . join("\n", $message_log)
844        . "\n-------\n",
845        "medias_nettoyage"
846    );
847    /**
848     * Et là, on marque bien la fin du script dans les logs.
849     */
850    spip_log(
851        date_format(date_create(), 'Y-m-d H:i:s')
852        . ' : Fin de la procédure de réparation des documents.',
853        "medias_nettoyage"
854    );
855
856    return true;
857}
858
859?>
Note: See TracBrowser for help on using the repository browser.