source: spip-zone/_plugins_/spip2spip/trunk/inc/spip2spip.php @ 119876

Last change on this file since 119876 was 119876, checked in by real3t@…, 10 months ago

[SPIP2SPIP] L'importation d'événément avec statut identique ne marchait pas !

File size: 45.6 KB
Line 
1<?php
2/**
3 * Plugin Spip2spip
4 *
5 * Licence GNU/GPL
6 */
7
8if (!defined('_ECRIRE_INC_VERSION')) {
9        return;
10}
11
12/**
13 * Effectue la syndication d'un flux backend-spip pour un site donnee et importe les données
14 *
15 * @param int $id_site identifiant du sitex du document
16 * @param string $mode *   null : la valeur configuree par defaut ou pour le provider est utilisee
17 *   'cron' : mode silencieux et spip_log
18 *   'html' : mode bavard
19 * @return array  tableau des articles importés
20 */
21function spip2spip_syndiquer($id_site, $mode = 'cron') {
22    include_spip("inc/distant");
23    include_spip("inc/syndic");
24    include_spip("inc/getdocument");
25    include_spip("inc/ajouter_documents");
26    include_spip("inc/config");
27    include_spip('inc/rubriques');
28
29    $log_html = "";
30    $log_email = "";
31
32    //-------------------------------
33    // Recupere la config
34    //-------------------------------
35    // groupe mot cle "licence" installe ? (contrib: https://contrib.spip.net/Filtre-Licence )
36    if (spip2spip_get_id_groupemot("licence")) {
37        $isLicenceInstalled = true;
38    } else {
39        $isLicenceInstalled = false;
40    }
41
42    // Lire config
43    $import_statut = lire_config('spip2spip/import_statut', 'identique');
44    $import_date_article = (lire_config('spip2spip/import_date_article', '') == 'oui') ? true : false;
45    $citer_source = lire_config('spip2spip/citer_source') ? true : false;
46    $creer_thematique_article  = (lire_config('spip2spip/creer_thematique_article', '') == 'oui') ? true : false;
47    $email_alerte = lire_config('spip2spip/email_alerte') ? true : false;
48    $email_suivi = lire_config('spip2spip/email_suivi', $GLOBALS['meta']['adresse_suivi']);
49    $import_mot_article = lire_config('spip2spip/import_mot_article') ? true : false;
50    $import_mot_evt = lire_config('spip2spip/import_mot_evnt') ? true : false;
51    $import_mot_groupe_creer = lire_config('spip2spip/import_mot_groupe_creer') ? true : false;
52    $id_import_mot_groupe = lire_config('spip2spip/import_mot_groupe_creer', -1);
53        if (!defined('_SPIP2SPIP_RECUPERER_CONTENU')) {
54                define('_SPIP2SPIP_RECUPERER_CONTENU', true);
55        }
56        if (!defined('_SPIP2SPIP_RECUPERER_DOC')) {
57                define('_SPIP2SPIP_RECUPERER_DOC', true);
58        }
59
60    //-------------------------------
61    // selection du site
62    //-------------------------------
63    if ($row_site = sql_fetsel("*", "spip_spip2spips", "id_spip2spip=" . intval($id_site))) {
64        $id_site = $row_site["id_spip2spip"];
65        $site_titre = $row_site["site_titre"];
66        $url_syndic = $row_site["site_rss"];
67        $date_syndic = $row_site["maj"];
68
69        spip_log("syndication: " . $url_syndic, "spiptospip");
70
71        sql_update("spip_spip2spips", array('maj' => 'NOW()'), "id_spip2spip=$id_site");
72
73        // Aller chercher les donnees du flux RSS et les analyser
74        $rss = recuperer_page($url_syndic, true);
75        if (!$rss) {
76            $log_html.= "<div class='bloc_error'>" . _T('spip2spip:avis_echec_syndication') . "</div>";
77        } else {
78            $articles = analyser_backend_spip2spip($rss);
79
80            //----*************
81            // Des articles dispo pour ce site ?
82            if (is_array($articles)) {
83
84                // on ouvre le ul avant l'énumération du ou des article(s)
85                $log_html.= "<ul class='liste-items'>\n";
86                foreach ($articles as $article) {
87                    $log_html.= "<li class='item'>";
88                     // On ouvre les festivités
89
90                    if (isset($article['link'])) {
91                        $documents_current_article = array();
92                        $version_flux = $article['version_flux'];
93
94                        $current_titre = $article['titre'];
95                        $current_link = $article['link'];
96
97                        // Est que l'article n'a pas été déjà importé ?
98                        $nb_reponses = sql_countsel("spip_articles", "s2s_url=" . sql_quote($current_link));
99                        if ($nb_reponses > 0) {
100
101                            // article deja connu et present ds la base
102                            $article_importe = sql_fetsel('id_article,titre', 'spip_articles', 's2s_url=' . sql_quote($current_link));
103                            $log_html.= "<span class='bloc_info'>" . _T('spip2spip:imported_already') . "</span><a href='$current_link' rel='external' class='h3'>$current_titre</a><br/>\n" . "<strong>" . _T('spip2spip:label_thematique') . ':</strong> ' . $article['keyword'] . "<br/>\n" . "<a href=" . generer_url_ecrire('article', 'id_article=' . $article_importe['id_article']) . ">" . _T('spip2spip:imported_view') . "</a>\n";
104                            spip_log("deja importe: " . $current_link, "spiptospip");
105
106                        } else {
107
108                            // nouvel article à importer
109                            $log_html.= "<span class='bloc_success'>" . _T('spip2spip:imported_new') . "</span>\n" . "<a href='$current_link' rel='external' class='h3'>$current_titre</a>\n";
110
111                            // on cherche la rubrique destination
112                            $target = spip2spip_get_id_rubrique($article['keyword']);
113                            if (!$target) {
114
115                                // Aucune rubrique associée au thème.
116                                if ($creer_thematique_article) {
117                                    $id_thematique = spip2spip_set_thematique($article['keyword']);
118                                    $thematique_complement = " (<a href=" . generer_url_ecrire('mot', 'id_mot=' . $id_thematique) . ">" . _T('spip2spip:voir_thematique') . "</a>)";
119                                } else {
120                                    $thematique_complement = '';
121                                }
122
123                                $log_html.= "<div class='bloc_notice'>" . _T('spip2spip:no_target') . " <strong>" . $article['keyword'] . "</strong>" . $thematique_complement . "</div>\n";
124                            } else {
125
126                                // On a une rubrique cible
127                                // On importe les données
128
129                                // -----------------------------------
130                                // etape 1 -  traitement des documents
131                                // -----------------------------------
132                                if (_SPIP2SPIP_RECUPERER_DOC) {
133                                                                        $_documents = $article['documents'];
134                                                                }
135                                $documents_current_article = array();
136                                if ($_documents != "") {
137                                    $_documents = preg_replace_callback('!s:(\d+):"(.*?)";!', 
138                                                                        function ($matches) {
139                                                                                return strtolower("'s:'.strlen($matches[1]).':\".$matches[1].\";'");
140                                                                                }
141                                                                                ,
142                                                                                $_documents);
143                                    $_documents = unserialize($_documents);
144                                    foreach ($_documents as $_document) {
145                                        $id_distant = $_document['id'];
146                                        $source = $_document['url'];
147                                        $titre = stripslashes($_document['titre']);
148                                        $desc = stripslashes($_document['desc']);
149                                        $credits = stripslashes($_document['credits']);
150
151                                        // inspire de @ajouter_un_document() - inc/ajout_documents.php
152                                        if ($a = recuperer_infos_distantes($source)) {
153                                                                                        if (is_array($a)) {
154
155                                                                                                $type_image = $a['type_image'];
156
157                                                                                                unset($a['type_image']);
158                                                                                                unset($a['body']);
159                                                                                                unset($a['mode']);
160
161                                                                                                $a['date'] = 'NOW()';
162                                                                                                $a['distant'] = 'oui';
163
164                                                                                                $a['mode'] = 'document';
165                                                                                                $a['fichier'] = set_spip_doc($source);
166
167                                                                                                unset($a['mime_type']);
168
169                                                                                                $a['titre'] = $titre;
170                                                                                                 // infos spip2spip, recupere via le flux
171                                                                                                $a['descriptif'] = $desc;
172                                                                                                $a['credits'] = $credits;
173
174                                                                                                $documents_current_article[$id_distant] = sql_insertq("spip_documents", $a);
175                                                                                        }
176                                                                                }
177                                    }
178                                }
179                                 // Fin de l'étape 1 de traitement des documents
180
181                                // -----------------------------------
182                                // etape 2 -  traitement de l'article
183                                // -----------------------------------
184                                $_titre = $article['titre'];
185                                                                $_s2s_url_site_distant = $article['s2s_url_site_distant'];
186                                                                $_s2s_id_article_distant = $article['s2s_id_article_distant'];
187                                                                if (_SPIP2SPIP_RECUPERER_CONTENU) {
188                                                                        $_surtitre = $article['surtitre'];
189                                                                        $_soustitre = $article['soustitre'];
190                                                                        $_descriptif = spip2spip_convert_extra($article['descriptif'], $documents_current_article, $version_flux);
191                                                                        $_chapo = spip2spip_convert_extra($article['chapo'], $documents_current_article, $version_flux);
192                                                                        $_texte = spip2spip_convert_extra($article['texte'], $documents_current_article, $version_flux);
193                                                                        $_ps = spip2spip_convert_extra($article['ps'], $documents_current_article, $version_flux);
194                                                                } else {
195                                                                        $_surtitre = '';
196                                                                        $_soustitre = '';
197                                                                        $_descriptif = '';
198                                                                        $_chapo = '';
199                                                                        $_texte = '';
200                                                                        $_ps = '';                                                                     
201                                                                }
202
203                                // ----------
204                                //date de la syndication ou date de l'article ?
205                                if ($import_date_article == true) {
206                                    $_date = $article['date'];
207                                     // Date de l'article
208                                } else {
209                                    $_date = date('Y-m-d H:i:s', time());
210                                     //Date de syndication
211                                }
212                                $_date_redac = $article['date_redac'];
213                                $_date_modif = $article['date_modif'];
214                                $_nom_site = $article['nom_site'];
215                                $_url_site = $article['url_site'];
216                                $_virtuel = $article['virtuel'];
217                                $_lang = $article['lang'];
218                                $_logo = $article['logo'];
219                                $_logosurvol = $article['logosurvol'];
220                                $_id_rubrique = $target;
221                                $_id_secteur = spip2spip_get_id_secteur($target);
222                                $_statut = ($import_statut == 'identique') ? $article['statut'] : $import_statut;
223                                $_id_auteur = $article['auteur'];
224                                $_link = $article['link'];
225                                $_trad = $article['trad'];
226                                $_licence = $article['licence'];
227
228                                // ----------
229                                // on cite la source originale ds le champs ps et la licence
230                                if ($citer_source) {
231                                    $_ps.= _T('spip2spip:origin_url') . " [->" . $_link . "]";
232                                }
233
234                                // ----------
235                                // licence ?
236                                if ($_licence != "" && !isLicenceInstalled) {
237                                    $_ps.= _T('spip2spip:article_license') . " " . $_licence;
238                                }
239
240                                // ----------
241                                // ....dans la table articles
242                                // ----------
243                                $id_nouvel_article = sql_insertq("spip_articles", array(
244                                    'lang' => $_lang,
245                                    'surtitre' => $_surtitre,
246                                    'titre' => $_titre,
247                                    'soustitre' => $_soustitre,
248                                    'id_rubrique' => $_id_rubrique,
249                                    'id_secteur' => $_id_secteur,
250                                    'descriptif' => $_descriptif,
251                                    'chapo' => $_chapo,
252                                    'virtuel' => $_virtuel,
253                                    'texte' => $_texte,
254                                    'ps' => $_ps,
255                                    'statut' => $_statut,
256                                    'nom_site' => $_nom_site,
257                                    'url_site' => $_url_site,
258                                    'accepter_forum' => 'non',
259                                    'date' => $_date,
260                                    'date_redac' => $_date_redac,
261                                    'date_modif' => $_date_modif,
262                                    's2s_url' => $_link,
263                                    's2s_url_trad' => $_trad,
264                                                                        's2s_url_site_distant' => $_s2s_url_site_distant,
265                                                                        's2s_id_article_distant' => $_s2s_id_article_distant,
266                                ));
267                                $log_html.= "<br/>\n" . "<strong>" . _T('spip2spip:label_thematique') . ':</strong> ' . $article['keyword'] . "<br/>\n<a href='" . generer_url_ecrire('article', "id_article=$id_nouvel_article") . "'>" . _T('spip2spip:imported_view') . "</a>\n";
268
269                                $log_email.= $article['titre'] . "\n" . _T('spip2spip:imported_view') . ": " . generer_url_ecrire('article', "id_article=$id_nouvel_article", true, false) . "\n\n";
270
271                                // Au besoin, changer le statut de rubrique concernee
272                                if ($_statut == "publie")
273                                   calculer_rubriques_if($_id_rubrique, array('statut' => $_statut));
274
275
276
277                                // ----------
278                                // gestion lien traduction
279                                // ----------
280                                if ($_trad) {
281                                    if ($_trad == $_link) {
282
283                                        // il s'agit de l'article origine de traduc
284                                        sql_updateq('spip_articles', array("id_trad" => $id_nouvel_article), "id_article=$id_nouvel_article");
285                                         // maj article orig trad
286                                        sql_updateq('spip_articles', array("id_trad" => $id_nouvel_article), "s2s_url_trad=" . sql_quote($_link));
287                                         // maj article trad (si deja importe ds une session precedente)
288
289                                    } else {
290
291                                        // il s'agit d'un article traduit,
292                                        // on cherche si on a l'article origine de trad en local
293                                        if ($row = sql_fetsel("id_article", "spip_articles", "s2s_url=" . sql_quote($_trad))) {
294                                            $id_article_trad = (int)$row['id_article'];
295                                            sql_updateq('spip_articles', array("id_trad" => $id_article_trad), "id_article=$id_nouvel_article");
296                                             // maj article trad
297                                            sql_updateq('spip_articles', array("id_trad" => $id_article_trad), "id_article=$id_article_trad");
298                                             // maj article orig trad (si deja importe ds une session precedente)
299
300                                        }
301                                    }
302                                }
303
304                                // ----------
305                                // ... dans la table auteurs
306                                // ----------
307                                if ($_id_auteur) {
308
309                                    if ($version_flux <= "1.8") {
310                                            $auteurs = explode(", ", $_id_auteur);
311                                    }  else {
312                                            $auteurs = unserialize($_id_auteur);
313                                    }
314
315                                    foreach ($auteurs as $auteur) {
316                                        $id_auteur = spip2spip_get_id_auteur($auteur);
317                                        if ($id_auteur) {
318                                            @sql_insertq("spip_auteurs_liens", array('id_auteur' => $id_auteur, 'objet' => 'article', 'vu' => 'non', 'id_objet' => $id_nouvel_article));
319                                        }
320                                    }
321                                }
322
323                                // ----------
324                                // ... dans la table spip_documents_liens
325                                // ----------
326                                foreach ($documents_current_article as $document_current_article) {
327                                    @sql_insertq('spip_documents_liens', array('id_document' => $document_current_article, 'id_objet' => $id_nouvel_article, 'objet' => 'article'));
328                                }
329
330                                // ----------
331                                // ... si logo, tente de l'importer
332                                // ----------
333                                if ($_logo) {
334                                    $logo_local = _DIR_RACINE . copie_locale($_logo);
335                                    if ($logo_local) {
336                                        $logo_local_dest = _DIR_IMG . "arton$id_nouvel_article." . substr($logo_local, -3);
337                                        @rename($logo_local, $logo_local_dest);
338                                    }
339                                }
340
341                                // ----------
342                                // ... si logo de survol, tente de l'importer
343                                // ----------
344                                if ($_logosurvol) {
345                                    $logosurvol_local = _DIR_RACINE . copie_locale($_logosurvol);
346                                    if ($logosurvol_local) {
347                                        $logosurvol_local_dest = _DIR_IMG . "artoff$id_nouvel_article." . substr($logosurvol_local, -3);
348                                        @rename($logosurvol_local, $logosurvol_local_dest);
349                                    }
350                                }
351
352                                // -----------------------------------
353                                // etape 3 - traitement des mots de l'article
354                                // -----------------------------------
355                                $_mots = $article['mots'];
356                                if ($_mots != "" && $import_mot_article) {
357                                    $_mots = unserialize($_mots);
358                                    foreach ($_mots as $_mot) {
359                                        $groupe = stripslashes($_mot['groupe']);
360                                        $titre = stripslashes($_mot['titre']);
361                                        spip2spip_insert_mode_article($id_nouvel_article, $titre, $groupe, $import_mot_groupe_creer, $id_import_mot_groupe, "article");
362                                    }
363                                }
364
365                                // -----------------------------------
366                                // etape 4 - traitement des evenements
367                                // -----------------------------------
368                                $_evenements = $article['evenements'];
369                                if ($_evenements != "") {
370                                                                        $_evenements = preg_replace_callback('!s:(\d+):"(.*?)";!', 
371                                                                        function ($matches) {
372                                                                                return strtolower("'s:'.strlen($matches[1]).':\".$matches[1].\";'");
373                                                                                }
374                                                                                ,
375                                                                                $_evenements);
376                                    $_evenements = unserialize(base64_decode($_evenements));
377                                    foreach ($_evenements as $_evenement) {
378                                        $datedeb = $_evenement['datedeb'];
379                                        $datefin = $_evenement['datefin'];
380                                        $lieu = stripslashes($_evenement['lieu']);
381                                        $adresse = spip2spip_convert_extra(stripslashes($_evenement['adresse']), $documents_current_article, $version_flux);
382                                        $horaire = $_evenement['horaire'];
383                                        $titre = stripslashes($_evenement['titre']);
384                                        $statut = ($import_statut == "identique") ? $_evenement['statut']  : $import_statut;
385                                        $desc = spip2spip_convert_extra(stripslashes($_evenement['desc']), $documents_current_article, $version_flux);
386                                        $motevts = $_evenement['motevts'];
387
388                                        $id_nouvel_evt = sql_insertq('spip_evenements', array(
389                                            'id_article' => $id_nouvel_article,
390                                            'date_debut' => $datedeb,
391                                            'date_fin' => $datefin,
392                                            'titre' => $titre,
393                                            'descriptif' => $desc,
394                                            'lieu' => $lieu,
395                                            'adresse' => $adresse,
396                                            'horaire' => $horaire,
397                                            'statut' => $statut,
398                                        ));
399                                        $log_html.= "<div class='event_ok'>" . _T('spip2spip:event_ok') . " : $datedeb  $lieu</div>";
400
401                                        // mot cle ?
402                                        if ($motevts != "" && $import_mot_evt) {
403                                            foreach ($motevts as $motevt) {
404                                                $groupe = stripslashes($motevt['groupe']);
405                                                $titre = stripslashes($motevt['titre']);
406                                                spip2spip_insert_mode_article($id_nouvel_evt, $titre, $groupe, $import_mot_groupe_creer, $id_import_mot_groupe, "evenement");
407                                            }
408                                        }
409
410                                        // #mot cle
411
412                                    }
413                                }
414                                 // Fin etape 4
415
416                                // ----------
417                                // .... dans le groupe mot "licence" ?
418                                // ----------
419                                if ($_licence != "" && isLicenceInstalled) {
420                                    $id_mot = spip2spip_get_id_mot($_licence);
421                                    if ($id_mot) {
422                                        @sql_insertq('spip_mots_articles', array('id_mot' => $id_mot, 'id_article' => $id_nouvel_article));
423                                    }
424                                }
425                            }
426                             // Fin du traitement de l'article vers sa rubrique cible.
427                            $log_html.= "</li>\n";
428                             // on n'oublie pas de fermer l'item de la liste
429
430                        }
431                         // On a traité l'article à importer.
432
433
434                    } else {
435
436                        // pas de link dans l'article du flux.
437
438                    }
439                }
440                 // Fin du traitement de chaque article.
441                // On ferme la liste.
442                $log_html.= "</ul>\n";
443            } else {
444
445                // On n'a pas d'article dans le flux.
446                $log_html.= "<div class='bloc_notice'>" . _T('spip2spip:aucun_article') . "</div>";
447            }
448        }
449         // fin du traitement du flux rss (else)
450
451
452    }
453     // #selection du site
454
455    // alerte email ?
456    if ($email_alerte && $log_email != "") {
457        $envoyer_mail = charger_fonction('envoyer_mail', 'inc');
458        $envoyer_mail($email_suivi, _T('spip2spip:titre_mail'), $log_email);
459    }
460
461    if ($mode == 'html') {
462        return $log_html;
463    }
464    return false;
465}
466
467// -----------------------
468// Fonctions Parsing
469// -----------------------
470
471//
472// verifie s'il s'agit du bon format de backend
473// a terme peut etre utile pour recuperer le numero de version
474function is_spip2spip_backend($str) {
475
476    // Chercher un numero de version
477    if (preg_match('/(spip2spip)[[:space:]](([^>]*[[:space:]])*)version[[:space:]]*=[[:space:]]*[\'"]([-_a-zA-Z0-9\.]+)[\'"]/', $str, $regs)) return true;
478    return false;
479}
480
481//
482// parse le backend xml spip2spip
483// basée sur la fonction originale: ecrire/inc/syndic.php -> analyser_backend()
484function analyser_backend_spip2spip($rss) {
485    include_spip("inc_texte.php"); // pour couper()
486    include_spip("inc_filtres.php"); // pour filtrer_entites()
487
488    $xml_tags = array('surtitre', 'titre', 'soustitre', 'descriptif', 'chapo', 'texte', 'ps', 'auteur', 'auteurs', 'link', 's2s_url_site_distant', 's2s_id_article_distant', 'trad', 'date', 'date_redac', 'date_modif', 'statut', 'nom_site', 'url_site', 'virtuel', 'evenements', 'lang', 'logo', 'logosurvol', 'keyword', 'mots', 'licence', 'documents');
489
490    $syndic_regexp = array(
491        'item' => ',<item[>[:space:]],i',
492        'itemfin' => '</item>',
493        'surtitre' => ',<surtitre[^>]*>(.*?)</surtitre[^>]*>,ims',
494        'statut' => ',<statut[^>]*>(.*?)</statut[^>]*>,ims',
495        'titre' => ',<titre[^>]*>(.*?)</titre[^>]*>,ims',
496        'soustitre' => ',<soustitre[^>]*>(.*?)</soustitre[^>]*>,ims',
497        'descriptif' => ',<descriptif[^>]*>(.*?)</descriptif[^>]*>,ims',
498        'chapo' => ',<chapo[^>]*>(.*?)</chapo[^>]*>,ims',
499        'texte' => ',<texte[^>]*>(.*?)</texte[^>]*>,ims',
500        'ps' => ',<ps[^>]*>(.*?)</ps[^>]*>,ims',
501        'auteur' => ',<auteur[^>]*>(.*?)</auteur[^>]*>,ims',        // spip2spip v1.8
502        'auteurs' => ',<auteurs[^>]*>(.*?)</auteurs[^>]*>,ims',     // spip2spip v1.9
503        'link' => ',<link[^>]*>(.*?)</link[^>]*>,ims',
504                's2s_url_site_distant' => ',<s2s_url_site_distant[^>]*>(.*?)</s2s_url_site_distant[^>]*>,ims',
505                's2s_id_article_distant' => ',<s2s_id_article_distant[^>]*>(.*?)</s2s_id_article_distant[^>]*>,ims',
506        'trad' => ',<trad[^>]*>(.*?)</trad[^>]*>,ims',
507        'date' => ',<date[^>]*>(.*?)</date[^>]*>,ims',
508        'date_redac' => ',<date_redac[^>]*>(.*?)</date_redac[^>]*>,ims',
509        'date_modif' => ',<date_modif[^>]*>(.*?)</date_modif[^>]*>,ims',
510        'virtuel' => ',<virtuel[^>]*>(.*?)</virtuel[^>]*>,ims',
511        'nom_site' => ',<nom_site[^>]*>(.*?)</nom_site[^>]*>,ims',
512        'url_site' => ',<url_site[^>]*>(.*?)</url_site[^>]*>,ims',
513        'evenements' => ',<evenements[^>]*>(.*?)</evenements[^>]*>,ims',
514        'lang' => ',<lang[^>]*>(.*?)</lang[^>]*>,ims',
515        'logo' => ',<logo[^>]*>(.*?)</logo[^>]*>,ims',
516        'logosurvol' => ',<logosurvol[^>]*>(.*?)</logosurvol[^>]*>,ims',
517        'keyword' => ',<keyword[^>]*>(.*?)</keyword[^>]*>,ims',
518        'mots' => ',<mots[^>]*>(.*?)</mots[^>]*>,ims',
519        'licence' => ',<licence[^>]*>(.*?)</licence[^>]*>,ims',
520        'documents' => ',<documents[^>]*>(.*?)</documents[^>]*>,ims',
521    );
522
523    // documents
524    $xml_doc_tags = array('id', 'url', 'titre', 'desc', 'credits');
525    $document_regexp = array(
526        'document' => ',<document[>[:space:]],i',
527        'documentfin' => '</document>',
528        'id' => ',<id[^>]*>(.*?)</id[^>]*>,ims',
529        'url' => ',<url[^>]*>(.*?)</url[^>]*>,ims',
530        'titre' => ',<titre[^>]*>(.*?)</titre[^>]*>,ims',
531        'desc' => ',<desc[^>]*>(.*?)</desc[^>]*>,ims',
532        'credits' => ',<credits[^>]*>(.*?)</credits[^>]*>,ims',
533    );
534
535    // mots
536    $xml_mot_tags = array('groupe', 'titre');
537    $mot_regexp = array(
538        'mot' => ',<mot[>[:space:]],i',
539        'motfin' => '</mot>',
540        'groupe' => ',<groupe[^>]*>(.*?)</groupe[^>]*>,ims',
541        'titre' => ',<titre[^>]*>(.*?)</titre[^>]*>,ims',
542    );
543
544    // auteurs
545    $xml_auteur_tags = array('auteur_item');
546    $auteur_regexp = array(
547        'auteur' => ',<auteur[>[:space:]],i',
548        'auteurfin' => '</auteur>',
549        'auteur_item' => ',<auteur[^>]*>(.*?)</auteur[^>]*>,ims',
550    );
551
552    // evenements
553    $xml_event_tags = array('datedeb', 'datefin', 'titre', 'statut', 'desc', 'lieu', 'adresse', 'horaire', 'motevts');
554
555    // on ne gere pas pour l'instant idevent/idsource qui permet de conserver la liaison des repetitions
556
557    $evenement_regexp = array(
558        'evenement' => ',<evenement[>[:space:]],i',
559        'evenementfin' => '</evenement>',
560        'datedeb' => ',<datedeb[^>]*>(.*?)</datedeb[^>]*>,ims',
561        'datefin' => ',<datefin[^>]*>(.*?)</datefin[^>]*>,ims',
562        'titre' => ',<titre[^>]*>(.*?)</titre[^>]*>,ims',
563        'statut' => ',<statut[^>]*>(.*?)</statut[^>]*>,ims',
564        'desc' => ',<desc[^>]*>(.*?)</desc[^>]*>,ims',
565        'lieu' => ',<lieu[^>]*>(.*?)</lieu[^>]*>,ims',
566        'adresse' => ',<adresse[^>]*>(.*?)</adresse[^>]*>,ims',
567        'horaire' => ',<horaire[^>]*>(.*?)</horaire[^>]*>,ims',
568        'motevts' => ',<motevts[^>]*>(.*?)</motevts[^>]*>,ims',
569    );
570
571    $xml_motevt_tags = array('groupe', 'titre');
572    $motevt_regexp = array(
573        'motevt' => ',<motevt[>[:space:]],i',
574        'motevtfin' => '</motevt>',
575        'groupe' => ',<groupe[^>]*>(.*?)</groupe[^>]*>,ims',
576        'titre' => ',<titre[^>]*>(.*?)</titre[^>]*>,ims',
577    );
578
579    // fichier backend correct ?
580    if (!is_spip2spip_backend($rss)) return _T('spip2spip:avis_echec_syndication_01');
581
582    // Echapper les CDATA
583    $echappe_cdata = array();
584    if (preg_match_all(',<!\[CDATA\[(.*)]]>,Uims', $rss, $regs, PREG_SET_ORDER)) {
585        foreach ($regs as $n => $reg) {
586            $echappe_cdata[$n] = $reg[1];
587            $rss = str_replace($reg[0], "@@@SPIP_CDATA$n@@@", $rss);
588        }
589    }
590
591    // supprimer les commentaires
592    $rss = preg_replace(',<!--\s+.*\s-->,Ums', '', $rss);
593
594    // multi (pas echappe)
595    $rss = str_replace("&lt;multi&gt;", "@@@MULTI@@@", $rss);
596    $rss = str_replace("&lt;/multi&gt;", "@@@MULTJ@@@", $rss);
597
598    // lien interne  <- (pas echappe)
599    $rss = str_replace("&lt;-", "@@@LIEN_INV@@@", $rss);
600
601    // version du flux
602    $version_flux = 0;
603    if (preg_match_all(',<spip2spip version="(.*?)">,Uims', $rss, $r, PREG_SET_ORDER)) foreach ($r as $regs) {
604        $version_flux = (float)$regs[1];
605    }
606    spip_log("version flux: $version_flux", "spiptospip");
607
608    // differences des traitements selon les versions du flux
609    if ($version_flux <= "1.8") {
610            $key = array_search('auteurs', $xml_tags);
611            unset($xml_tags[$key]);
612    } else {
613            $key = array_search('auteur', $xml_tags);
614            unset($xml_tags[$key]);
615    }
616
617    // analyse de chaque item
618    $items = array();
619    if (preg_match_all($syndic_regexp['item'], $rss, $r, PREG_SET_ORDER)) foreach ($r as $regs) {
620        $debut_item = strpos($rss, $regs[0]);
621        $fin_item = strpos($rss, $syndic_regexp['itemfin']) + strlen($syndic_regexp['itemfin']);
622        $items[] = substr($rss, $debut_item, $fin_item - $debut_item);
623        $debut_texte = substr($rss, "0", $debut_item);
624        $fin_texte = substr($rss, $fin_item, strlen($rss));
625        $rss = $debut_texte . $fin_texte;
626    }
627
628    // Analyser chaque <item>...</item> du backend et le transformer en tableau
629    if (!count($items)) return _T('spip2spip:avis_echec_syndication_01');
630
631    foreach ($items as $item) {
632
633        $data = array();
634
635        // Date
636        /* Pas trop compris cette partie, mais cela gènait l'import de la date de l'article (si cette methode est choisie). Je commente donc et présuppose que la date du RSS est bonne.
637        $la_date = "";
638        if (preg_match(",<date>([^<]*)</date>,Uims",$item,$match))      $la_date = $match[1];
639        if ($la_date)       $la_date = my_strtotime($la_date);
640        if ($la_date < time() - 365 * 24 * 3600 OR $la_date > time() + 48 * 3600)       $la_date = time();
641        $data['date'] = $la_date;
642        */
643
644        // version du flux
645        $data['version_flux'] = $version_flux;
646
647        // Recuperer les autres tags du xml
648        foreach ($xml_tags as $xml_tag) {
649            if (preg_match($syndic_regexp[$xml_tag], $item, $match))
650                    $data[$xml_tag] = $match[1];
651                else
652                    $data[$xml_tag] = "";
653        }
654
655        // On parse le noeud documents
656        if ($data['documents'] != "") {
657            $documents = array();
658            if (preg_match_all($document_regexp['document'], $data['documents'], $r2, PREG_SET_ORDER)) foreach ($r2 as $regs) {
659                $debut_item = strpos($data['documents'], $regs[0]);
660                $fin_item = strpos($data['documents'], $document_regexp['documentfin']) + strlen($document_regexp['documentfin']);
661                $documents[] = substr($data['documents'], $debut_item, $fin_item - $debut_item);
662                $debut_texte = substr($data['documents'], "0", $debut_item);
663                $fin_texte = substr($data['documents'], $fin_item, strlen($data['documents']));
664                $data['documents'] = $debut_texte . $fin_texte;
665            }
666
667            $portfolio = array();
668            if (count($documents)) {
669                foreach ($documents as $document) {
670                    $data_node = array();
671                    foreach ($xml_doc_tags as $xml_doc_tag) {
672                        if (preg_match($document_regexp[$xml_doc_tag], $document, $match)) $data_node[$xml_doc_tag] = $match[1];
673                        else $data_node[$xml_doc_tag] = "";
674                    }
675                    $portfolio[] = $data_node;
676                }
677                $data['documents'] = serialize($portfolio);
678            }
679        } // noeud documents
680
681        // On parse le noeud evenement
682        if ($data['evenements'] != "") {
683            $evenements = array();
684            if (preg_match_all($evenement_regexp['evenement'], $data['evenements'], $r3, PREG_SET_ORDER)) foreach ($r3 as $regs) {
685                $debut_item = strpos($data['evenements'], $regs[0]);
686                $fin_item = strpos($data['evenements'], $evenement_regexp['evenementfin']) + strlen($evenement_regexp['evenementfin']);
687                $evenements[] = substr($data['evenements'], $debut_item, $fin_item - $debut_item);
688                $debut_texte = substr($data['evenements'], "0", $debut_item);
689                $fin_texte = substr($data['evenements'], $fin_item, strlen($data['evenements']));
690                $data['evenements'] = $debut_texte . $fin_texte;
691            }
692
693            $agenda = array();
694            if (count($evenements)) {
695                foreach ($evenements as $evenement) {
696
697                    $data_node = array();
698                    foreach ($xml_event_tags as $xml_event_tag) {
699                        if (preg_match($evenement_regexp[$xml_event_tag], $evenement, $match)) $data_node[$xml_event_tag] = $match[1];
700                        else $data_node[$xml_event_tag] = "";
701                    }
702
703                    // bug lieu et desc  (suite au p)
704                    $data_node['lieu'] = strip_tags(html_entity_decode($data_node['lieu']));
705                    $data_node['adresse'] = html_entity_decode($data_node['adresse']);
706                    $data_node['desc'] = strip_tags(html_entity_decode($data_node['desc']));
707
708                    // On parse le noeud motevt (mot evenement) ?
709                    if ($data_node['motevts'] != "") {
710                        $motevts = array();
711                        if (preg_match_all($motevt_regexp['motevt'], $data_node['motevts'], $r2, PREG_SET_ORDER)) foreach ($r2 as $regs) {
712                            $debut_item = strpos($data_node['motevts'], $regs[0]);
713                            $fin_item = strpos($data_node['motevts'], $motevt_regexp['motevtfin']) + strlen($motevt_regexp['motevtfin']);
714                            $motevts[] = substr($data_node['motevts'], $debut_item, $fin_item - $debut_item);
715                            $debut_texte = substr($data_node['motevts'], "0", $debut_item);
716                            $fin_texte = substr($data_node['motevts'], $fin_item, strlen($data_node['motevts']));
717                            $data_node['motevts'] = $debut_texte . $fin_texte;
718                        }
719
720                        $motcleevt = array();
721                        if (count($motevts)) {
722                            foreach ($motevts as $motevt) {
723                                $data_node_evt = array();
724                                foreach ($xml_motevt_tags as $xml_motevt_tag) {
725                                    if (preg_match($motevt_regexp[$xml_motevt_tag], $motevt, $match)) $data_node_evt[$xml_motevt_tag] = $match[1];
726                                    else $data_node_evt[$xml_motevt_tag] = "";
727                                }
728                                $motcleevt[] = $data_node_evt;
729                            }
730                            $data_node['motevts'] = $motcleevt;
731                        }
732                    }
733
734                    // #noeud motevt
735
736                    $agenda[] = $data_node;
737                }
738
739                $data['evenements'] = base64_encode(serialize($agenda));
740                 // astuce php.net
741
742            }
743        } //noeud evenements
744
745        // On parse le noeud mots
746        if ($data['mots'] != "") {
747            $mots = array();
748            if (preg_match_all($mot_regexp['mot'], $data['mots'], $r2, PREG_SET_ORDER)) foreach ($r2 as $regs) {
749                $debut_item = strpos($data['mots'], $regs[0]);
750                $fin_item = strpos($data['mots'], $mot_regexp['motfin']) + strlen($mot_regexp['motfin']);
751                $mots[] = substr($data['mots'], $debut_item, $fin_item - $debut_item);
752                $debut_texte = substr($data['mots'], "0", $debut_item);
753                $fin_texte = substr($data['mots'], $fin_item, strlen($data['mots']));
754                $data['mots'] = $debut_texte . $fin_texte;
755            }
756
757            $motcle = array();
758            if (count($mots)) {
759                foreach ($mots as $mot) {
760                    $data_node = array();
761                    foreach ($xml_mot_tags as $xml_mot_tag) {
762                        if (preg_match($mot_regexp[$xml_mot_tag], $mot, $match)) $data_node[$xml_mot_tag] = $match[1];
763                        else $data_node[$xml_mot_tag] = "";
764                    }
765                    $motcle[] = $data_node;
766                }
767                $data['mots'] = serialize($motcle);
768            }
769        } // noeud mots
770
771        // On parse le noeud auteurs
772        if ($data['auteurs'] != "") {
773            $auteurs = array();
774            if (preg_match_all($auteur_regexp['auteur'], $data['auteurs'], $r2, PREG_SET_ORDER)) foreach ($r2 as $regs) {
775                $debut_item = strpos($data['auteurs'], $regs[0]);
776                $fin_item = strpos($data['auteurs'], $auteur_regexp['auteurfin']) + strlen($auteur_regexp['auteurfin']);
777                $auteurs[] = substr($data['auteurs'], $debut_item, $fin_item - $debut_item);
778                $debut_texte = substr($data['auteurs'], "0", $debut_item);
779                $fin_texte = substr($data['auteurs'], $fin_item, strlen($data['auteurs']));
780                $data['auteurs'] = $debut_texte . $fin_texte;
781            }
782
783            $auteurs_articles = array();
784            if (count($auteurs)) {
785                foreach ($auteurs as $auteur) {
786                    $data_node = array();
787                    foreach ($xml_auteur_tags as $xml_auteur_tag) {
788                        if (preg_match($auteur_regexp[$xml_auteur_tag], $auteur, $match)) $data_node[$xml_auteur_tag] = $match[1];
789                        else $data_node[$xml_auteur_tag] = "";
790                    }
791                    $auteurs_articles[] = $data_node;
792                }
793
794                $auteurs = array();
795                // on transforme en tableau simple
796                foreach($auteurs_articles as $auteurs_article)
797                        $auteurs[] = $auteurs_article['auteur_item'];
798
799                $data['auteur'] = serialize($auteurs);
800            }
801
802        }  // noeud auteurs
803
804        // Nettoyer les donnees et remettre les CDATA et multi en place
805        foreach ($data as $var => $val) {
806            $data[$var] = filtrer_entites($data[$var]);
807            foreach ($echappe_cdata as $n => $e) $data[$var] = str_replace("@@@SPIP_CDATA$n@@@", $e, $data[$var]);
808            if (!defined("_SPIP2SPIP_IMPORT_HTML")) $data[$var] = trim(textebrut($data[$var]));
809             // protection import HTML
810            $data[$var] = str_replace("@@@MULTI@@@", "<multi>", $data[$var]);
811            $data[$var] = str_replace("@@@MULTJ@@@", "</multi>", $data[$var]);
812            $data[$var] = str_replace("@@@LIEN_INV@@@", "<-", $data[$var]);
813        }
814
815        $articles[] = $data;
816    }
817
818    return $articles;
819}
820
821// -----------------------
822// Fonctions SQL
823// -----------------------
824
825//
826// recuperer id_rubrique (normalement uniquement) lié à un mot
827function spip2spip_get_id_rubrique($mot) {
828    $id_group_spip2spip = spip2spip_get_id_groupemot("- spip2spip -");
829    $result = sql_select("id_mot", "spip_mots", array("titre = " . sql_quote($mot), "id_groupe = '$id_group_spip2spip'"));
830    while ($row = sql_fetch($result)) {
831        $id_mot = (int)$row['id_mot'];
832        if ($row2 = sql_fetsel("id_objet", "spip_mots_liens", "objet='rubrique' AND id_mot='$id_mot'")) return $row2['id_objet'];
833    }
834    return false;
835}
836
837//
838// recupère id d'un groupe de mots-clés
839function spip2spip_get_id_groupemot($titre) {
840    if ($row = sql_fetsel("id_groupe", "spip_groupes_mots", "titre=" . sql_quote($titre))) return $row['id_groupe'];
841    return false;
842}
843
844//
845// recupère id d'un mot
846function spip2spip_get_id_mot($titre) {
847    if ($row = sql_fetsel("id_mot", "spip_mots", "titre=" . sql_quote($titre))) return $row['id_mot'];
848    return false;
849}
850
851//
852// recupère id du secteur
853function spip2spip_get_id_secteur($id_rubrique) {
854    if ($row = sql_fetsel("id_secteur", "spip_rubriques", "id_rubrique=$id_rubrique")) return $row['id_secteur'];
855    return 0;
856}
857
858//
859// recupere id d'un auteur selon son nom sinon le creer
860function spip2spip_get_id_auteur($name) {
861    if (trim($name) == "") return false;
862    if ($row = sql_fetsel("id_auteur", "spip_auteurs", "nom=" . sql_quote($name))) return $row['id_auteur'];
863
864    // auteur inconnu, on le cree ...
865    return sql_insertq('spip_auteurs', array('nom' => $name, 'statut' => '1comite'));
866}
867
868//
869// insert un mot-cle a un objet (article / evenement)
870function spip2spip_insert_mode_article($id_objet, $mot_titre, $groupe_titre, $mode_creer_groupe, $id_groupe = - 1, $objet_lie = "article") {
871
872    if ($mode_creer_groupe) {
873
874        // groupe existe ?
875        if ($row = sql_fetsel("id_groupe", "spip_groupes_mots", "titre=" . sql_quote($groupe_titre))) {
876            $id_groupe = $row['id_groupe'];
877        } else {
878            $id_groupe = sql_insertq('spip_groupes_mots', array('titre' => $groupe_titre, 'tables_liees' => $objet_lie . "s", 'minirezo' => 'oui', 'comite' => 'oui', 'forum' => 'non'));
879        }
880    }
881
882    if ($id_groupe > 0) {
883
884        // mot existe ?
885        if ($row = sql_fetsel("id_mot", "spip_mots", "titre=" . sql_quote($mot_titre) . " AND id_groupe=" . intval($id_groupe))) {
886            $id_mot = $row['id_mot'];
887        } else {
888            if ($row = sql_fetsel("titre", "spip_groupes_mots", "id_groupe=" . intval($id_groupe))) $type = $row['titre'];
889            $id_mot = sql_insertq('spip_mots', array('titre' => $mot_titre, 'id_groupe' => intval($id_groupe), 'type' => $type));
890        }
891
892        sql_insertq("spip_mots_liens", array('id_mot' => intval($id_mot), 'id_objet' => intval($id_objet), 'objet' => $objet_lie));
893    } else {
894        spip_log("pas de groupe-clé import specifie", "spiptospip");
895    }
896}
897
898// insérer nouvelle thématique du flux
899function spip2spip_set_thematique($titre) {
900    $id_group_spip2spip = spip2spip_get_id_groupemot("- spip2spip -");
901    $mot = sql_fetsel('id_mot', 'spip_mots', 'id_groupe=' . intval($id_group_spip2spip) . " AND titre=" . sql_quote($titre));
902    if (!$mot) {
903        $thematique_cree = sql_insertq('spip_mots', array('titre' => $titre, 'id_groupe' => $id_group_spip2spip));
904        return $thematique_cree;
905    } else {
906        return $mot['id_mot'];
907    }
908}
909
910// -----------------------
911// Fonctions de formatage
912// -----------------------
913
914//
915// restaure le formatage des extra
916function spip2spip_convert_extra($texte, $documents, $version_flux = 1.6) {
917    $texte = spip2spip_convert_ln($texte, $version_flux);
918    $texte = spip2spip_convert_img($texte, $documents);
919    return $texte;
920}
921
922//
923// restaure le formatage des img et doc avec le tableau fourni
924function spip2spip_convert_img($texte, $documents) {
925    $texte_avt_regex = $texte;
926    krsort($documents);
927    foreach ($documents as $k => $val) {
928        $texte = preg_replace("/__IMG$k(.*?)__/i", "<img$val$1>", $texte);
929
930        // si le doc est employe en tant image, changer son mode pour qu'il sorte du portfolio (mode=document) et passe en image (mode=image)
931        if ($texte_avt_regex != $texte) spip2spip_update_mode_document($val, 'image');
932
933        // autre mise a jour non image
934        $texte = preg_replace("/__DOC$k(.*?)__/i", "<doc$val$1>", $texte);
935
936        $texte_avt_regex = $texte;
937    }
938
939    //$texte = preg_replace("/__(IMG|DOC)(.*?)__/i", "",$texte); // nettoyage des codes qui resteraient eventuellement
940    $texte = preg_replace("/__(.*?)__/i", "", $texte);
941     // expression plus large (pour prevoir la compatabilite future si ajout d'autres extras)
942    return $texte;
943}
944
945//
946// restaure le formatage des ln
947function spip2spip_convert_ln($texte, $version_flux = 1.6) {
948    if ($version_flux < 1.7) {
949        $texte = str_replace("__LN__", "\n\n", $texte);
950    } else {
951        $texte = str_replace("__LN__", "\n", $texte);
952    }
953    return $texte;
954}
955
956//
957// change le mode (vignette/document/) du document
958function spip2spip_update_mode_document($id_document, $mode = "vignette") {
959    sql_updateq('spip_documents', array("mode" => $mode), "id_document=$id_document");
960}
Note: See TracBrowser for help on using the repository browser.