PageRenderTime 50ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 0ms

/spip/ecrire/inc/import_insere.php

https://github.com/eyeswebcrea/espace-couture-sittler.fr
PHP | 488 lines | 338 code | 60 blank | 90 comment | 64 complexity | c45156526105f240699dce5bae119b68 MD5 | raw file
Possible License(s): LGPL-2.1, GPL-3.0
  1. <?php
  2. /***************************************************************************\
  3. * SPIP, Systeme de publication pour l'internet *
  4. * *
  5. * Copyright (c) 2001-2011 *
  6. * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
  7. * *
  8. * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
  9. * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
  10. \***************************************************************************/
  11. if (!defined('_ECRIRE_INC_VERSION')) return;
  12. // http://doc.spip.org/@insere_1_init
  13. function insere_1_init($request) {
  14. // table des translations
  15. $field = array(
  16. "type" => "VARCHAR(16) NOT NULL",
  17. "ajout" => "integer NOT NULL", // en fait booleen
  18. "titre" => "text NOT NULL",
  19. "id_old" => "bigint (21) DEFAULT '0' NOT NULL",
  20. "id_new" => "bigint (21) DEFAULT '0' NOT NULL");
  21. $key = array(
  22. "PRIMARY KEY" => "id_old, id_new, type",
  23. "KEY id_old" => "id_old");
  24. $v = sql_create('spip_translate', $field, $key, true);
  25. if (!$v) {
  26. spip_log("echec de la creation de la table de fusion");
  27. return false;
  28. }
  29. // au cas ou la derniere fois ce serait terminee anormalement
  30. sql_delete("spip_translate");
  31. // pour PG
  32. $GLOBALS['tables_principales']['spip_translate'] =
  33. array('field' => $field, 'key' => $key);
  34. return insere_1bis_init($request);
  35. }
  36. // http://doc.spip.org/@insere_1bis_init
  37. function insere_1bis_init($request) {
  38. // l'insertion porte sur les tables principales ...
  39. $t = array_keys($GLOBALS['tables_principales']);
  40. // ... mais pas cette table a cause de la duplication des login
  41. unset($t[array_search('spip_auteurs', $t)]);
  42. // ni celle-ci, les qui est liee implicitement a la precedente
  43. unset($t[array_search('spip_messages', $t)]);
  44. // et pour celles-ci restent a programmer les regles
  45. unset($t[array_search('spip_forum', $t)]);
  46. unset($t[array_search('spip_syndic', $t)]);
  47. unset($t[array_search('spip_signatures', $t)]);
  48. return $t;
  49. }
  50. // En passe 2, relire les tables principales et les tables auxiliaires
  51. // sur les mots et les documents car on sait les identifier
  52. // http://doc.spip.org/@insere_2_init
  53. function insere_2_init($request) {
  54. $t = insere_1bis_init($request);
  55. // ne pas importer cette table, son homologue est prioritaire
  56. unset($t[array_search('spip_types_documents', $t)]);
  57. $t[]= 'spip_mots_articles';
  58. $t[]= 'spip_mots_breves';
  59. $t[]= 'spip_mots_rubriques';
  60. $t[]= 'spip_mots_syndic';
  61. $t[]= 'spip_mots_forum';
  62. $t[]= 'spip_mots_documents';
  63. $t[]= 'spip_documents_liens';
  64. return $t;
  65. }
  66. // construire le tableau PHP de la table spip_translate
  67. // (mis en table pour pouvoir reprendre apres interruption)
  68. // http://doc.spip.org/@translate_init
  69. function translate_init($request) {
  70. include_spip('inc/texte'); // pour les Regexp des raccourcis
  71. include_spip('inc/chercher_logo'); // pour les noms des logos
  72. include_spip('inc/distant'); // pour recuperer les logos
  73. $q = sql_select('*', "spip_translate");
  74. $trans = array();
  75. while ($r = sql_fetch($q)) {
  76. $trans[$r['type']][$r['id_old']] = array($r['id_new'], $r['titre'], $r['ajout']);
  77. }
  78. return $trans;
  79. }
  80. // http://doc.spip.org/@import_insere
  81. function import_insere($values, $table, $desc, $request, $atts) {
  82. static $jesais = array();
  83. $type_id = $desc['key']["PRIMARY KEY"];
  84. // reserver une place dans les tables principales si nouveau
  85. $ajout = 0;
  86. if ((!function_exists($f = 'import_identifie_' . $type_id))
  87. OR (!($n = $f($values, $table, $desc, $request)))) {
  88. // pas d'importation de types_doc (a revoir)
  89. if ($table == 'spip_types_documents') return;
  90. $n = sql_insertq($table);
  91. $ajout=1;
  92. }
  93. if (is_array($n))
  94. list($id, $titre) = $n;
  95. else {$id = $n; $titre = "";}
  96. sql_insertq('spip_translate', array(
  97. 'id_old' => $values[$type_id],
  98. 'id_new' => $id,
  99. 'titre' => $titre,
  100. 'type' => $type_id,
  101. 'ajout' => $ajout));
  102. }
  103. // Renumerotation des entites collectees
  104. // Appelle la fonction specifique a la table, ou a defaut la std.
  105. // Le tableau de correspondance est global, et permet qu'un numero
  106. // d'une entite soit calcule une seule fois, a sa premiere occurrence.
  107. // (Mais des requetes avec jointures eviteraient sa construction. A voir)
  108. // http://doc.spip.org/@import_translate
  109. function import_translate($values, $table, $desc, $request, $atts) {
  110. if (!function_exists($f = 'import_translate_' . $table))
  111. $f = 'import_translate_std';
  112. $f($values, $table, $desc, $request, $atts);
  113. }
  114. // La fonction d'insertion apres renumerotation.
  115. // Afin qu'inserer une 2e fois la meme sauvegarde ne change pas la base,
  116. // chaque entree de la sauvegarde est ignoree s'il existe une entree
  117. // de meme titre avec le meme contexte (parent etc) dans la base installee.
  118. // Une synchronisation plus fine serait preferable, cf [8004]
  119. // http://doc.spip.org/@import_inserer_translate
  120. function import_inserer_translate($values, $table, $desc, $request, $atts) {
  121. global $trans;
  122. $p = $desc['key']["PRIMARY KEY"];
  123. $v = $values[$p];
  124. if (!isset($trans[$p]) OR !isset($trans[$p][$v]) OR $trans[$p][$v][2]){
  125. sql_replace($table, $values);
  126. $on = isset($atts['on']) ? ($atts['on']) : '';
  127. $off = isset($atts['off']) ? ($atts['off']) : '';
  128. if ($on OR $off) {
  129. $t = type_du_logo($p);
  130. $url = $request['url_site'];
  131. if (!$url) $url = $atts['adresse_site'];
  132. if (substr($url,-1) !='/') $url .='/';
  133. $url .= $atts['dir_logos'];
  134. $new = $trans[$p][$v][0];
  135. if ($on) {
  136. if ($logo = recuperer_page($url . $t . "on$v." . $on))
  137. ecrire_fichier(_DIR_LOGOS. $t . "on$new." . $on, $logo);
  138. }
  139. if ($off) {
  140. if ($logo = recuperer_page($url . $t . "off$v." . $off))
  141. ecrire_fichier(_DIR_LOGOS. $t . "off$new." . $off, $logo);
  142. }
  143. }
  144. }
  145. }
  146. // Insertion avec renumerotation, y compris des raccourcis.
  147. // http://doc.spip.org/@import_translate_std
  148. function import_translate_std($values, $table, $desc, $request, $atts) {
  149. foreach ($values as $k => $v) {
  150. if ($k=='id_parent' OR $k=='id_secteur')
  151. $type = 'id_rubrique';
  152. else $type = $k;
  153. $values[$k]= importe_raccourci(importe_translate_maj($type, $v));
  154. }
  155. import_inserer_translate($values, $table, $desc, $request, $atts);
  156. }
  157. // http://doc.spip.org/@import_translate_spip_articles
  158. function import_translate_spip_articles($values, $table, $desc, $request, $atts) {
  159. $v = $values['chapo'];
  160. if ($v[0]=='=' AND preg_match(_RACCOURCI_CHAPO, substr($v,1)))
  161. $values['chapo'] = '=[->' . substr($v,1) . ']';
  162. if ($request['statut'] == 'on' AND $values['statut'] == 'publie')
  163. $values['statut'] = 'prop';
  164. import_translate_std($values, $table, $desc, $request, $atts);
  165. }
  166. // http://doc.spip.org/@import_translate_spip_breves
  167. function import_translate_spip_breves($values, $table, $desc, $request, $atts) {
  168. if ($request['statut'] == 'on' AND $values['statut'] == 'publie')
  169. $values['statut'] = 'prop';
  170. import_translate_std($values, $table, $desc, $request, $atts);
  171. }
  172. // Les doc importes deviennent distants, a fortiori s'ils etaient deja
  173. // Gerer les vieilles sauvegardes oů le Path etait en dur
  174. // http://doc.spip.org/@import_translate_spip_documents
  175. function import_translate_spip_documents($values, $table, $desc, $request, $atts) {
  176. if ($values['distant'] === 'oui') {
  177. $url = '';
  178. } else {
  179. $values['distant'] = 'oui';
  180. $url = $request['url_site'];
  181. if (!$url) $url = $atts['adresse_site'];
  182. if (substr($url,-1) !='/') $url .='/';
  183. // deja dans la BD avant cette epoque
  184. if ($atts['version_base'] >= '1.934')
  185. $url .= $atts['dir_img'];
  186. }
  187. $url .= $values['fichier'];
  188. unset($values['fichier']);
  189. foreach ($values as $k => $v) {
  190. $values[$k]= importe_raccourci(importe_translate_maj($k, $v));
  191. }
  192. $values['fichier'] = $url;
  193. import_inserer_translate($values, $table, $desc, $request, $atts);
  194. }
  195. function import_translate_spip_documents_liens($values, $table, $desc, $request, $atts) {
  196. $values['id_document']= (importe_translate_maj('id_document', $values['id_document']));
  197. $values['id_objet']= (importe_translate_maj('id_' .$values['objet'], $values['id_objet']));
  198. sql_replace($table, $values);
  199. }
  200. // Fonction de renumerotation, par delegation aux fonction specialisees
  201. // Si une allocation est finalement necessaire, celles-ci doivent repercuter
  202. // la renumerotation sur la table SQL temporaire pour qu'en cas de reprise
  203. // sur Time-Out il n'y ait pas reallocation.
  204. // En l'absence d'allocation, cet acces SQL peut etre omis, quitte a
  205. // recalculer le nouveau numero si une autre occurrence est rencontree
  206. // a la reprise. Pas dramatique.
  207. // http://doc.spip.org/@importe_translate_maj
  208. function importe_translate_maj($k, $v)
  209. {
  210. global $trans;
  211. if (!(isset($trans[$k]) AND isset($trans[$k][$v]))) return $v;
  212. list($g, $titre, $ajout) = $trans[$k][$v];
  213. if ($g <= 0) {
  214. $f = 'import_identifie_parent_' . $k;
  215. if (function_exists($f)) {
  216. $g = $f($g, $titre, $v);
  217. if ($g > 0)
  218. // memoriser qu'on insere
  219. $trans[$k][$v][2]=1;
  220. else $g = (0-$g);
  221. $trans[$k][$v][0] = $g;
  222. } else spip_log("$f manquante");
  223. }
  224. return $g;
  225. }
  226. define('_RACCOURCI_MODELE_ALL', '@' . _RACCOURCI_MODELE .'@isS');
  227. // http://doc.spip.org/@importe_raccourci
  228. function importe_raccourci($v)
  229. {
  230. if (preg_match_all(_RACCOURCI_LIEN, $v, $m, PREG_SET_ORDER)) {
  231. foreach ($m as $regs) {
  232. // supprimer 'http://' ou 'mailto:'
  233. $lien = vider_url($regs[count($regs)-1]);
  234. if ($match = typer_raccourci($lien)) {
  235. list($f,$objet,$id,$params,$ancre) = $match;
  236. $k = 'id_' . $f;
  237. $g = importe_translate_maj($k, $id);
  238. if ($g != $id) {
  239. $rac = '[' . $regs[1] . '->' . $regs[2] . $objet . $g . $params . $ancre .']';
  240. $v = str_replace($regs[0], $rac, $v);
  241. }
  242. }
  243. }
  244. }
  245. if (preg_match_all(_RACCOURCI_MODELE_ALL, $v, $m, PREG_SET_ORDER)) {
  246. foreach ($m as $regs) {
  247. $g = importe_translate_maj('id_document', $regs[3]);
  248. if ($g != $regs[3]) {
  249. $rac = '<' . $regs[2] . $g . $regs[4] . '>' . $regs[5];
  250. $v = str_replace($regs[0], $rac, $v);
  251. }
  252. }
  253. }
  254. return $v;
  255. }
  256. // un document importe est considere comme identique a un document local
  257. // s'ils ont meme taille et meme nom et que le present n'est pas detruit
  258. // Et ne pas importer les incoherences (docs sans extension)
  259. // http://doc.spip.org/@import_identifie_id_document
  260. function import_identifie_id_document($values, $table, $desc, $request) {
  261. if (!$values['extension']) return false;
  262. $t = $values['taille'];
  263. $f = $values['fichier'];
  264. $h = $request['url_site'] . $f;
  265. $r = sql_fetsel("id_document AS id, fichier AS titre, distant", "spip_documents", "taille=" . sql_quote($t) . " AND (fichier=" . sql_quote($f) . " OR fichier= " . sql_quote($h) . ')');
  266. if (!$r) return false;
  267. if (($r['distant'] != 'oui')
  268. AND !file_exists(_DIR_IMG . $r['titre']))
  269. return false;
  270. return array($r['id'], $r['titre']);
  271. }
  272. // un type de document importe est considere comme identique a un type present
  273. // s'ils ont meme extension et meme titre
  274. // Sinon il ne sera PAS importe
  275. // http://doc.spip.org/@import_identifie_id_type
  276. function import_identifie_id_type($values, $table, $desc, $request) {
  277. $e = $values['extension'];
  278. $t = $values['titre'];
  279. $r = sql_fetsel("id_type AS id, titre", "spip_types_documents", "extension=" . sql_quote($e) . " AND titre=" . sql_quote($t));
  280. return $r ? array($r['id'], $r['titre']) : false;
  281. }
  282. // deux groupes de mots ne peuvent avoir le meme titre ==> identification
  283. // http://doc.spip.org/@import_identifie_id_groupe
  284. function import_identifie_id_groupe($values, $table, $desc, $request) {
  285. $r = sql_fetsel("id_groupe AS id, titre", "spip_groupes_mots", "titre=" . sql_quote($values['titre']));
  286. return $r ? array($r['id'], $r['titre']) : false;
  287. }
  288. // pour un mot le titre est insuffisant, il faut aussi l'identite du groupe.
  289. // Memoriser ces 2 infos et le signaler a import_translate grace a 1 negatif
  290. // http://doc.spip.org/@import_identifie_id_mot
  291. function import_identifie_id_mot($values, $table, $desc, $request) {
  292. return array((0 - $values['id_groupe']), $values['titre']);
  293. }
  294. // Passe 2: mot de meme titre et de meme groupe ==> identification
  295. // http://doc.spip.org/@import_identifie_parent_id_mot
  296. function import_identifie_parent_id_mot($id_groupe, $titre, $v)
  297. {
  298. global $trans;
  299. $titre = sql_quote($titre);
  300. $id_groupe = 0-$id_groupe;
  301. if (isset($trans['id_groupe'])
  302. AND isset($trans['id_groupe'][$id_groupe])) {
  303. $new = $trans['id_groupe'][$id_groupe][0];
  304. $r = sql_fetsel("id_mot", "spip_mots", "titre=$titre AND id_groupe=$new" );
  305. if ($r) return (0 - $r['id_mot']);
  306. }
  307. if ($r = sql_insertq('spip_mots'))
  308. sql_replace('spip_translate', array(
  309. 'id_old' => $v,
  310. 'id_new' => $r,
  311. 'titre' => $titre,
  312. 'type' => 'id_mot',
  313. 'ajout' => 1));
  314. else spip_log("Impossible d'inserer dans spip_mots");
  315. return $r;
  316. }
  317. // idem pour les articles
  318. // http://doc.spip.org/@import_identifie_id_article
  319. function import_identifie_id_article($values, $table, $desc, $request) {
  320. return array((0 - $values['id_rubrique']), $values['titre']);
  321. }
  322. // Passe 2 des articles comme pour les mots
  323. // http://doc.spip.org/@import_identifie_parent_id_article
  324. function import_identifie_parent_id_article($id_parent, $titre, $v)
  325. {
  326. $id_parent = importe_translate_maj('id_rubrique', (0 - $id_parent));
  327. $titre = sql_quote($titre);
  328. $r = sql_fetsel("id_article", "spip_articles", "titre=$titre AND id_rubrique=$id_parent AND statut<>'poubelle'" );
  329. if ($r) return (0 - $r['id_article']);
  330. if ($r = sql_insertq('spip_articles'))
  331. sql_replace('spip_translate', array(
  332. 'id_old' => $v,
  333. 'id_new' => $r,
  334. 'titre' => $titre,
  335. 'type' => 'id_article',
  336. 'ajout' => 1),
  337. $GLOBALS['tables_principales']['spip_translate']
  338. );
  339. else spip_log("Impossible d'inserer dans spip_articles");
  340. return $r;
  341. }
  342. // idem pour les breves
  343. // http://doc.spip.org/@import_identifie_id_breve
  344. function import_identifie_id_breve($values, $table, $desc, $request) {
  345. return array((0 - $values['id_rubrique']), $values['titre']);
  346. }
  347. // Passe 2 des breves comme pour les mots
  348. // http://doc.spip.org/@import_identifie_parent_id_breve
  349. function import_identifie_parent_id_breve($id_parent, $titre, $v)
  350. {
  351. $id_parent = importe_translate_maj('id_rubrique', (0 - $id_parent));
  352. $titre = sql_quote($titre);
  353. $r = sql_fetsel("id_breve", "spip_breves", "titre=$titre AND id_rubrique=$id_parent AND statut<>'refuse'" );
  354. if ($r) return (0 - $r['id_breve']);
  355. if ($r = sql_insertq('spip_breves'))
  356. sql_replace('spip_translate', array(
  357. 'id_old' => $v,
  358. 'id_new' => $r,
  359. 'titre' => $titre,
  360. 'type' => 'id_breve',
  361. 'ajout' => 1),
  362. $GLOBALS['tables_principales']['spip_translate']
  363. );
  364. else spip_log("Impossible d'inserer dans spip_breves");
  365. return $r;
  366. }
  367. // pour une rubrique le titre est insuffisant, il faut l'identite du parent
  368. // Memoriser ces 2 infos et le signaler a import_translate grace a 1 negatif
  369. // http://doc.spip.org/@import_identifie_id_rubrique
  370. function import_identifie_id_rubrique($values, $table, $desc, $request) {
  371. return array((0 - $values['id_parent']), $values['titre']);
  372. }
  373. // Passe 2 des rubriques, renumerotation en cascade.
  374. // rubrique de meme titre et de meme parent ==> identification
  375. // http://doc.spip.org/@import_identifie_parent_id_rubrique
  376. function import_identifie_parent_id_rubrique($id_parent, $titre, $v)
  377. {
  378. global $trans;
  379. if (isset($trans['id_rubrique'])) {
  380. if ($id_parent < 0) {
  381. $id_parent = (0 - $id_parent);
  382. $gparent = $trans['id_rubrique'][$id_parent][0];
  383. // parent deja renumerote depuis le debut la passe 2
  384. if ($gparent >= 0)
  385. $id_parent = $gparent;
  386. else {
  387. // premiere occurrence du parent
  388. $pitre = $trans['id_rubrique'][$id_parent][1];
  389. $n = import_identifie_parent_id_rubrique($gparent, $pitre, $id_parent);
  390. $trans['id_rubrique'][$id_parent][0] = ($n>0) ? $n: (0-$n);
  391. // parent tout neuf,
  392. // pas la peine de chercher un titre homonyme
  393. if ($n > 0) {
  394. $trans['id_rubrique'][$id_parent][2]=1; // nouvelle rub.
  395. return import_alloue_id_rubrique($n, $titre, $v);
  396. } else $id_parent = (0 - $n);
  397. }
  398. }
  399. $r = sql_fetsel("id_rubrique", "spip_rubriques", "titre=" . sql_quote($titre) . " AND id_parent=" . intval($id_parent));
  400. if ($r) {
  401. return (0 - $r['id_rubrique']);
  402. }
  403. return import_alloue_id_rubrique($id_parent, $titre, $v);
  404. }
  405. }
  406. // reserver la place en mettant titre et parent tout de suite
  407. // pour que le SELECT ci-dessus fonctionne a la prochaine occurrence
  408. // http://doc.spip.org/@import_alloue_id_rubrique
  409. function import_alloue_id_rubrique($id_parent, $titre, $v) {
  410. if ($r = sql_insertq('spip_rubriques', array('titre' => $titre, id_parent => $id_parent)))
  411. sql_replace('spip_translate', array(
  412. 'id_old' => $v,
  413. 'id_new' => $r,
  414. 'titre' => $titre,
  415. 'type' => 'id_rubrique',
  416. 'ajout' => 1),
  417. $GLOBALS['tables_principales']['spip_translate']);
  418. else spip_log("Impossible d'inserer dans spip_rubriques");
  419. return $r;
  420. }
  421. ?>