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