[PLUGINS] +set de base
[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 71726 2013-04-07 01:27:30Z 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
45 $Targs = explode("=", $args[0]);
46 $id_rubrique = intval($Targs[1]);
47 $hash = _request('hash');
48
49 $redirect = _request('redirect');
50 if ($redirect == NULL) {
51 $redirect = "";
52 }
53
54 include_spip("inc/securiser_action");
55
56 if (!autoriser('creerarticledans', 'rubrique', $id_rubrique)) {
57 die(_T('avis_non_acces_page'));
58 }
59
60 // ss-rep temporaire specifique de l'auteur en cours: tmp/odt2spip/id_auteur/
61 // => le créer s'il n'existe pas
62 $base_dezip = _DIR_TMP . "odt2spip/"; // avec / final
63 if (!is_dir($base_dezip) AND !sous_repertoire(_DIR_TMP, 'odt2spip')) {
64 die (_T('odtspip:err_repertoire_tmp'));
65 }
66 $rep_dezip = $base_dezip . $id_auteur . '/';
67 if (!is_dir($rep_dezip) AND !sous_repertoire($base_dezip, $id_auteur)) {
68 die (_T('odtspip:err_repertoire_tmp'));
69 }
70 $rep_pictures = $rep_dezip."Pictures/";
71
72 // paramètres de conversion de taille des images : cm -> px (en 96 dpi puisque c'est ce que semble utiliser Writer)
73 $conversion_image = 96/2.54;
74
75 // traitement d'un fichier odt envoye par $_POST
76 $fichier_zip = addslashes($_FILES['fichier_odt']['name']);
77 if ($_FILES['fichier_odt']['name'] == ''
78 OR $_FILES['fichier_odt']['error'] != 0
79 OR !move_uploaded_file($_FILES['fichier_odt']['tmp_name'], $rep_dezip . $fichier_zip)) {
80 die(_T('odtspip:err_telechargement_fichier'));
81 }
82
83 // dezipper le fichier odt a la mode SPIP
84 include_spip("inc/pclzip");
85 $zip = new PclZip($rep_dezip . $fichier_zip);
86 $ok = $zip->extract(
87 PCLZIP_OPT_PATH, $rep_dezip,
88 PCLZIP_OPT_SET_CHMOD, _SPIP_CHMOD,
89 PCLZIP_OPT_REPLACE_NEWER
90 );
91 if ($zip->error_code < 0) {
92 spip_log('charger_decompresser erreur zip ' .
93 $zip->error_code . ' pour fichier ' . $rep_dezip . $fichier_zip);
94 die($zip->errorName(true)); //$zip->error_code
95 }
96
97 // Création de l'array avec les parametres de l'article:
98 // c'est ici que le gros de l'affaire se passe!
99 $odt2spip_generer_sortie = charger_fonction('odt2spip_generer_sortie', 'inc');
100 $Tarticle = $odt2spip_generer_sortie($id_auteur, $rep_dezip);
101
102 // créer l'article
103 include_spip('action/editer_article');
104 $id_article = article_inserer($id_rubrique);
105
106 // le remplir
107 article_modifier($id_article, $Tarticle);
108
109 // si necessaire recup les id_doc des images associées et les lier à l'article
110 if (isset($Tarticle['Timages']) AND count($Tarticle['Timages']) > 0){
111 foreach($Tarticle['Timages'] as $id_img) {
112 $champs = array(
113 'parents' => array("article|$id_article"),
114 'statut' => 'publie'
115 );
116 document_modifier($id_img, $champs);
117 }
118 }
119
120 // si nécessaire attacher le fichier odt original à l'article
121 // et lui mettre un titre signifiant
122 if (_request('attacher_odt') == '1') {
123 $titre = $Tarticle['titre'];
124 if (!isset($ajouter_documents)) {
125 $ajouter_documents = charger_fonction('ajouter_documents', 'action');
126 }
127 if ($id_document = $ajouter_documents('new',
128 array(array('tmp_name' => $rep_dezip . $fichier_zip, 'name' => $fichier_zip, 'titrer' => 0, 'distant' => 0, 'type' => 'document')),
129 'article', $id_article, 'document')
130 AND $id_doc_odt = intval($id_document[0])
131 AND $id_doc_odt == $id_document[0]) {
132 $c = array(
133 'titre' => $titre,
134 'descriptif' => _T('odtspip:cet_article_version_odt'),
135 'statut' => 'publie'
136 );
137 document_modifier($id_doc_odt, $c);
138 }
139 }
140
141 // vider le contenu du rep de dezippage
142 if (!function_exists('effacer_repertoire_temporaire')) {
143 include_spip('inc/getdocument');
144 }
145 effacer_repertoire_temporaire($rep_dezip);
146
147 // aller sur la page de l'article qui vient d'être créée
148 redirige_par_entete(
149 parametre_url(
150 str_replace("&amp;", "&", urldecode($redirect)),
151 'id_article', $id_article, '&'
152 )
153 );
154 }
155
156 ?>