source: spip-zone/_plugins_/convertisseur/trunk/spip-cli/ConvertisseurExporter.php @ 110985

Last change on this file since 110985 was 110985, checked in by booz@…, 19 months ago

nouvelle gestion de la globale

File size: 11.2 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 ConvertisseurExporter 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                                'statuts',
55                                't',
56                                InputOption::VALUE_OPTIONAL,
57                                'statuts des articles a exporter (séparé par une virgule)',
58                                'prop,prepa,publie'
59                        )
60                        ->addOption(
61                                'modif',
62                                'm',
63                                InputOption::VALUE_OPTIONAL,
64                                'date_modif après laquelle exporter',
65                                ''
66                        )
67                ;
68        }
69       
70        protected function execute(InputInterface $input, OutputInterface $output) {
71                global $spip_racine;
72                global $spip_loaded;
73               
74                include_spip("iterateur/data");
75               
76                $source = $input->getOption('source') ;
77                $dest = $input->getOption('dest') ;
78                $branche = $input->getOption('branche') ;
79                $date_modif = $input->getOption('modif') ;
80                $statuts = explode(',', $input->getOption('statuts'));
81                foreach($statuts as $s)
82                        $statuts_exportes[]= _q($s);
83               
84                // Secteur ou rubrique à exporter.
85                if(!$branche OR !intval($branche)){
86                        $output->writeln("<error>Préciser l'id du secteur ou de la rubrique à exporter. spip export -b 123 </error>");
87                        exit();
88                }
89               
90                // demande t'on un secteur ou une rubrique ?
91                $parent = sql_getfetsel("id_parent", "spip_rubriques", "id_rubrique=$branche");
92               
93                if($parent == 0)
94                        $critere_export = "where id_secteur=" . intval($branche) ;
95                else{
96                        // y'a t'il des sous rubriques ?
97                        $sous_rubriques = sql_allfetsel("id_rubrique", "spip_rubriques", "id_parent=$branche");
98                        if($sous_rubriques AND sizeof($sous_rubriques) > 0){
99                                foreach($sous_rubriques as $k => $v)
100                                        $ex[] = _q($v['id_rubrique']) ;
101                                $critere_export = "where id_rubrique in (" . implode(",", $ex) . ")" ;
102                        }
103                        else
104                                $critere_export = "where id_rubrique=" . intval($branche) ;
105                }
106               
107                if($date_modif)
108                        $critere_date_modif = "and date_modif > '$date_modif'" ;
109               
110                $critere_statut = "and statut in(". implode(",", $statuts_exportes) .")" ;
111               
112                // Répertoire dest, ou arrivent les fichiers txt.
113                if(!is_dir($dest)){
114                        $output->writeln("<error>Préciser le répertoire où exporter les fichiers de $source au format txt. spip export -d `repertoire` </error>");
115                        exit();
116                }
117               
118                if ($spip_loaded) {
119                        chdir($spip_racine);
120                       
121                        if (!function_exists('passthru')){
122                                $output->writeln("<error>Votre installation de PHP doit pouvoir exécuter des commandes externes avec la fonction passthru().</error>");
123                        }
124                        // Si c'est bon on continue
125                        else{
126                                // chopper les articles en sql.
127                                $query = sql_query("select * from spip_articles $critere_export $critere_date_modif $critere_statut order by date_redac asc"); 
128                               
129                                if(sql_count($query) > 0){
130                                        // start and displays the progress bar
131                                        $progress = new ProgressBar($output, sql_count($query));
132                                        $progress->setBarWidth(100);
133                                        $progress->setRedrawFrequency(1);
134                                        $progress->setMessage(" Export de `spip_articles` branche $branche en cours dans $dest ... ", 'message');
135                                        $progress->start();
136                                       
137                                        while($f = sql_fetch($query)){
138                                               
139                                                $id_article = $f['id_article'] ;
140                                                $id_rubrique = $f['id_rubrique'] ;
141                                               
142                                                // Exporter les champs spip_articles
143                                                $fichier = "" ;
144                                                $ins_auteurs = array();
145                                                $ins_mc = array();
146                                                $ins_doc = array();
147                                                $progress->setMessage('', 'motscles');
148                                                $progress->setMessage('', 'docs');
149                                                $progress->setMessage('', 'auteurs');
150                                               
151                                                // mettre les champs dans un fichier texte balisé avec des <ins class="champ">.
152                                                foreach($f as $k => $v){
153                                                        if($k == "texte" or $v == "" or $v == "0" or $v == "non" or $v == "0000-00-00 00:00:00")
154                                                                continue ;
155                                                        $fichier .= "<ins class='$k'>" . trim($v) ."</ins>\n" ;
156                                                }
157                                                $fichier .= "\n\n" . $f['texte'] . "\n\n" ;
158                                               
159                                                // Ajouter des métadonnées (hierarchie, auteurs, mots-clés...)
160                                               
161                                                // hierarchie
162                                                $hierarchie = array();
163                                                include_spip("inc/rubriques");
164                                                $ariane = preg_replace("/^0,/","", calcul_hierarchie_in($id_rubrique));
165                                               
166                                                $ariane = sql_allfetsel("titre","spip_rubriques","id_rubrique in($ariane)");
167                                                foreach($ariane as $a)
168                                                        $hierarchie[] = str_replace("/","",$a['titre']) ; // on ne veut pas de / car creer_rubrique_nommee pourrait se tromper à l'import.
169                                               
170                                                $hierarchie = implode("@@", $hierarchie);
171                                               
172                                                $rubrique = sql_fetsel("texte,descriptif", "spip_rubriques", "id_rubrique=$id_rubrique");
173                                               
174                                                if($texte_rubrique = $rubrique['texte'])
175                                                        $texte_rubrique = "<ins class='texte_rubrique'>$texte_rubrique</ins>\n" ;
176                                               
177                                                if($descriptif_rubrique = $rubrique['descriptif'])
178                                                        $descriptif_rubrique = "<ins class='descriptif_rubrique'>$descriptif_rubrique</ins>\n" ;
179                                               
180                                                // auteurs spip 3
181                                                if($spip_version_branche > "3")
182                                                        $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");
183                                                else // spip 2
184                                                        $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");
185                                               
186                                                foreach($auteurs as $a)
187                                                        if($a['nom'])
188                                                                $ins_auteurs[] = $a ;
189                                               
190                                                $auteurs = "" ;
191                                                foreach($ins_auteurs as $k => $a){
192                                                        if($k == 0)
193                                                                $sep = "" ;
194                                                        else
195                                                                $sep = "@@" ;
196                                                        $bio = ($a['bio'] != "") ? "::" . $a['bio'] : "" ;
197                                                        $auteurs .= $sep . $a['nom'] . $bio ;
198                                                }
199                                               
200                                                $auteurs_m = substr($auteurs, 0, 100) ;
201                                                $progress->setMessage($auteurs_m, 'auteurs');
202                                               
203                                                // mots-clés
204                                                if($spip_version_branche > "3")
205                                                        $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");
206                                                else // spip 2
207                                                        $motscles = sql_allfetsel("*", "spip_mots_articles ma, spip_mots m", "ma.id_article=$id_article and ma.id_mot=m.id_mot");
208                                               
209                                                foreach($motscles as $mc){
210                                                        if($mc['titre'])
211                                                                $ins_mc[] = $mc['type'] . "::" . $mc['titre'] ;
212                                                }
213                                                if(is_array($ins_mc)){
214                                                        $motscles = join("@@", $ins_mc) ;
215                                                        $motscles_m = substr($motscles, 0, 100) ;
216                                                        $progress->setMessage($motscles_m, 'motscles');
217                                                }
218                                               
219                                                // documents joints
220                                                $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");
221                                                foreach($documents as $doc)
222                                                                $ins_doc[] = json_encode($doc) ;
223                                                if(is_array($ins_doc)){
224                                                        $documents = join("@@", $ins_doc) ;
225                                                        $docs_m = substr($documents, 0, 100) ;
226                                                        $progress->setMessage($docs_m, 'docs');
227                                                }
228                                               
229                                                // Ajouter les métadonnées
230                                                if($auteurs)
231                                                        $fichier = "<ins class='auteurs'>$auteurs</ins>\n" . $fichier ;
232                                                if($motscles)
233                                                        $fichier = "<ins class='mots_cles'>$motscles</ins>\n" . $fichier ;
234                                                if($documents)
235                                                        $fichier = "<ins class='documents'>$documents</ins>\n" . $fichier ;
236                                                if($hierarchie){
237                                                        $fichier = "<ins class='hierarchie'>$hierarchie</ins>\n" .
238                                                        $descriptif_rubrique .
239                                                        $texte_rubrique .
240                                                        $fichier ;
241                                                }
242                                               
243                                                // Créer un fichier txt
244                                                $date = ($f['date_redac'] != "0000-00-00 00:00:00")? $f['date_redac'] : $f['date'] ;
245                                                preg_match("/^(\d\d\d\d)-(\d\d)/", $date, $m);
246                                                $annee = $m[1] ;
247                                                $mois = $m[2] ;
248                                               
249                                                include_spip("inc/charsets");
250                                                $nom_fichier = translitteration($f['titre']) ;
251                                                $nom_fichier = preg_replace("/[^a-zA-Z0-9]/i", "-", $nom_fichier);
252                                                $nom_fichier = preg_replace("/-{2,}/i", "-", $nom_fichier);
253                                                $nom_fichier = preg_replace("/^-/i", "", $nom_fichier);
254                                                $nom_fichier = preg_replace("/-$/i", "", $nom_fichier);
255                                               
256                                                $nom_fichier = "$dest/$annee/$annee-$mois/$annee-$mois"."_$nom_fichier.txt" ;
257                                               
258                                                // Créer les répertoires
259                                                if(!is_dir("$dest/$annee"))
260                                                        mkdir("$dest/$annee");
261                                                if(!is_dir("$dest/$annee/$annee-$mois"))
262                                                        mkdir("$dest/$annee/$annee-$mois");     
263                                               
264                                                if(ecrire_fichier("$nom_fichier", $fichier)){
265                                                        // Si tout s'est bien passé, on avance la barre
266                                                        $nom_fichier_m = substr($nom_fichier, 0, 100) ;
267                                                        $progress->setMessage($nom_fichier_m, 'filename');
268                                                        $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");
269                                                        $progress->advance();
270                                               
271                                                }
272                                                else{
273                                                        $output->writeln("<error>échec de l'export de $nom_fichier</error>");
274                                                        exit ;
275                                                }
276                                        }
277                                       
278                                        // ensure that the progress bar is at 100%
279                                        $progress->finish();
280                                       
281                                }else{
282                                        $output->writeln("<error>Rien à exporter dans la branche $branche depuis $date_modif</error>");
283                                }
284                        }
285                        $output->writeln("\n");
286                }
287                else{
288                        $output->writeln('<error>Vous n’êtes pas dans une installation de SPIP. Impossible de convertir le texte.</error>');
289                }
290        }
291}
292
293// compat spip 2
294if($GLOBALS['spip_version_branche'] < 3){
295        function calcul_hierarchie_in($id, $tout = true) {
296               
297                static $b = array();
298               
299                // normaliser $id qui a pu arriver comme un array, comme un entier, ou comme une chaine NN,NN,NN
300                if (!is_array($id)) {
301                        $id = explode(',', $id);
302                }
303                $id = join(',', array_map('intval', $id));
304                if (isset($b[$id])) {
305                        // Notre branche commence par la rubrique de depart si $tout=true
306                        return $tout ? (strlen($b[$id]) ? $b[$id] . ",$id" : $id) : $b[$id];
307                }
308               
309                $hier = "";
310               
311                // On ajoute une generation (les filles de la generation precedente)
312                // jusqu'a epuisement, en se protegeant des references circulaires
313               
314                $ids_nouveaux_parents = $id;
315                $maxiter = 10000;
316                while ($maxiter-- and $parents = sql_allfetsel(
317                        'id_parent',
318                        'spip_rubriques',
319                        sql_in('id_rubrique', $ids_nouveaux_parents) . " AND " . sql_in('id_parent', $hier, 'NOT')
320                )) {
321                        $ids_nouveaux_parents = join(',', array_map('reset', $parents));
322                        $hier = $ids_nouveaux_parents . (strlen($hier) ? ',' . $hier : '');
323                }
324               
325                # securite pour ne pas plomber la conso memoire sur les sites prolifiques
326               
327                if (strlen($hier) < 10000) {
328                        $b[$id] = $hier;
329                }
330                // Notre branche commence par la rubrique de depart si $tout=true
331                $hier = $tout ? (strlen($hier) ? "$hier,$id" : $id) : $hier;
332                return $hier;
333        }
334}
Note: See TracBrowser for help on using the repository browser.