erreur xmlimport
authormarc.nachin <you@example.commarc.nachin@auf.org>
Mon, 10 Sep 2012 12:52:32 +0000 (14:52 +0200)
committermarc.nachin <you@example.commarc.nachin@auf.org>
Mon, 10 Sep 2012 12:52:32 +0000 (14:52 +0200)
lodel-0.9/scripts/xmlimport.php

index 5eeb4e6..8e561d4 100644 (file)
-<?php
-/**
- * Fichier de la classe XMLImport
+<?
+/*
  *
- * PHP versions 4 et 5
+ *  LODEL - Logiciel d'Edition ELectronique.
  *
- * LODEL - Logiciel d'Edition ELectronique.
+ *  Copyright (c) 2001-2002, Ghislain Picard, Marin Dacos
+ *  Copyright (c) 2003, Ghislain Picard, Marin Dacos, Luc Santeramo, Nicolas Nutten, Anne Gentil-Beccot
  *
- * Copyright (c) 2001-2002, Ghislain Picard, Marin Dacos
- * Copyright (c) 2003, Ghislain Picard, Marin Dacos, Luc Santeramo, Nicolas Nutten, Anne Gentil-Beccot
- * Copyright (c) 2004, Ghislain Picard, Marin Dacos, Luc Santeramo, Anne Gentil-Beccot, Bruno Cénou
- * Copyright (c) 2005, Ghislain Picard, Marin Dacos, Luc Santeramo, Gautier Poupeau, Jean Lamy, Bruno Cénou
- * Copyright (c) 2006, Marin Dacos, Luc Santeramo, Bruno Cénou, Jean Lamy, Mikaël Cixous, Sophie Malafosse
- * Copyright (c) 2007, Marin Dacos, Bruno Cénou, Sophie Malafosse, Pierre-Alain Mignot
- * Copyright (c) 2008, Marin Dacos, Bruno Cénou, Pierre-Alain Mignot, Inès Secondat de Montesquieu, Jean-François Rivière
- * Copyright (c) 2009, Marin Dacos, Bruno Cénou, Pierre-Alain Mignot, Inès Secondat de Montesquieu, Jean-François Rivière
+ *  Home page: http://www.lodel.org
  *
- * Home page: http://www.lodel.org
+ *  E-Mail: lodel@lodel.org
  *
- * E-Mail: lodel@lodel.org
+ *                            All Rights Reserved
  *
- * All Rights Reserved
+ *     This program is free software; you can redistribute it and/or modify
+ *     it under the terms of the GNU General Public License as published by
+ *     the Free Software Foundation; either version 2 of the License, or
+ *     (at your option) any later version.
  *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
+ *     This program is distributed in the hope that it will be useful,
+ *     but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *     GNU General Public License for more details.
  *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- * @author Ghislain Picard
- * @author Jean Lamy
- * @copyright 2001-2002, Ghislain Picard, Marin Dacos
- * @copyright 2003, Ghislain Picard, Marin Dacos, Luc Santeramo, Nicolas Nutten, Anne Gentil-Beccot
- * @copyright 2004, Ghislain Picard, Marin Dacos, Luc Santeramo, Anne Gentil-Beccot, Bruno Cénou
- * @copyright 2005, Ghislain Picard, Marin Dacos, Luc Santeramo, Gautier Poupeau, Jean Lamy, Bruno Cénou
- * @copyright 2006, Marin Dacos, Luc Santeramo, Bruno Cénou, Jean Lamy, Mikaël Cixous, Sophie Malafosse
- * @copyright 2007, Marin Dacos, Bruno Cénou, Sophie Malafosse, Pierre-Alain Mignot
- * @copyright 2008, Marin Dacos, Bruno Cénou, Pierre-Alain Mignot, Inès Secondat de Montesquieu, Jean-François Rivière
- * @copyright 2009, Marin Dacos, Bruno Cénou, Pierre-Alain Mignot, Inès Secondat de Montesquieu, Jean-François Rivière
- * @licence http://www.gnu.org/copyleft/gpl.html
- * @version CVS:$Id:
- * @package lodel
- * @since Fichier ajouté depuis la version 0.8
- */
-
-/**
- * Classe XMLImport
- * 
- * Import XMLLodelBasic file in the database
- *
- * @package lodel
- * @author Ghislain Picard
- * @author Jean Lamy
- * @copyright 2005, Ghislain Picard, Marin Dacos, Luc Santeramo, Gautier Poupeau, Jean Lamy, Bruno Cénou
- * @copyright 2006, Marin Dacos, Luc Santeramo, Bruno Cénou, Jean Lamy, Mikaël Cixous, Sophie Malafosse
- * @copyright 2007, Marin Dacos, Bruno Cénou, Sophie Malafosse, Pierre-Alain Mignot
- * @licence http://www.gnu.org/copyleft/gpl.html
- * @since Classe ajoutée depuis la version 0.8
- */
-class XMLImportParser
+ *     You should have received a copy of the GNU General Public License
+ *     along with this program; if not, write to the Free Software
+ *     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.*/
+
+
+$GLOBALS[prefixregexp]="Pr\.|Dr\.";
+//
+// fonction d'import d'un fichier en XMLLodelBasic dans la base
+//
+
+require_once($home."entitefunc.php");
+
+
+function enregistre_entite_from_xml($context,$text,$classe)
+
 {
-       /**
-        * Styles principaux
-        * @var array
-        */
-       var $commonstyles;
-       
-       /**
-        * Styles contextuels
-        * @var array
-        */
-       var $contextstyles;
-       
-       /**
-        * Styles courant
-        * @var array
-        */
-       var $cstyles;
-       
-       /**
-        * Classe du document
-        * @var string
-        */
-       var $mainclass;
-
-       /**
-        * Constructeur
-        */
-       function XMLImportParser()
-       {
+  global $home;
+
+  $localcontext=$context;
+  //xml_parse_into_struct_ns($text,&$vals,&$index);
+
+  $result=mysql_query("SELECT $GLOBALS[tp]champs.nom,style,type,traitement FROM $GLOBALS[tp]champs,$GLOBALS[tp]groupesdechamps WHERE idgroupe=$GLOBALS[tp]groupesdechamps.id AND classe='$classe' AND $GLOBALS[tp]champs.statut>0 AND $GLOBALS[tp]groupesdechamps.statut>0 AND style!=''") or die (mysql_error());
+
+  $sets=array();
+  while (list($nom,$style,$type,$traitement)=mysql_fetch_row($result)) {
+    require_once($home."textfunc.php");
+
+    if ($type=="mltext") { // text multilingue
+      require_once($home."champfunc.php");
+      $stylesarr=decode_mlstyle($style);
+    } else {
+      $stylesarr=array($style);
+    }
+    if ($localcontext[entite][$nom]) die ("Error: Two fields have the same name. Please correct in admin/champs.php");
+    foreach ($stylesarr as $lang=>$style) {
+      // look for that tag
+#    echo "$nom $style $type $traitement<br>";
+      if (preg_match("/<r2r:$style>(.*?)<\/r2r:$style>/s",$text,$result2)) {
+       $value=$result2[1];
+
+       // type speciaux
+       if ($type=="date") { // date
+         require_once($home."date.php");
+         $value=mysqldate(strip_tags($value));
        }
 
-       /**
-        * Initialisation du parser
-        *
-        * Initialize the parser, getting all the styles defined in the ME : internal styles 
-        * and characterstyles (synonym styles and different language styles are detected).
-        *
-        * @param string $class the name of the class of the object (entity) imported
-        */
-       function init($class)
-       {
-               global $phpversion;
-               if (!$this->commonstyles) {
-                       defined('INC_FUNC') || include 'func.php';
-                       // get internal styles and prepare them (detect synonym styles, same style in different lang)
-                       $dao = DAO::getDAO('internalstyles');
-                       $iss = $dao->findMany('status > 0');
-                       foreach ($iss as $is) {
-                               // analyse the styles
-                               foreach (preg_split("/[,;]/", $is->style) as $style) {
-                                       $this->_prepare_style($style, $is);
-                                       if ($style)
-                                               $this->commonstyles[$style] = $is;
-                               }
-                       }
-                       // get characterstyles
-                       $dao = DAO::getDAO('characterstyles');
-                       $css = $dao->findMany('status > 0');
-                       foreach ($css as $cs) {
-                               foreach (preg_split("/[,;]/", $cs->style) as $style) {
-                                       $this->_prepare_style($style, $cs);
-                                       if ($style)
-                                               $this->commonstyles[$style] = $cs;
-                               }
-                       }
-               }
-               $phpversion = explode('.', PHP_VERSION);
-               $this->_init_class($class);
-               $this->mainclass = $class;
-       } //end of init()
-
-       /**
-        * Analyse du contenu XHTML de l'entité
-        *
-        * Parse the XHTML contents of the entity and send the data to the $handler object
-        * This function is a hard piece of work.
-        * I choose not to go to DOM too avoid using lot of memory and processing
-        * to build the tree but I'm not sure to perform much better here.
-        * @param string $string the string to parse
-        * @param object &$handler the handler of the parser
-        */
-       function parse($string, &$handler)
-       {
-               $this->handler = &$handler; // non-reentrant
-               # ! Pay attention to the following line ! 
-               $this->handler->commonstyles = $this->commonstyles; //get the styles used to parse the doc
-               $arr = preg_split("/<(\/?)soo:block(>|\s+class=\"[^\"]*\"\s*>)/", $string, -1, PREG_SPLIT_DELIM_CAPTURE); //split the string using the ServOO block <soo:block>
-               //$arr contain now all the elements of the doc
-               /* the array is constructed like the following
-                       [1] => 
-                       [2] => tablefieldsvo Object or internalstylesvo Object
-                       [3] => content
-                       [4] => / (end of the object)
-                       [5] => tablefieldsvo Object or internalstylesvo Object
-                        this explain why in the loop the iterator on the object is incremented by 3.
-               */
-
-               unset ($string); // save memory
-               $this->_objectize($arr, true); // make object whereever it is possible.
-       
-               // second pass
-               // process the internalstyles
-               // this is an hard piece of code doing no so much... but I find no better way.
-               $isave = false;
-               $n = count($arr);
-               for ($i = 1; $i < $n; $i += 3) { //for each block element
-                       if ($arr[$i] == "/" || !is_object($arr[$i +1]))
-                               continue;
-                       $obj = & $arr[$i +1];
-                       $class = strtolower(get_class($obj));
-                       if (!$isave && $class == 'internalstylesvo') {
-                               $forcenext = false;
-                               if ($obj->surrounding == "-*") {
-                                       // check what is the previous on.
-                                       if ($arr[$i -3] == "/" && strtolower(get_class($arr[$i -2])) == 'tablefieldsvo') {
-                                               // good, put the closing tag further
-                                               $closing = array_splice($arr, $i -3, 3);
-                                               $i += 3;
-                                               array_splice($arr, $i, 0, $closing); // put after the closing internalstyles 
-                                       } else {
-                                               $forcenext = true;
-                                       }
-                                       continue;
-                               }
-                               if ($forcenext || $obj->surrounding == "*-") {
-                                       $isave = $i; // where to insert the next opening
-                               } else {
-                                       // surrounding is a proper tag
-                                       $obj = & $this->commonstyles[$obj->surrounding];
-                                       array_splice($arr, $i, 0, array ('', $obj, '')); // opening tag
-                                       $i += 3;
-                                       $n += 3;
-                                       array_splice($arr, $i +6, 0, array ("/", $obj, '')); // closing tag after the closing internal tag
-                                       $n += 3;
-                               }
-                       }       else
-                               if ($class == 'tablefieldsvo' && $isave) {
-                                       // put the opening at $isave
-                                       $arr[$i -1] .= $arr[$i +2]; // copy data. This is not the most efficient, must the nicest way to do
-                                       $arr[$i +2] = '';
-                                       $opening = array_splice($arr, $i, 3);
-                                       array_splice($arr, $isave, 0, $opening);
-                                       $isave = false;
-                               }
-               } // end for
-
-               // deal with the non-greedy internalstyle
-               // data using such style and containing table, lists, ... are modified : those elements are excluded
-               // a little bit hard, isn't it ?
-               for ($i = 1; $i < $n; $i += 3) {
-                       if (!is_object($arr[$i +1]))
-                               continue;
-                       $obj = & $arr[$i +1];
-                       $class = strtolower(get_class($obj));
-                       if ($class != 'internalstylesvo' || $obj->greedy)
-                               continue;
-                       if ($arr[$i] == "/") {
-                               // closing
-                       }       else {
-                               $arr2 = preg_split("/(<\/?)((?:table|ul|ol|dl|dd|pre|blockquote|object)\b[^>]*>)/", $arr[$i +2], -1, PREG_SPLIT_DELIM_CAPTURE);
-                               $arr[$i +2] = $arr2[0];
-                               $m = count($arr2);
-                               $blockel = 0;
-                               for ($j = 1; $j < $m; $j += 3) {
-                                       if ($arr2[$j] == '</') { // closing
-                                               $arr[$i +2] .= $arr2[$j].$arr2[$j +1];
-                                               $blockel --;
-                                               if ($blockel == 0) {
-                                                       array_splice($arr, $i +3, 0, array ("", $obj, "")); // opening tag
-                                                       $i += 3;
-                                                       $n += 3;
-                                               }
-                                       } else {
-                                               // opening
-                                               $blockel ++;
-                                               if ($blockel == 1) {
-                                                       array_splice($arr, $i +3, 0, array ("/", $obj, '')); // closing tag
-                                                       $i += 3;
-                                                       $n += 3;
-                                               }
-                                               $arr[$i +2] .= $arr2[$j].$arr2[$j +1];
-                                       }
-                                       $arr[$i +2] .= $arr2[$j +2];
-                               }
-                       } // opening
-               }
-               // proper parser. Launch the handlers
-               $datastack = array ();
-               $classstack = array (array ($this->mainclass, 'entities'));
-               $handler->openClass($classstack[0]);
-               $this->nbdoc = 0;
-               
-               for ($i = 1; $i < $n; $i += 3) {
-                       $this->_parseOneStep($arr, $i, $datastack, $classstack, 'block');
-                       
-                       $larr = preg_split("/<(\/)?soo:inline(>|\s+class=\"[^\"]*\"\s*>)/", $arr[$i +2], -1, PREG_SPLIT_DELIM_CAPTURE);
-                       $nj = count($larr);
-                       $datastack[0] .= $larr[0];
-                       if ($nj > 1) {
-                               $this->_objectize($larr, false);
-                               for ($j = 1; $j < $nj; $j += 3) {
-                                       $this->_parseOneStep($larr, $j, $datastack, $classstack, 'inline');
-                                       $datastack[0] .= $larr[$j +2];
-                               }
-                       }
-               }
-               // close the last tags
-               while ($classstack) {
-                       $handler->closeClass(array_shift($classstack), $this->nbdoc > 1);
-               }
-       
-       } // end of function parser
-
-       /**
-        * Première étape du parser
-        *
-        * do one step of the parser.
-        * 1/ call the handler corresponding to the current style/tag/object
-        * 2/ change the context if required
-        * 3/ feed the datastack
-        *
-        * @param array &$arr ??
-        * @param integer $i ??
-        * @param array &$datastack pile des données
-        * @param array &$classstack pile des classes utilisées
-        * @param string $level can be inline or ?
-        * @access private
-        */
-       function _parseOneStep(& $arr, $i, & $datastack, & $classstack, $level)
-       {
-               //echo $classstack[0];
-               $opening = $arr[$i] != "/";
-               $obj = & $arr[$i +1];
-               if (((!$opening && isset($arr[$i +4]) && $obj == $arr[$i +4]) || ($opening && isset($arr[$i -2]) && $obj == $arr[$i -2])) && (strtolower(get_class($obj)) != 'internalstylesvo' || $obj->greedy)) {
-                       // current closing equals next opening
-                       // or current opening equals last closing
-                       return;
-               }
-               if(!isset($datastack[0])) $datastack[0] = '';
-               if (!is_object($obj)) {
-                       // unknow style
-                       if ($opening) {
-                               if ($level == 'inline') {
-                                       array_unshift($datastack, '');
-                               } else {
-                                       $datastack[0] = "";
-                               }
-                       } elseif ($obj == 'documents') {
-                               // do nothing
-                       } else {
-                               if ($level == 'inline') {
-                                       $data = array_shift($datastack);
-                                       $datastack[0] .= $this->handler->unknownCharacterStyle($obj, $data);
-                               } else {
-                                       // close up to the base
-                                       while (count($classstack) > 1) {
-                                               $this->handler->closeClass($classstack[0]);
-                                               array_shift($classstack);
-                                       }
-                                       $datastack[0] = $this->handler->unknownParagraphStyle($obj, $datastack[0]);
-                               }
-                       }
-                       return;
-               }
-               $class = strtolower(get_class($obj));
-               switch ($class) {
-                       case 'internalstylesvo' :
-                       case 'characterstylesvo' :
-                               if ($opening) {
-                                       array_unshift($datastack, '');
-                               } else {
-                                       $call = 'process'. substr($class, 0, -2);
-                                       #echo count($datastack);
-                                       $data = array_shift($datastack);
-                                       $datastack[0] .= $this->handler->$call ($obj, $data); // call the method associated with the object class
-                               }
-                       break;
-                       case 'tablefieldsvo' :
-                               $cstyles = & $this->contextstyles[$classstack[0][0]];
-                               if (empty($cstyles[$obj->style])) { // context change    ?
-                                       $this->handler->closeClass($classstack[0]);
-                                       $cl = array_shift($classstack);
-                                       if (empty($this->contextstyles[$cl[0]][$obj->style])) {
-                                               // must be in the context below
-                                               // if not... problem.
-                                       }
-                                       // new context
-                               }
-                               if ($opening) {
-                                       if ($obj->g_name == 'dc.title' && count($classstack) == 1) {
-                                               $this->nbdoc++;
-                                               if ($this->nbdoc > 1) {
-                                                       $this->handler->closeClass($classstack[0], true);
-                                                       $this->handler->openClass($classstack[0], null, true);
-                                               }
-                                       }
-                                       array_unshift($datastack, '');
-                               } else {
-                                       $data = array_shift($datastack);
-                                       $datastack[0] .= $this->handler->processTableFields($obj, $data); // call the method associated with the object class
-                               }
-                               break;
-                       case 'entrytypesvo' :
-                       case 'persontypesvo' :
-                               if ($opening) { // opening. Switch the lowest context
-                                       // close up to the base
-                                       while (count($classstack) > 1) {
-                                               $this->handler->closeClass($classstack[0]);
-                                               array_shift($classstack);
-                                       }
-                                       array_unshift($datastack, "");
-       
-                                       // change the context
-                                       $classtype = $class == 'entrytypesvo' ? 'entries' : 'persons';
-                                       array_unshift($classstack, array ($obj->class, $classtype));
-                                       $this->handler->openClass($classstack[0], $obj);
-                               }       else {
-                                       $call = 'process'. substr($class, 0, -2);
-                                       $this->handler->$call ($obj, $datastack[0]); // call the method associated with the object class
-                                       $datastack[0] = '';
-                               }
-                               break;
-                       default :
-                               trigger_error("ERROR: internal error in XMLImportParser::parse. Unknown class $class", E_USER_ERROR);
-               }
-       } //end of _parse_step_one
-
-       /**
-        * Initialise la classe en cherchant à savoir ce qu'il faut faire avec les styles
-        * détectés. (suivant les champs définies dans le ME).
-        *
-        * Gather information from tablefield to know what to do with the various styles.
-        * class is the context and criteria is the where to select the tablefields
-        *
-        * @param string $class the name of the class to init
-        * @param string $criteria the possible SQL criterions (by default empty)
-        */
-       function _init_class($class, $criteria = '')
-       {
-               global $phpversion;
-//             if(!function_exists('clone')) // pour pouvoir utiliser clone en php5
-//                     require 'php4.inc.php';
-       
-               if (isset($this->contextstyles[$class]))
-                       return; // already done
-
-               // get all the information from the database for all the fields
-               $dao = DAO::getDAO('tablefields');
-               if (!$criteria) {
-                       $criteria = "class='".$class."'";
-               }
-               $tfs = $dao->findMany("(".$criteria.") AND status>0");
-               
-               // create an assoc array style => tf information
-               foreach ($tfs as $tf) {
-                       // is it an index ?
-                       if ($tf->type == 'entries' || $tf->type == 'persons') {
-                               // yes, it's an index. Get the object
-                               $dao = DAO::getDAO($tf->type == 'entries' ? 'entrytypes' : 'persontypes');
-                               $tf = $dao->find("type='".$tf->name."'");
-                               $this->_init_class($tf->class, "class='".$tf->class."' OR class='entities_".$tf->class. "'");
-                       }
-                       // analyse the styles of the tablefields
-                       foreach (preg_split("/[,;]/", $tf->style) as $style) {
-                                       $tf2 = clone ($tf);
-                                       $this->_prepare_style($style, $tf2);
-                                       if ($style)
-                                               $this->commonstyles[$style] = $this->contextstyles[$class][$style] = $tf2;
-                       }
-               }
-       } //end of init_class
-
-       /**
-        * Prépare un style pour stocakge en détectant les synonymes et les langues d'un style
-        * Prepare the style for storage detecting synonyms and same language style
-        *
-        * @param string &$style the name of the style
-        * @param object &$object the VO corresponding to the style
-        */
-       function _prepare_style(& $style, & $obj)
-       {
-               $style = strtolower(trim($style));
-               // style synonyme. take the first one
-               @list ($style, $lang) = explode(":", $style);
-               if ($lang) {
-                       $obj->lang = $lang;
-                       $obj->style = $style;
-               } else {
-                       // style synonyme. take the first one
-                       $obj->style = preg_replace("/[:,;].*$/", '', $obj->style);
-               }
+       if ($traitement) { // processing ?
+         $traitements=preg_split("/\|/",$traitement);
+         foreach ($traitements as $traitement) {
+#echo "trait: $traitement";
+           if (preg_match("/^([A-Za-z][A-Za-z_0-9]*)(?:\((.*?)\))?$/",$traitement,$result3)) { 
+             if ($result3[2]) $result3[2]=$result3[2].",";
+             $func=create_function('$x','return '.$result3[1].'('.$result3[2].'$x);');
+             $value=$func($value);
+           }
+         }
+       } // processing
+
+       // enleve les styles de caracteres
+       $value=addslashes(trim(preg_replace("/<\/?r2rc:[^>]+>/","",$value)));
+
+       // now record the $value
+       if ($type=="mltext") {
+         $localcontext[entite][$nom][$lang]=$value;
+       } else {
+         $localcontext[entite][$nom]=$value;
        }
+      } // if found style found in the text
+    } // foreach styles for mltext
+  } // foreach fields.
+
+  if (!$localcontext[idtype]) {
+    // check if the document exists, if not we really need the type
+    if (!$localcontext[id]) die("Preciser un type in xmlimport.php");
+    // get the idtype
+    $result=mysql_query("SELECT idtype FROM $GLOBALS[tp]entites WHERE id='$localcontext[id]'") or die(mysql_error());
+    if (!mysql_num_rows($result)) die("Internal ERROR: The entites $localcontext[id] should exists.");
+    list($localcontext[idtype])=mysql_fetch_row($result);
+  }
+
+  enregistre_personnes_from_xml(&$localcontext,$text);
+  enregistre_entrees_from_xml(&$localcontext,$text);
+
+#  print_r($localcontext);
+
+#  print_r($localcontext);
+
+  $id=enregistre_entite (&$localcontext,0,$classe,"",FALSE); // on ne genere pas d'erreur... Tant pis !
+
+  // ok, maintenant, il faut rechercher les images et corriger leur location.
+
+  function mv_image($imgfile,$ext,$count,$id) {
+    $dir="docannexe/$id";
+    if (!is_dir("../../".$dir)) mkdir("../../".$dir,0700);
+    $newfile="$dir/img-$count.$ext";
+    copy($imgfile,"../../".$newfile);
+    @unlink($imgfile);
+    return $newfile;
+  }
+  $result=mysql_query("SELECT * FROM $GLOBALS[tp]$classe WHERE identite='$id'") or die (mysql_error());
+  $row=mysql_fetch_assoc($result);
+  require_once($home."func.php");
+  copy_images($row,"mv_image",$id);
+  myaddslashes($row);
+  foreach ($row as $field=>$value) { $row[$field]=$field."='".$value."'"; }
+  mysql_query("UPDATE $GLOBALS[tp]$classe SET ".join(",",$row)." WHERE identite='$id'") or die (mysql_error());
+  // fin du deplacement des images
+
+
+  return $id;
+}
+
+
+
 
-       /**
-        * Remplace un style par un objet quand c'est possible
-        *
-        * Replace style by object whenever it is possible
-        *
-        * @param array &$arr an array containing all the elements of a doc
-        * @param boolean $blockstyle true if the style is a block style and false if not
-        */
-       function _objectize(& $arr, $blockstyle)
-       {
-               $stylesstack = array ();
-               $n = count($arr);
-               for ($i = 1; $i < $n; $i += 3) {
-                       $opening = $arr[$i] != "/";
-                       if ($opening) { // opening tag
-                               if (!preg_match("/class=\"([^\"]*)\"/", $arr[$i +1], $result))
-                                       trigger_error("ERROR: in _objectize", E_USER_ERROR);
-                               $name = preg_replace("/\W/", "", makeSortKey($result[1]));
-                               $obj = & $this->commonstyles[$blockstyle ? $name : ".".$name];
-                               if ($obj) {
-                                       $arr[$i +1] = & $obj;
-                               } else {
-                                       $arr[$i +1] = $name;
-                               }
-                               array_push($stylesstack, $arr[$i +1]);
-                       } else { // closingtag
-                               $arr[$i +1] = array_pop($stylesstack);
-                               continue; // nothing to do
-                       }
-               }
-               if ($stylesstack) {
-                       print_r($arr);
-                       print_r($stylesstack);
-                       trigger_error("ERROR: XML is likely invalid in XMLImportParser::_objectize", E_USER_ERROR);
-               }
+function enregistre_personnes_from_xml (&$localcontext,$text)
+
+{
+  if (!$localcontext[idtype]) die("Internal ERROR: probleme in enregistre_personnes_from_xml");
+
+  $result=mysql_query("SELECT id,style,styledescription FROM $GLOBALS[tp]typepersonnes,$GLOBALS[tp]typeentites_typepersonnes WHERE statut>0 AND idtypepersonne=id AND idtypeentite='$localcontext[idtype]'") or die (mysql_error());
+  while (list($idtype,$style,$styledescription)=mysql_fetch_row($result)) {
+    // accouple les balises personnes et description
+    // non, on ne fait plus comme ca. $text=preg_replace ("/(<\/r2r:$style>)\s*(<r2r:description>.*?<\/r2r:description>)/si","\\2\\1",$text);
+    // cherche toutes les balises de personnes
+    preg_match_all ("/<r2r:$style>(.*?)<\/r2r:$style>/s",$text,$results2,PREG_SET_ORDER);
+    // cherche toutes les balises de description de personnes
+    preg_match_all ("/<r2r:$styledescription>(.*?)<\/r2r:$styledescription>/s",$text,$results2description,PREG_SET_ORDER);
+#    echo "result2: style=$style";
+#    echo htmlentities($text);
+#    print_r($results2);
+
+    $i=1;
+
+    while ($result2=array_shift($results2)) { // parcours les resultats.
+      $val=trim($result2[1]);
+      // description ?
+      $result2description=array_shift($results2description); // parcours les descriptions.
+      // cherche s'il y a un bloc description
+      $descrpersonne=$result2description ? $result2description[1] : "";
+
+
+#    echo htmlentities($descrpersonne)."<br><br>\n\n";
+      $personnes=preg_split ("/\s*[,;]\s*/",strip_tags($val,"<r2rc:prenom><r2rc:prefix><r2rc:nom>"));
+
+      while (($personne=array_shift($personnes))) {
+
+       list ($prefix,$prenom,$nom)=decodepersonne($personne);
+       #echo "personne: $personne ; $nom<br>\n";
+
+       $localcontext[nomfamille][$idtype][$i]=$nom;
+       $localcontext[prefix][$idtype][$i]=$prefix;
+       $localcontext[prenom][$idtype][$i]=$prenom;
+
+       // est-ce qu'on a une description et est-ce qu'elle est pour cet personne ?
+       if ($descrpersonne && !$personnes)  { // oui, c'est le dernier personne de cette liste, s'il y a un bloc description, alors c'est pour lui !
+         // on recupere les balises du champ description
+         $balises=array("fonction","affiliation","courriel");
+         foreach ($balises as $balise) {
+           if (preg_match("/<r2rc:$balise>(.*?)<\/r2rc:$balise>/s",$descrpersonne,$result4)) {
+             $localcontext[$balise][$idtype][$i]=trim($result4[1]);
+           }
+         } // foreach
+         
+         // on efface tous les styles de caracteres
+         $localcontext[description][$idtype][$i]=preg_replace("/<\/?r2rc:[^>]+>/","",$descrpersonne);
+       } // ok, on a traite la description
+       $i++;
+      }
+    } // parcourt les resultats
+  } // type de personne
+}
+
+
+function decodepersonne($personne) 
+
+{
+  // on regarde s'il y a un prefix
+  // d'abord on cherche s'il y a un style de caractere, sinon, on cherche les prefix classiques definis dans la variables prefixregexp.
+  if (preg_match_all("/<r2rc:prefix>(.*?)<\/r2rc:prefix>/",$personne,$results,PREG_SET_ORDER)) {
+    $prefix="<r2r:prefix>";
+    foreach($results as $result) {
+      $prefix.=$result[1];
+      $personne=str_replace($result[0],"",$personne); //nettoie le champ personne
+    }
+    $prefix.="</r2r:prefix>";
+  } elseif (preg_match("/^\s*($GLOBALS[prefixregexp])\s/",$personne,$result2)) {
+    $prefix="$result2[1]";
+    $personne=str_replace($result2[0],"",$personne); // a partir de php 4.3.0 il faudra utiliser OFFSET_CAPTURE.
+  } else {
+    $prefix="";
+  }
+  // ok on le prefix
+
+
+  // on cherche maintenant si on a le prenom
+  $have_prenom=0; $have_nom=0;
+  if (preg_match_all("/<r2rc:prenom>(.*?)<\/r2rc:prenom>/",$personne,$results,PREG_SET_ORDER)) {
+    $prenoms=array(); // tableau pour les prenoms
+    foreach($results as $result) {
+      array_push($prenoms,trim($result[1]));
+      $personne=str_replace($result[0],"",$personne); //nettoie l'personne
+    }
+    $prenom=join(" ",$prenoms); // join les prenoms
+    $nom=$personne; // c'est le reste
+    $have_prenom=1;
+  }      
+  // on cherche maintenant si on a le nom
+  if (preg_match_all("/<r2rc:nom>(.*?)<\/r2rc:nom>/",$personne,$results,PREG_SET_ORDER)) {
+    $noms=array(); // tableau pour les noms
+    foreach($results as $result) {
+      array_push($noms,trim($result[1]));
+      $personne=str_replace($result[0],"",$personne); //nettoie l'personne
+    }
+    $nom=join(" ",$noms); // join les noms
+    if (!$have_prenom) $prenom=$personne; // le reste c'est le prenom sauf si on a deja detecte le prenom
+    $have_nom=1;
+  }
+  // si on a pas de style de caractere, alors on essaie de deviner !
+  if (!$have_prenom && !$have_nom) {
+    // ok, on cherche maintenant a separer le nom et le prenom
+    $nom=$personne;
+    while ($nom && strtoupper($nom)!=$nom) { $nom=substr(strstr($nom," "),1);}
+    if ($nom) {
+      $prenom=str_replace($nom,"",$personne);
+    } else { // sinon coupe apres le premiere espace
+      if (preg_match("/^\s*(.*?)\s+([^\s]+)\s*$/i",$personne,$result)) {
+       $prenom=$result[1]; $nom=$result[2];
+      } else $nom=$personne;
+    }
+  }
+  return array($prefix,$prenom,$nom);
+}
+
+
+function enregistre_entrees_from_xml (&$localcontext,$text)
+
+{
+  global $home;
+
+  if (!$localcontext[idtype]) die("Internal ERROR: probleme in enregistre_personnes_from_xml");
+
+  $result=mysql_query("SELECT id,style FROM $GLOBALS[tp]typeentrees,$GLOBALS[tp]typeentites_typeentrees WHERE statut>0 AND idtypeentree=id AND idtypeentree='$lodelcontext[idtype]'") or die (mysql_error());
+  require_once($home."champfunc.php");
+
+  while (list($idtype,$style)=mysql_fetch_row($result)) {
+    // decode the multilingue style.
+    $styles=decode_mlstyle($style);
+    foreach($styles as $lang => $style) { // foreach multilingue style
+
+      preg_match_all ("/<r2r:$style>\s*(.*?)\s*<\/r2r:$style>/si",$text,$results2,PREG_SET_ORDER);
+      $i=0;
+      foreach ($results2 as $result2) {
+       $val=strip_tags($result2[1]);
+       $tags=preg_split ("/[,;]/",strip_tags($val));
+       foreach($tags as $tag) {
+         if ($lang && $lang!="--") { // is the language really defined ?
+           $localcontext[entrees][$idtype][$i][lang]=$lang;
+           $localcontext[entrees][$idtype][$i][nom]=trim($tag);
+         } else {
+           $localcontext[entrees][$idtype][$i]=trim($tag);
+         }
+         $i++;
        }
-} // end of class XMLImportParser
-?>
+      }
+    }
+  }
+}
+
+
+?>
\ No newline at end of file