[ Index ]
 

Code source de SPIP 1.9.2c

Accédez au Source d'autres logiciels libres

title

Body

[fermer]

/ecrire/inc/ -> import_insere.php (source)

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


Généré le : Wed Nov 21 10:20:27 2007 par Balluche grâce à PHPXref 0.7
  Clicky Web Analytics