[SPIP] ~v3.0.25-->v3.0.26
[lhc/web/www.git] / www / plugins / odt2spip_30 / action / odt2spip_importe.php
1 <?php
2
3 /**
4 * Créer un article à partir d'un fichier au format odt
5 *
6 * @author cy_altern
7 * @license GNU/LGPL
8 *
9 * @package plugins
10 * @subpackage odt2spip
11 * @category import
12 *
13 * @version $Id: odt2spip_importe.php 81585 2014-03-22 17:08:08Z cy_altern@yahoo.fr $
14 *
15 */
16 if (!defined("_ECRIRE_INC_VERSION")) return;
17
18 /**
19 * Création de l'article et redirection vers celui-ci
20 *
21 * Le fichier .odt est envoyé par un formulaire, ainsi que des informations sur
22 * la rubrique dans laquelle créer l'article, un flag qui indique s'il faut joindre
23 * le document à l'article créé, etc..
24 * Cette fonction s'assure avant tout que l'utilisateur peut y ajouter un article.
25 * Le fichier .odt est traité et transformé en article.
26 * En fin de traitement, on est redirigé vers l'article qui vient d'être créé.
27 *
28 * {@internal
29 * Un répertoire temporaire, spécifique à l'utilisateur en cours, est utilisé et
30 * créé si nécessaire. Il est supprimé en fin de traitement.
31 * Le format odt correspond à une archive .zip, et regroupe le contenu dans un fichier
32 * content.xml : ce fichier est transformé par XSLT afin de générer un texte
33 * utilisant les balises SPIP pour sa mise en forme.
34 * }}
35 *
36 */
37 function action_odt2spip_importe() {
38 global $visiteur_session;
39
40 $id_auteur = $visiteur_session['id_auteur'];
41 $arg = _request('arg');
42 $args = explode(":", $arg);
43
44 // le 1er élément de _request('arg') est id_rubrique=XXX ou id_article=YYY
45 $id_article = $id_rubrique = false;
46 $Targs = explode("=", $args[0]);
47 $objet = $Targs[0];
48 $id_objet = intval($Targs[1]);
49 $objet == 'id_rubrique' ? $id_rubrique = $id_objet : $id_article = $id_objet;
50
51 $hash = _request('hash');
52
53 $redirect = _request('redirect');
54 if ($redirect == NULL) {
55 $redirect = "";
56 }
57
58 include_spip("inc/securiser_action");
59
60 if (
61 ($id_rubrique AND !autoriser('creerarticledans', 'rubrique', $id_rubrique))
62 OR
63 ($id_article AND !autoriser('modifier', 'article', $id_article))
64 )
65 die(_T('avis_non_acces_page'));
66
67 // ss-rep temporaire specifique de l'auteur en cours: tmp/odt2spip/id_auteur/
68 // => le créer s'il n'existe pas
69 $base_dezip = _DIR_TMP . "odt2spip/"; // avec / final
70 if (!is_dir($base_dezip) AND !sous_repertoire(_DIR_TMP, 'odt2spip')) {
71 die (_T('odtspip:err_repertoire_tmp'));
72 }
73 $rep_dezip = $base_dezip . $id_auteur . '/';
74 if (!is_dir($rep_dezip) AND !sous_repertoire($base_dezip, $id_auteur)) {
75 die (_T('odtspip:err_repertoire_tmp'));
76 }
77 $rep_pictures = $rep_dezip."Pictures/";
78
79 // paramètres de conversion de taille des images : cm -> px (en 96 dpi puisque c'est ce que semble utiliser Writer)
80 $conversion_image = 96/2.54;
81
82 // traitement d'un fichier odt envoye par $_POST
83 $fichier_zip = addslashes($_FILES['fichier_odt']['name']);
84 if ($_FILES['fichier_odt']['name'] == ''
85 OR $_FILES['fichier_odt']['error'] != 0
86 OR !move_uploaded_file($_FILES['fichier_odt']['tmp_name'], $rep_dezip . $fichier_zip)) {
87 die(_T('odtspip:err_telechargement_fichier'));
88 }
89
90 // dezipper le fichier odt a la mode SPIP
91 include_spip("inc/pclzip");
92 $zip = new PclZip($rep_dezip . $fichier_zip);
93 $ok = $zip->extract(
94 PCLZIP_OPT_PATH, $rep_dezip,
95 PCLZIP_OPT_SET_CHMOD, _SPIP_CHMOD,
96 PCLZIP_OPT_REPLACE_NEWER
97 );
98 if ($zip->error_code < 0) {
99 spip_log('charger_decompresser erreur zip ' .
100 $zip->error_code . ' pour fichier ' . $rep_dezip . $fichier_zip);
101 die($zip->errorName(true)); //$zip->error_code
102 }
103
104 // Création de l'array avec les parametres de l'article:
105 // c'est ici que le gros de l'affaire se passe!
106 $odt2spip_generer_sortie = charger_fonction('odt2spip_generer_sortie', 'inc');
107 $Tarticle = $odt2spip_generer_sortie($id_auteur, $rep_dezip);
108
109 // si necessaire créer l'article
110 include_spip('action/editer_article');
111 if (!$id_article)
112 $id_article = article_inserer($id_rubrique);
113
114 // le remplir
115 article_modifier($id_article, $Tarticle);
116
117 // si necessaire recup les id_doc des images associées et les lier à l'article
118 if (isset($Tarticle['Timages']) AND count($Tarticle['Timages']) > 0){
119 foreach($Tarticle['Timages'] as $id_img) {
120 $champs = array(
121 'parents' => array("article|$id_article"),
122 'statut' => 'publie'
123 );
124 document_modifier($id_img, $champs);
125 }
126 }
127
128 // si nécessaire attacher le fichier odt original à l'article
129 // et lui mettre un titre signifiant
130 if (_request('attacher_odt') == '1') {
131 $titre = $Tarticle['titre'];
132 if (!isset($ajouter_documents)) {
133 $ajouter_documents = charger_fonction('ajouter_documents', 'action');
134 }
135 if ($id_document = $ajouter_documents('new',
136 array(array('tmp_name' => $rep_dezip . $fichier_zip, 'name' => $fichier_zip, 'titrer' => 0, 'distant' => 0, 'type' => 'document')),
137 'article', $id_article, 'document')
138 AND $id_doc_odt = intval($id_document[0])
139 AND $id_doc_odt == $id_document[0]) {
140 $c = array(
141 'titre' => $titre,
142 'descriptif' => _T('odtspip:cet_article_version_odt'),
143 'statut' => 'publie'
144 );
145 document_modifier($id_doc_odt, $c);
146 }
147 }
148
149 // vider le contenu du rep de dezippage
150 if (!function_exists('effacer_repertoire_temporaire')) {
151 include_spip('inc/getdocument');
152 }
153 effacer_repertoire_temporaire($rep_dezip);
154
155 // aller sur la page de l'article qui vient d'être créée
156 redirige_par_entete(
157 parametre_url(
158 str_replace("&amp;", "&", urldecode($redirect)),
159 'id_article', $id_article, '&'
160 )
161 );
162 }
163
164 ?>