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

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

On doit toujours vérifier si on a bien un tableau après l'utilisation de la fonction glob(). Si cette fonction ne ramène aucun fichier, son retour est 'false'. On va aussi uniformiser les if sur les count(), on regarde si la variable est un tableau pour seulement après compter les entrées.
Up de z pour que l'archive se fasse. spipfacto, le patch vous sera utile.

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