print
[auf_bulletin.git] / lodel-0.9 / scripts / xmlimport.php
1 <?
2 /*
3 *
4 * LODEL - Logiciel d'Edition ELectronique3.
5 *
6 * Copyright (c) 2001-2002, Ghislain Picard, Marin Dacos
7 * Copyright (c) 2003, Ghislain Picard, Marin Dacos, Luc Santeramo, Nicolas Nutten, Anne Gentil-Beccot
8 *
9 * Home page: http://www.lodel.org
10 *
11 * E-Mail: lodel@lodel.org
12 *
13 * All Rights Reserved
14 *
15 * This program is free software; you can redistribute it and/or modify
16 * it under the terms of the GNU General Public License as published by
17 * the Free Software Foundation; either version 2 of the License, or
18 * (at your option) any later version.
19 *
20 * This program is distributed in the hope that it will be useful,
21 * but WITHOUT ANY WARRANTY; without even the implied warranty of
22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23 * GNU General Public License for more details.
24 *
25 * You should have received a copy of the GNU General Public License
26 * along with this program; if not, write to the Free Software
27 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.*/
28
29
30 $GLOBALS[prefixregexp]="Pr\.|Dr\.";
31 //
32 // fonction d'import d'un fichier en XMLLodelBasic dans la base
33 //
34
35 require_once($home."entitefunc.php");
36
37
38 function enregistre_entite_from_xml($context,$text,$classe)
39
40 {
41 global $home;
42
43 $localcontext=$context;
44 //xml_parse_into_struct_ns($text,&$vals,&$index);
45
46 $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());
47
48 $sets=array();
49 while (list($nom,$style,$type,$traitement)=mysql_fetch_row($result)) {
50 require_once($home."textfunc.php");
51
52 if ($type=="mltext") { // text multilingue
53 require_once($home."champfunc.php");
54 $stylesarr=decode_mlstyle($style);
55 } else {
56 $stylesarr=array($style);
57 }
58 if ($localcontext[entite][$nom]) die ("Error: Two fields have the same name. Please correct in admin/champs.php");
59 foreach ($stylesarr as $lang=>$style) {
60 // look for that tag
61 # echo "$nom $style $type $traitement<br>";
62 if (preg_match("/<r2r:$style>(.*?)<\/r2r:$style>/s",$text,$result2)) {
63 $value=$result2[1];
64
65 // type speciaux
66 if ($type=="date") { // date
67 require_once($home."date.php");
68 $value=mysqldate(strip_tags($value));
69 }
70
71 if ($traitement) { // processing ?
72 $traitements=preg_split("/\|/",$traitement);
73 foreach ($traitements as $traitement) {
74 #echo "trait: $traitement";
75 if (preg_match("/^([A-Za-z][A-Za-z_0-9]*)(?:\((.*?)\))?$/",$traitement,$result3)) {
76 if ($result3[2]) $result3[2]=$result3[2].",";
77 $func=create_function('$x','return '.$result3[1].'('.$result3[2].'$x);');
78 $value=$func($value);
79 }
80 }
81 } // processing
82
83 // enleve les styles de caracteres
84 $value=addslashes(trim(preg_replace("/<\/?r2rc:[^>]+>/","",$value)));
85
86 // now record the $value
87 if ($type=="mltext") {
88 $localcontext[entite][$nom][$lang]=$value;
89 } else {
90 $localcontext[entite][$nom]=$value;
91 }
92 } // if found style found in the text
93 } // foreach styles for mltext
94 } // foreach fields.
95
96 if (!$localcontext[idtype]) {
97 // check if the document exists, if not we really need the type
98 if (!$localcontext[id]) die("Preciser un type in xmlimport.php");
99 // get the idtype
100 $result=mysql_query("SELECT idtype FROM $GLOBALS[tp]entites WHERE id='$localcontext[id]'") or die(mysql_error());
101 if (!mysql_num_rows($result)) die("Internal ERROR: The entites $localcontext[id] should exists.");
102 list($localcontext[idtype])=mysql_fetch_row($result);
103 }
104
105 enregistre_personnes_from_xml(&$localcontext,$text);
106 enregistre_entrees_from_xml(&$localcontext,$text);
107
108 # print_r($localcontext);
109
110 # print_r($localcontext);
111
112 $id=enregistre_entite (&$localcontext,0,$classe,"",FALSE); // on ne genere pas d'erreur... Tant pis !
113
114 // ok, maintenant, il faut rechercher les images et corriger leur location.
115
116 function mv_image($imgfile,$ext,$count,$id) {
117 $dir="docannexe/$id";
118 if (!is_dir("../../".$dir)) mkdir("../../".$dir,0700);
119 $newfile="$dir/img-$count.$ext";
120 copy($imgfile,"../../".$newfile);
121 @unlink($imgfile);
122 return $newfile;
123 }
124 $result=mysql_query("SELECT * FROM $GLOBALS[tp]$classe WHERE identite='$id'") or die (mysql_error());
125 $row=mysql_fetch_assoc($result);
126 require_once($home."func.php");
127 copy_images($row,"mv_image",$id);
128 myaddslashes($row);
129 foreach ($row as $field=>$value) { $row[$field]=$field."='".$value."'"; }
130 mysql_query("UPDATE $GLOBALS[tp]$classe SET ".join(",",$row)." WHERE identite='$id'") or die (mysql_error());
131 // fin du deplacement des images
132
133
134 return $id;
135 }
136
137
138
139
140 function enregistre_personnes_from_xml (&$localcontext,$text)
141
142 {
143 if (!$localcontext[idtype]) die("Internal ERROR: probleme in enregistre_personnes_from_xml");
144
145 $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());
146 while (list($idtype,$style,$styledescription)=mysql_fetch_row($result)) {
147 // accouple les balises personnes et description
148 // non, on ne fait plus comme ca. $text=preg_replace ("/(<\/r2r:$style>)\s*(<r2r:description>.*?<\/r2r:description>)/si","\\2\\1",$text);
149 // cherche toutes les balises de personnes
150 preg_match_all ("/<r2r:$style>(.*?)<\/r2r:$style>/s",$text,$results2,PREG_SET_ORDER);
151 // cherche toutes les balises de description de personnes
152 preg_match_all ("/<r2r:$styledescription>(.*?)<\/r2r:$styledescription>/s",$text,$results2description,PREG_SET_ORDER);
153 # echo "result2: style=$style";
154 # echo htmlentities($text);
155 # print_r($results2);
156
157 $i=1;
158
159 while ($result2=array_shift($results2)) { // parcours les resultats.
160 $val=trim($result2[1]);
161 // description ?
162 $result2description=array_shift($results2description); // parcours les descriptions.
163 // cherche s'il y a un bloc description
164 $descrpersonne=$result2description ? $result2description[1] : "";
165
166
167 # echo htmlentities($descrpersonne)."<br><br>\n\n";
168 $personnes=preg_split ("/\s*[,;]\s*/",strip_tags($val,"<r2rc:prenom><r2rc:prefix><r2rc:nom>"));
169
170 while (($personne=array_shift($personnes))) {
171
172 list ($prefix,$prenom,$nom)=decodepersonne($personne);
173 #echo "personne: $personne ; $nom<br>\n";
174
175 $localcontext[nomfamille][$idtype][$i]=$nom;
176 $localcontext[prefix][$idtype][$i]=$prefix;
177 $localcontext[prenom][$idtype][$i]=$prenom;
178
179 // est-ce qu'on a une description et est-ce qu'elle est pour cet personne ?
180 if ($descrpersonne && !$personnes) { // oui, c'est le dernier personne de cette liste, s'il y a un bloc description, alors c'est pour lui !
181 // on recupere les balises du champ description
182 $balises=array("fonction","affiliation","courriel");
183 foreach ($balises as $balise) {
184 if (preg_match("/<r2rc:$balise>(.*?)<\/r2rc:$balise>/s",$descrpersonne,$result4)) {
185 $localcontext[$balise][$idtype][$i]=trim($result4[1]);
186 }
187 } // foreach
188
189 // on efface tous les styles de caracteres
190 $localcontext[description][$idtype][$i]=preg_replace("/<\/?r2rc:[^>]+>/","",$descrpersonne);
191 } // ok, on a traite la description
192 $i++;
193 }
194 } // parcourt les resultats
195 } // type de personne
196 }
197
198
199 function decodepersonne($personne)
200
201 {
202 // on regarde s'il y a un prefix
203 // d'abord on cherche s'il y a un style de caractere, sinon, on cherche les prefix classiques definis dans la variables prefixregexp.
204 if (preg_match_all("/<r2rc:prefix>(.*?)<\/r2rc:prefix>/",$personne,$results,PREG_SET_ORDER)) {
205 $prefix="<r2r:prefix>";
206 foreach($results as $result) {
207 $prefix.=$result[1];
208 $personne=str_replace($result[0],"",$personne); //nettoie le champ personne
209 }
210 $prefix.="</r2r:prefix>";
211 } elseif (preg_match("/^\s*($GLOBALS[prefixregexp])\s/",$personne,$result2)) {
212 $prefix="$result2[1]";
213 $personne=str_replace($result2[0],"",$personne); // a partir de php 4.3.0 il faudra utiliser OFFSET_CAPTURE.
214 } else {
215 $prefix="";
216 }
217 // ok on le prefix
218
219
220 // on cherche maintenant si on a le prenom
221 $have_prenom=0; $have_nom=0;
222 if (preg_match_all("/<r2rc:prenom>(.*?)<\/r2rc:prenom>/",$personne,$results,PREG_SET_ORDER)) {
223 $prenoms=array(); // tableau pour les prenoms
224 foreach($results as $result) {
225 array_push($prenoms,trim($result[1]));
226 $personne=str_replace($result[0],"",$personne); //nettoie l'personne
227 }
228 $prenom=join(" ",$prenoms); // join les prenoms
229 $nom=$personne; // c'est le reste
230 $have_prenom=1;
231 }
232 // on cherche maintenant si on a le nom
233 if (preg_match_all("/<r2rc:nom>(.*?)<\/r2rc:nom>/",$personne,$results,PREG_SET_ORDER)) {
234 $noms=array(); // tableau pour les noms
235 foreach($results as $result) {
236 array_push($noms,trim($result[1]));
237 $personne=str_replace($result[0],"",$personne); //nettoie l'personne
238 }
239 $nom=join(" ",$noms); // join les noms
240 if (!$have_prenom) $prenom=$personne; // le reste c'est le prenom sauf si on a deja detecte le prenom
241 $have_nom=1;
242 }
243 // si on a pas de style de caractere, alors on essaie de deviner !
244 if (!$have_prenom && !$have_nom) {
245 // ok, on cherche maintenant a separer le nom et le prenom
246 $nom=$personne;
247 while ($nom && strtoupper($nom)!=$nom) { $nom=substr(strstr($nom," "),1);}
248 if ($nom) {
249 $prenom=str_replace($nom,"",$personne);
250 } else { // sinon coupe apres le premiere espace
251 if (preg_match("/^\s*(.*?)\s+([^\s]+)\s*$/i",$personne,$result)) {
252 $prenom=$result[1]; $nom=$result[2];
253 } else $nom=$personne;
254 }
255 }
256 return array($prefix,$prenom,$nom);
257 }
258
259
260 function enregistre_entrees_from_xml (&$localcontext,$text)
261
262 {
263 global $home;
264
265 if (!$localcontext[idtype]) die("Internal ERROR: probleme in enregistre_personnes_from_xml");
266
267 $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());
268 require_once($home."champfunc.php");
269
270 while (list($idtype,$style)=mysql_fetch_row($result)) {
271 // decode the multilingue style.
272 $styles=decode_mlstyle($style);
273 foreach($styles as $lang => $style) { // foreach multilingue style
274
275 preg_match_all ("/<r2r:$style>\s*(.*?)\s*<\/r2r:$style>/si",$text,$results2,PREG_SET_ORDER);
276 $i=0;
277 foreach ($results2 as $result2) {
278 $val=strip_tags($result2[1]);
279 $tags=preg_split ("/[,;]/",strip_tags($val));
280 foreach($tags as $tag) {
281 if ($lang && $lang!="--") { // is the language really defined ?
282 $localcontext[entrees][$idtype][$i][lang]=$lang;
283 $localcontext[entrees][$idtype][$i][nom]=trim($tag);
284 } else {
285 $localcontext[entrees][$idtype][$i]=trim($tag);
286 }
287 $i++;
288 }
289 }
290 }
291 }
292 }
293
294
295 ?>