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

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