source: pmb4.2/trunk/fuentes/pmb/admin/connecteurs/in/oecd/oecd.class.php @ 815

Last change on this file since 815 was 815, checked in by jrpelegrina, 4 years ago

Initial release of pmb 4.2

  • Property svn:executable set to *
File size: 14.8 KB
Line 
1<?php
2// +-------------------------------------------------+
3// � 2002-2004 PMB Services / www.sigb.net pmb@sigb.net et contributeurs (voir www.sigb.net)
4// +-------------------------------------------------+
5// $Id: oecd.class.php,v 1.5.4.2 2015-09-15 14:32:56 apetithomme Exp $
6
7if (stristr($_SERVER['REQUEST_URI'], ".class.php")) die("no access");
8
9global $class_path,$base_path, $include_path;
10require_once($class_path."/connecteurs.class.php");
11require_once($class_path."/search.class.php");
12//
13// Scandir for PHP4
14//
15if(!function_exists('scandir'))
16{
17    function scandir($dir, $sortorder = 0)
18    {
19        if(is_dir($dir))
20        {
21            $dirlist = opendir($dir);
22           
23            while( ($file = readdir($dirlist)) !== false)
24            {
25                if(!is_dir($file))
26                {
27                    $files[] = $file;
28                }
29            }
30           
31            ($sortorder == 0) ? asort($files) : arsort($files);
32           
33            return $files;
34        }
35        else
36        {
37        return FALSE;
38        break;
39        }
40    }
41}
42
43class oecd extends connector {
44        //Variables internes pour la progression de la r�cup�ration des notices
45        var $callback_progress;         //Nom de la fonction de callback progression pass�e par l'appellant
46        var $current_set;                       //Set en cours de synchronisation
47        var $total_sets;                        //Nombre total de sets s�lectionn�s
48        var $metadata_prefix;           //Pr�fixe du format de donn�es courant
49        var $source_id;                         //Num�ro de la source en cours de synchro
50        var $n_recu;                            //Nombre de notices re�ues
51        var $xslt_transform;            //Feuille xslt transmise
52        var $sets_names;                        //Nom des sets pour faire plus joli !!
53        var $del_old;                           //Supression ou non des notices dej� existantes
54        var $schema_config;
55       
56        //R�sultat de la synchro
57        var $error;                                     //Y-a-t-il eu une erreur       
58        var $error_message;                     //Si oui, message correspondant
59       
60    function oecd($connector_path="") {
61        parent::connector($connector_path);
62    }
63   
64    function get_id() {
65        return "oecd";
66    }
67   
68    //Est-ce un entrepot ?
69        function is_repository() {
70                return 1;
71        }
72   
73    function unserialize_source_params($source_id) {
74        $params=$this->get_source_params($source_id);
75                if ($params["PARAMETERS"]) {
76                        $vars=unserialize($params["PARAMETERS"]);
77                        $params["PARAMETERS"]=$vars;
78                }
79                return $params;
80    }
81   
82   function source_get_property_form($source_id) {
83        global $charset;
84       
85        $params=$this->get_source_params($source_id);
86                if ($params["PARAMETERS"]) {
87                        //Affichage du formulaire avec $params["PARAMETERS"]
88                        $vars=unserialize($params["PARAMETERS"]);
89                        foreach ($vars as $key=>$val) {
90                                global $$key;
91                                $$key=$val;
92                        }       
93                }
94                //URL
95                if (!isset($url))
96                        $url = "http://www.oecd-ilibrary.org/fr/emploi/livres/2012";
97                $form="
98                <div class='row'>
99                        <div class='colonne3'>
100                                <label for='url'>".$this->msg["oecd_url"]."</label>
101                        </div>
102                        <div class='colonne_suite'>
103                                <input type='text' name='url' id='url' class='saisie-60em' value='".htmlentities($url,ENT_QUOTES,$charset)."'/>
104                        </div>
105                </div>
106                <div class='row'></div>";
107       
108                return $form;
109    }
110   
111    function make_serialized_source_properties($source_id) {
112        global $url;
113        $t = array();
114        $t["url"]=stripslashes($url);
115                $this->sources[$source_id]["PARAMETERS"]=serialize($t);
116        }
117       
118        //Récupération  des proriétés globales par défaut du connecteur (timeout, retry, repository, parameters)
119        function fetch_default_global_values() {
120                $this->timeout=40;
121                $this->repository=1;
122                $this->retry=3;
123                $this->ttl=60000;
124                $this->parameters="";
125        }
126       
127        //Formulaire des propriétés générales
128        function get_property_form() {
129                $this->fetch_global_properties();
130                return "";
131        }
132       
133        function make_serialized_properties() {
134                $this->parameters="";
135        }
136       
137        function progress($query,$token) {
138                $callback_progress=$this->callback_progress;
139                if ($token["completeListSize"]) {
140                        $percent=($this->current_set/$this->total_sets)+(($token["cursor"]/$token["completeListSize"])/$this->total_sets);
141                        $nlu=$this->n_recu;
142                        $ntotal="inconnu";
143                        //$nlu=$token["cursor"];
144                        //$ntotal=$token["completeListSize"];
145                } else {
146                        $percent=($this->current_set/$this->total_sets);
147                        $nlu=$this->n_recu;
148                        $ntotal="inconnu";
149                }
150                call_user_func($callback_progress,$percent,$nlu,$ntotal);
151        }
152               
153        function cancel_maj($source_id) {
154                return true;
155        }
156       
157        function break_maj($source_id) {
158                return true;
159        }
160       
161        function form_pour_maj_entrepot($source_id) {
162                return false;
163        }
164       
165        //Nécessaire pour passer les valeurs obtenues dans form_pour_maj_entrepot au javascript asynchrone
166        function get_maj_environnement($source_id) {           
167                return array();
168        }
169       
170        function sync_custom_page($source_id) {
171                return '';
172        }
173       
174        function maj_entrepot($source_id,$callback_progress="",$recover=false,$recover_env="") {
175                global $base_path,$charset;
176                       
177                $this->n_recu=0;
178                $this->callback_progress=$callback_progress;   
179                $params=$this->get_source_params($source_id);
180                $this->fetch_global_properties();
181                if ($params["PARAMETERS"]) {
182                        //Affichage du formulaire avec $params["PARAMETERS"]
183                        $vars=unserialize($params["PARAMETERS"]);
184                        foreach ($vars as $key=>$val) {
185                                global $$key;
186                                $$key=$val;
187                        }       
188                }
189                if (!isset($url)) {
190                        $this->error_message = $this->msg["oecd_unconfigured"];
191                        $this->error = 1;
192                        return;
193                }
194               
195                //Recherche de la dernière date...
196                $requete="select unix_timestamp(max(date_import)) from entrepot_source_".$source_id." where 1;";
197                $resultat=pmb_mysql_query($requete);
198                if (pmb_mysql_num_rows($resultat)) {
199                        $last_date=pmb_mysql_result($resultat,0,0);
200                        if ($last_date) {                               
201                                $last_date+=3600*24;
202                        }       
203                }
204                $ch = curl_init();             
205                //      http://www.oecd-ilibrary.org/fr/emploi/livres/2012
206                //      http://www.oecd-ilibrary.org/fr/questionssociales/livres/2012
207                $addr=$url;
208                $sortir=0;// pour sortir du while!
209                $page=0;
210                do{
211                       
212                        // configuration des options CURL
213                        curl_setopt($ch, CURLOPT_URL, $addr);   
214                        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);         
215                        configurer_proxy_curl($ch,$addr);       
216                        $html=curl_exec($ch);           
217                        if (!$html) {
218                                $sortir=1;
219                               
220                        } else {
221                                if (strtoupper($charset)!="UTF-8") $html=utf8_decode($html);                                           
222                               
223                                $notice_list=$this->get_field_betwen_2sep($html,"</thead>\n<tbody>","</tbody>\n</table>");
224                               
225                                $sep_notices="</tr>\n<tr>";
226                                $notices_html=explode($sep_notices,$notice_list);
227                                $nb=0;
228                                foreach($notices_html as $notice_html){
229                                        $data_notice=array();
230                                        $type=$this->get_field_betwen_2sep($notice_html,"\"type nowrap box3\"><strong>"," </strong>");
231        //                              print $type;
232//                                      if($type=="Livre"){                                             
233                                                $link=$this->get_field_betwen_2sep($notice_html,"<strong>\n<a href=\"","\" title=\"");                                 
234                                                $link=  "http://www.oecd-ilibrary.org".$link;
235                                                $data_notice["Url_notice"]=$link;
236                                               
237                                                $zone_title=$this->get_field_betwen_2sep($notice_html,"</ul>\n<strong>\n","</strong>");
238                                                $data_notice["Title"]=$this->get_field_betwen_2sep($zone_title,"rel=\"\"><span>","</span>",1);
239                                               
240                                                $data_notice["Abstract"]=$this->get_field_betwen_2sep($notice_html,"class=\"abstract \"><span>","</span>");                                     
241                                                                                       
242                                                $date_zone=$this->get_field_betwen_2sep($notice_html,"nowrap box2\">\n","&nbsp;");
243                                                $data_notice["Publication_Date"]=$this->get_field_betwen_2sep($date_zone,"nowrap box2\">\n","\n");
244
245                                                $data_notice["numberofpages"]=$this->get_field_betwen_2sep($notice_html," Pages: ","\n");
246                                               
247                                                $data_notice["Authors"][0]=$this->get_field_betwen_2sep($notice_html,"</a></strong><br />\n",", Pages: ");
248                                               
249                                                $zone_docnum=$this->get_field_betwen_2sep($notice_html,"<li class=\"last\">\n","</li>");
250                                                $link_docnum=$this->get_field_betwen_2sep($zone_docnum,"<a href=\"","\" ");
251                                                if($link_docnum){                                                       
252                                                        $data_notice["doc_links"][0]["link"]="http://www.oecd-ilibrary.org".$link_docnum;                                               
253                                                }
254                                                $data_notice["id"]=$this->get_field_betwen_2sep($data_notice["Url_notice"],"_",";jsessionid");                                         
255                                        //      print $notice_html;
256                //                      } else{
257                        //                      continue;
258                //                      }       
259                 //                     printr ($data_notice);
260                                       
261                                        if($this->rec_record($this->notice_2_uni($data_notice),$source_id)){
262                                        // notice déjà en entrepos, on ne va pas chercher les suivantes
263                                                break;
264                                        }
265                                        if($nb++ >2){
266                                        //      $sortir=1; break;
267                                        }
268                                }       
269                        }
270                        if(!$sortir){
271                                $sortir=1;
272                                $next_page_link="";
273                                $page_zone=$this->get_field_betwen_2sep($html,"bobby-inline pager","</ul>");
274                                if($page_zone){
275                                        $next_page_link=$this->get_field_betwen_2sep($page_zone,"<li>|\n<a href=\"","\" title=\"next page\"");
276                                        if($next_page_link){
277                                                $addr="http://www.oecd-ilibrary.org".$next_page_link;
278                                                ///print $adr;
279                                                $sortir=0;
280                                        }
281                                }
282                        }
283                        if($page++      > 5)$sortir=1;
284                }while(!$sortir);       
285                curl_close($ch);       
286               
287                return $this->n_recu;
288        }
289       
290    function parse_xml($ch,$data) {
291                $notices=explode("6",$data);
292                print $notices[1]; 
293        return strlen($data);
294        }
295       
296        function search($source_id,$query,$search_id) {
297               
298        }       
299       
300        function notice_2_uni($nt) {
301
302                $unimarc=array();
303                $unimarc["001"][0]=$nt["id"];
304
305                $unimarc["200"][0]["a"][0]=$nt["Title"];
306               
307                //Editeurs
308                if ($nt["Publication"]) $unimarc["210"][0]["c"][0]=$nt["Publication"];
309                if ($nt["Publication_Date"]) $unimarc["210"][0]["d"][]=$nt["Publication_Date"];
310               
311                // DOI
312                if ($nt["DOI"]){
313                        $unimarc["014"][0]["a"][0]=$nt["DOI"];
314                        $unimarc["014"][0]["b"][0]="DOI";
315                } 
316               
317                if ($nt["Affiliation"])  $unimarc["300"][0]["a"][0]=$nt["Affiliation"];
318               
319                //Résumé
320                if ($nt["Abstract"])  $unimarc["330"][0]["a"][0]=$nt["Abstract"];
321                               
322                if (count($nt["numberofpages"])) $unimarc["215"][0]["a"][]=$nt["numberofpages"];
323               
324                //Auteurs
325                $aut=array();
326                if (count($nt["Authors"])) {                   
327                        if (count($nt["Authors"])>1) $autf="701"; else $autf="700";
328                        for ($i=0; $i<count($nt["Authors"]); $i++) {
329                                       
330                                $name_surname=explode(",",$nt["Authors"][$i]); 
331                                if(count($name_surname)==2) {
332                                        $aut[$i]["a"][0]=$name_surname[0];
333                                        $aut[$i]["b"][0]=$name_surname[1];
334                                } else{                                 
335                                        $aut[$i]["a"][0]=$nt["Authors"][$i];
336                                } 
337                        //      $aut[$i]["4"][0]="070";
338                        }
339                        $unimarc[$autf]=$aut;                   
340                }
341                if ($nt["Url_notice"]){
342                        $unimarc["856"][0]["u"][0]=$nt["Url_notice"];
343                } 
344               
345                // Link doc num
346                if(count($nt["doc_links"])) {
347                        $i=0;
348                        foreach($nt["doc_links"] as $key =>$val){
349                                $unimarc["897"][$i]["a"][0]=$val["link"];
350                                if($val["label"])
351                                        $unimarc["897"][$i]["b"][0]=$val["label"];
352                                else
353                                        $unimarc["897"][$i]["b"][0]=$key;
354                                $i++;
355                        }
356                }
357                // Keywords
358                if ($nt["Keywords"])  $unimarc["610"][0]["a"][0]=$nt["Keywords"];                       
359                // Origin
360                if ($nt["Origin"])  $unimarc["801"][0]["b"][0]=$nt["Origin"];
361                               
362                return $unimarc;
363        }       
364       
365        function rec_record($record,$source_id) {
366                global $charset,$base_path,$url,$search_index;
367               
368                $date_import=date("Y-m-d H:i:s",time());
369               
370                //Recherche du 001
371                $ref=$record["001"][0];
372                //Mise à jour
373                if ($ref) {
374                        //Si conservation des anciennes notices, on regarde si elle existe
375                        if (!$this->del_old) {
376                                $requete="select count(*) from entrepot_source_".$source_id." where ref='".addslashes($ref)."' ";
377                                $rref=pmb_mysql_query($requete);
378                                if ($rref) {
379                                        $ref_exists=pmb_mysql_result($rref,0,0);
380                                        if($ref_exists) return 1;
381                                }
382                        }
383                        //Si pas de conservation des anciennes notices, on supprime
384                        if ($this->del_old) {
385                                $requete="delete from entrepot_source_".$source_id." where ref='".addslashes($ref)."' ";
386                                pmb_mysql_query($requete);
387                                $this->delete_from_external_count($source_id, $ref);
388                        }
389                        //Si pas de conservation ou reférence inexistante
390                        if (($this->del_old)||((!$this->del_old)&&(!$ref_exists))) {
391                                //Insertion de l'entête
392                                $n_header["rs"]="*";
393                                $n_header["ru"]="*";
394                                $n_header["el"]="1";
395                                $n_header["bl"]="m";
396                                $n_header["hl"]="0";
397                                $n_header["dt"]=$this->types[$search_index[$url][0]];
398                                if (!$n_header["dt"]) $n_header["dt"]="a";
399                               
400                                $n_header["001"]=$record["001"][0];
401                                //Récupération d'un ID
402                                $requete="insert into external_count (recid, source_id) values('".addslashes($this->get_id()." ".$source_id." ".$ref)."', ".$source_id.")";
403                                $rid=pmb_mysql_query($requete);
404                                if ($rid) $recid=pmb_mysql_insert_id();
405                               
406                                foreach($n_header as $hc=>$code) {
407                                        $requete="insert into entrepot_source_".$source_id." (connector_id,source_id,ref,date_import,ufield,usubfield,field_order,subfield_order,value,i_value,recid) values(
408                                        '".addslashes($this->get_id())."',".$source_id.",'".addslashes($ref)."','".$date_import."',
409                                        '".$hc."','',-1,0,'".addslashes($code)."','',$recid)";
410                                        pmb_mysql_query($requete);
411                                }
412                               
413                                $field_order=0;
414                                foreach ($record as $field=>$val) {
415                                        for ($i=0; $i<count($val); $i++) {
416                                                if (is_array($val[$i])) {
417                                                        foreach ($val[$i] as $sfield=>$vals) {
418                                                                for ($j=0; $j<count($vals); $j++) {
419                                                                        //if ($charset!="utf-8")  $vals[$j]=utf8_decode($vals[$j]);
420                                                                        $requete="insert into entrepot_source_".$source_id." (connector_id,source_id,ref,date_import,ufield,usubfield,field_order,subfield_order,value,i_value,recid) values(
421                                                                        '".addslashes($this->get_id())."',".$source_id.",'".addslashes($ref)."','".$date_import."',
422                                                                        '".addslashes($field)."','".addslashes($sfield)."',".$field_order.",".$j.",'".addslashes($vals[$j])."',
423                                                                        ' ".addslashes(strip_empty_words($vals[$j]))." ',$recid)";
424                                                                        pmb_mysql_query($requete);
425                                                                }
426                                                        }
427                                                } else {
428                                                        //if ($charset!="utf-8")  $vals[$i]=utf8_decode($vals[$i]);
429                                                        $requete="insert into entrepot_source_".$source_id." (connector_id,source_id,ref,date_import,ufield,usubfield,field_order,subfield_order,value,i_value,recid) values(
430                                                        '".addslashes($this->get_id())."',".$source_id.",'".addslashes($ref)."','".$date_import."',
431                                                        '".addslashes($field)."','',".$field_order.",0,'".addslashes($val[$i])."',
432                                                        ' ".addslashes(strip_empty_words($val[$i]))." ',$recid)";
433                                                        pmb_mysql_query($requete);
434                                                }
435                                                $field_order++;
436                                        }
437                                }
438                                $this->n_recu++;
439                        }
440                }
441        }
442       
443
444function get_field_from_sep($chaine, $deb,$html_decode=0,$keep_tags=""){
445        global $charset;
446        $i_deb=strpos($chaine,$deb);
447        if ($i_deb === false) return "";
448        $i_deb+=strlen($deb);
449        if($html_decode){
450                //return html_entity_decode(substr($chaine,$i_deb),ENT_QUOTES,$charset);       
451                return html_entity_decode(strip_tags(substr($chaine,$i_deb),$keep_tags),ENT_QUOTES,$charset); 
452        }else
453                return substr($chaine,$i_deb); 
454}
455function get_field_betwen_2sep($chaine, $deb,$end,$html_decode=0,$keep_tags=""){
456        global $charset;
457        $i_deb=strpos($chaine,$deb);
458        if ($i_deb === false) return "";
459        $i_deb+=strlen($deb);
460        $chaine_deb=substr($chaine,$i_deb);
461        $i_end=strpos($chaine_deb,$end);
462        if ($i_end === false) return "";
463        if($html_decode){
464                // return html_entity_decode(substr($chaine_deb,0,$i_end),ENT_QUOTES,$charset);
465                return html_entity_decode(strip_tags(substr($chaine_deb,0,$i_end),$keep_tags),ENT_QUOTES,$charset); 
466        }else
467                return substr($chaine_deb,0,$i_end);   
468}
469}// class end
470
471
Note: See TracBrowser for help on using the repository browser.