source: spip-zone/_plugins_/convertisseur/trunk/spip-cli/convertisseurExporter.php @ 107768

Last change on this file since 107768 was 107768, checked in by booz@…, 3 years ago

n'exporter que les articles qui ont été modifiés depuis une date

File size: 8.6 KB
Line 
1<?php
2
3/***
4
5Exporter la table spip_articles en format txt
6
7Lancer la commande spip-cli : spip export -d `repertoire destination`
8
9Les fichiers txts sont placés dans le repertoire `repertoire destination` sur le disque dur.
10
11Si un repertoire git est trouvé dans /dest alors on prend le repertoire. todo
12
13Voir aussi fichiersImporter.
14
15*/
16
17use Symfony\Component\Console\Command\Command;
18use Symfony\Component\Console\Input\InputArgument;
19use Symfony\Component\Console\Input\InputInterface;
20use Symfony\Component\Console\Input\InputOption;
21use Symfony\Component\Console\Output\OutputInterface;
22use Symfony\Component\Console\Helper\ProgressBar;
23
24class fichiersExporter extends Command {
25        protected function configure() {
26                $this
27                        ->setName('convertisseur:exporter')
28                        ->setDescription('Exporter la table spip_articles (ou autre) au format SPIP txt.')
29                        ->setAliases(array(
30                                'export'
31                        ))
32                        ->addOption(
33                                'source',
34                                's',
35                                InputOption::VALUE_OPTIONAL,
36                                'Table à exporter',
37                                'spip_articles'
38                        )
39                        ->addOption(
40                                'dest',
41                                'd',
42                                InputOption::VALUE_OPTIONAL,
43                                'Répertoire où exporter au format texte',
44                                'spip_articles'
45                        )
46                        ->addOption(
47                                'branche',
48                                'b',
49                                InputOption::VALUE_OPTIONAL,
50                                'branche à exporter (id_secteur ou id_rubrique)',
51                                '0'
52                        )
53                        ->addOption(
54                                'modif',
55                                'm',
56                                InputOption::VALUE_OPTIONAL,
57                                'date_modif après laquelle exporter',
58                                ''
59                        )
60                ;
61        }
62       
63        protected function execute(InputInterface $input, OutputInterface $output) {
64                global $spip_racine;
65                global $spip_loaded;
66                global $spip_version_branche ;
67               
68                include_spip("iterateur/data");
69               
70                $source = $input->getOption('source') ;
71                $dest = $input->getOption('dest') ;
72                $branche = $input->getOption('branche') ;
73                $date_modif = $input->getOption('modif') ;
74               
75                // Secteur ou rubrique à exporter.
76                if(!$branche OR !intval($branche)){
77                        $output->writeln("<error>Préciser l'id du secteur ou de la rubrique à exporter. spip export -b 123 </error>");
78                        exit();
79                }
80               
81                // demande t'on un secteur ou une rubrique ?
82                $parent = sql_getfetsel("id_parent", "spip_rubriques", "id_rubrique=$branche");
83               
84                if($parent == 0)
85                        $critere_export = "where id_secteur=" . intval($branche) ;
86                else
87                        $critere_export = "where id_rubrique=" . intval($branche) ;
88               
89                if($date_modif)
90                        $critere_date_modif = "and date_modif > '$date_modif'" ;
91               
92                // Répertoire dest, ou arrivent les fichiers txt.
93                if(!is_dir($dest)){
94                        $output->writeln("<error>Préciser le répertoire où exporter les fichiers de $source au format txt. spip export -d `repertoire` </error>");
95                        exit();
96                }
97               
98                if ($spip_loaded) {
99                        chdir($spip_racine);
100                       
101                        if (!function_exists('passthru')){
102                                $output->writeln("<error>Votre installation de PHP doit pouvoir exécuter des commandes externes avec la fonction passthru().</error>");
103                        }
104                        // Si c'est bon on continue
105                        else{
106                               
107                                // chopper les articles en sql.
108                                $query = sql_query("select * from spip_articles $critere_export $critere_date_modif order by date_redac asc"); 
109                               
110                                // start and displays the progress bar
111                                $progress = new ProgressBar($output, sql_count($query));
112                                $progress->setBarWidth(100);
113                                $progress->setRedrawFrequency(1);
114                                $progress->setMessage(" Export de `spip_articles` en cours dans $dest ... ", 'message');
115                                $progress->start();
116                               
117                                while($f = sql_fetch($query)){
118                                       
119                                        $id_article = $f['id_article'] ;
120                                        $id_rubrique = $f['id_rubrique'] ;
121                                       
122                                        // Exporter les champs spip_articles
123                                        $fichier = "" ;
124                                        $ins_auteurs = array();
125                                        $ins_mc = array();
126                                        $ins_doc = array();
127                                        $progress->setMessage('', 'motscles');
128                                        $progress->setMessage('', 'docs');
129                                        $progress->setMessage('', 'auteurs');
130                                       
131                                        // mettre les champs dans un fichiers texte balisé avec des <ins class="champ">.
132                                        foreach($f as $k => $v){
133                                                if($k == "texte" or $v == "" or $v == "0" or $v == "non" or $v == "0000-00-00 00:00:00")
134                                                        continue ;
135                                                $fichier .= "<ins class='$k'>" . trim($v) ."</ins>\n" ;
136                                        }
137                                        $fichier .= "\n\n" . $f['texte'] . "\n\n" ;
138                                       
139                                        // Ajouter des métadonnées (hierarchie, auteurs, mots-clés...)
140                                       
141                                        // hierarchie
142                                        $rubrique = sql_fetsel("titre, descriptif, id_parent", "spip_rubriques", "id_rubrique=$id_rubrique");
143                                        $titre_rubrique = $rubrique['titre'];
144                                        $id_parent = $rubrique['id_parent'];
145                                        $descriptif_parent = $rubrique['titre'];
146                                        if($descriptif_rubrique = $rubrique['descriptif'])
147                                                        $descriptif_rubrique = "<ins class='descriptif_rubrique'>$descriptif_rubrique</ins>\n" ;
148                                       
149                                        if($id_parent)
150                                                $titre_parent = sql_getfetsel("titre", "spip_rubriques", "id_rubrique=$id_parent");
151                                       
152                                        // auteurs spip 3
153                                        if($spip_version_branche > "3")
154                                                $auteurs = sql_allfetsel("a.nom, a.bio", "spip_auteurs_liens al, spip_auteurs a", "al.id_objet=$id_article and al.objet='article' and al.id_auteur=a.id_auteur");
155                                        else // spip 2
156                                                $auteurs = sql_allfetsel("a.nom, a.bio", "spip_auteurs_articles aa, spip_auteurs a", "aa.id_article=$id_article and aa.id_auteur=a.id_auteur");
157                                       
158                                        foreach($auteurs as $a)
159                                                if($a['nom'])
160                                                        $ins_auteurs[] = $a ;
161                                       
162                                        $auteurs = "" ;
163                                        foreach($ins_auteurs as $k => $a){
164                                                if($k == 0)
165                                                        $sep = "" ;
166                                                else
167                                                        $sep = "@@" ;
168                                                $bio = ($a['bio'] != "") ? "::" . $a['bio'] : "" ;
169                                                $auteurs .= $sep . $a['nom'] . $bio ;
170                                        }
171                                       
172                                        $auteurs_m = substr($auteurs, 0, 100) ;
173                                        $progress->setMessage($auteurs_m, 'auteurs');
174                                       
175                                        // mots-clés
176                                        if($spip_version_branche > "3")
177                                                $motscles = sql_allfetsel("*", "spip_mots_liens ml, spip_mots m", "ml.id_objet=$id_article and ml.objet='article' and ml.id_mot=m.id_mot");
178                                        else // spip 2
179                                                $motscles = sql_allfetsel("*", "spip_mots_articles ma, spip_mots m", "ma.id_article=$id_article and ma.id_mot=m.id_mot");
180                                       
181                                        foreach($motscles as $mc){
182                                                if($mc['titre'])
183                                                        $ins_mc[] = $mc['type'] . "::" . $mc['titre'] ;
184                                        }
185                                        if(is_array($ins_mc)){
186                                                $motscles = join("@@", $ins_mc) ;
187                                                $motscles_m = substr($motscles, 0, 100) ;
188                                                $progress->setMessage($motscles_m, 'motscles');
189                                        }
190                                       
191                                        // documents joints
192                                        $documents = sql_allfetsel("*", "spip_documents d, spip_documents_liens dl", "dl.id_objet=$id_article and dl.objet='article' and dl.id_document=d.id_document");
193                                        foreach($documents as $doc)
194                                                        $ins_doc[] = json_encode($doc) ;
195                                        if(is_array($ins_doc)){
196                                                $documents = join("@@", $ins_doc) ;
197                                                $docs_m = substr($documents, 0, 100) ;
198                                                $progress->setMessage($docs_m, 'docs');
199                                        }
200                                       
201                                        // Ajouter les métadonnées
202                                        if($auteurs)
203                                                $fichier = "<ins class='auteurs'>$auteurs</ins>\n" . $fichier ;
204                                        if($motscles)
205                                                $fichier = "<ins class='mots_cles'>$motscles</ins>\n" . $fichier ;
206                                        if($documents)
207                                                $fichier = "<ins class='documents'>$documents</ins>\n" . $fichier ;
208                                        if($titre_parent && $titre_rubrique){
209                                                $fichier = "<ins class='hierarchie'>$titre_parent@@$titre_rubrique</ins>\n" .
210                                                $descriptif_rubrique .
211                                                $fichier ;
212                                        }
213                                        // Créer un fichier txt
214                                        $date = ($f['date_redac'] != "0000-00-00 00:00:00")? $f['date_redac'] : $f['date'] ;
215                                        preg_match("/^(\d\d\d\d)-(\d\d)/", $date, $m);
216                                        $annee = $m[1] ;
217                                        $mois = $m[2] ;
218                                       
219                                        include_spip("inc/charset");
220                                        $nom_fichier = translitteration($f['titre']) ;
221                                        $nom_fichier = preg_replace("/[^a-zA-Z0-9]/i", "-", $nom_fichier);
222                                        $nom_fichier = preg_replace("/-{2,}/i", "-", $nom_fichier);
223                                        $nom_fichier = preg_replace("/^-/i", "", $nom_fichier);
224                                        $nom_fichier = preg_replace("/-$/i", "", $nom_fichier);
225                                       
226                                        $nom_fichier = "$dest/$annee/$annee-$mois/$annee-$mois"."_$nom_fichier.txt" ;
227                                       
228                                        // Créer les répertoires
229                                        if(!is_dir("$dest/$annee"))
230                                                mkdir("$dest/$annee");
231                                        if(!is_dir("$dest/$annee/$annee-$mois"))
232                                                mkdir("$dest/$annee/$annee-$mois");     
233                                       
234                                        if(ecrire_fichier("$nom_fichier", $fichier)){
235                                                // Si tout s'est bien passé, on avance la barre
236                                                $nom_fichier_m = substr($nom_fichier, 0, 100) ;
237                                                $progress->setMessage($nom_fichier_m, 'filename');
238                                                $progress->setFormat("<fg=white;bg=blue>%message%</>\n" . '%current%/%max% [%bar%] %percent:3s%% %elapsed:6s%/%estimated:-6s% %memory:6s%' . "\n %auteurs% %motscles% \n %filename% \n\n");
239                                                $progress->advance();
240                                       
241                                        }
242                                        else{
243                                                $output->writeln("<error>échec de l'export de $nom_fichier</error>");
244                                                exit ;
245                                        }
246                                }
247                               
248                                // ensure that the progress bar is at 100%
249                                $progress->finish();
250                               
251                        }
252                        $output->writeln("\n");
253                }
254                else{
255                        $output->writeln('<error>Vous n’êtes pas dans une installation de SPIP. Impossible de convertir le texte.</error>');
256                }
257        }
258}
Note: See TracBrowser for help on using the repository browser.