source: pmb4.2/trunk/fuentes/pmb/admin/connecteurs/in/emploi/emploi.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.4 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: emploi.class.php,v 1.6.2.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 emploi 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 déjà 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 emploi($connector_path="") {
61        parent::connector($connector_path);
62    }
63   
64    function get_id() {
65        return "emploi";
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://travail-emploi.gouv.fr/etudes-recherche-statistiques-de,76/etudes-et-recherche,77/publications-dares,98/dares-analyses-dares-indicateurs,102";
97                $form="
98                <div class='row'>
99                        <div class='colonne3'>
100                                <label for='url'>".$this->msg["emploi_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               
180                $params=$this->get_source_params($source_id);
181                $this->fetch_global_properties();
182                if ($params["PARAMETERS"]) {
183                        //Affichage du formulaire avec $params["PARAMETERS"]
184                        $vars=unserialize($params["PARAMETERS"]);
185                        foreach ($vars as $key=>$val) {
186                                global $$key;
187                                $$key=$val;
188                        }       
189                }
190                if (!isset($url)) {
191                        $this->error_message = $this->msg["emploi_unconfigured"];
192                        $this->error = 1;
193                        return;
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       
205                $ch = curl_init();
206
207                //$addr="http://travail-emploi.gouv.fr/etudes-recherche-statistiques-de,76/etudes-et-recherche,77/publications-dares,98/dares-analyses-dares-indicateurs,102/";
208               
209                $addr=$url;
210                // configuration des options CURL
211                curl_setopt($ch, CURLOPT_URL, $addr);   
212                curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);         
213                configurer_proxy_curl($ch,$addr);       
214                $html=curl_exec($ch);           
215                if (!$html) {
216                        $sortir=1;                     
217                } else {
218                        if ($charset=="utf-8")  $html=utf8_encode($html);
219                //      if (strtoupper($charset)!="UTF-8") $html=utf8_decode($html);                                           
220                       
221                        $notice_list=$this->get_field_betwen_2sep($html,"<h2 class=\"smaller\">","</ul>");
222                       
223                        $notice_list=$this->get_field_betwen_2sep($notice_list,"<ul>","<ul>");
224                       
225                        $sep_notices="</li>\n";
226                        $notices_html=explode($sep_notices,$notice_list);
227                        $nb=0;
228                        //print printr($notices_html);
229                        foreach($notices_html as $notice_html){
230                                $data_notice=array();
231                                                                       
232                                $link=$this->get_field_betwen_2sep($notice_html,"<a href=\"","\">");                                   
233                                $link=  "http://travail-emploi.gouv.fr/".$link;
234
235                                curl_setopt($ch, CURLOPT_URL, $link);   
236                                curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);         
237                                configurer_proxy_curl($ch,$link);       
238                                $html_notice_complete=curl_exec($ch);           
239                               
240        //                      http://travail-emploi.gouv.fr/IMG/pdf/2012-035.pdf
241                                if (!$html_notice_complete) {
242                                        continue;
243                                }
244                                if ($charset=="utf-8")  $html_notice_complete=utf8_encode($html_notice_complete);
245                                $data_notice["Url_notice"]=$link;
246                               
247                                $html_notice_complete=$this->get_field_from_sep($html_notice_complete,"<div class=\"gris clearfix\">");
248                                 
249                                $data_notice["Publication_Date"]=$this->get_field_betwen_2sep($html_notice_complete,"<span class=\"date\">","</span>");
250                                $data_notice["Title"]=$this->get_field_betwen_2sep($html_notice_complete,"<h1>","</h1>");
251                               
252                                $data_notice["Abstract"]=$this->get_field_betwen_2sep($html_notice_complete,"<div class=\"texteencadre-spip spip\">","<div class=\"listdoc\">",1,1);   
253                                $data_notice["Abstract"]=str_replace("&#8217;","'",$data_notice["Abstract"]);
254                                $zone_docnum=$this->get_field_from_sep($html_notice_complete," spip_documents spip_lien_ok\">");
255                                $link_docnum=$this->get_field_betwen_2sep($zone_docnum,"<a href=\"","\" ");
256                                if($link_docnum){
257                                        $data_notice["doc_links"][0]["link"]="http://travail-emploi.gouv.fr/".$link_docnum;             
258                                        $data_notice["id"]=$this->get_field_betwen_2sep($link_docnum,"IMG/pdf/",".pdf");
259                                }                               
260                        //      printr ($data_notice);
261                                if($this->rec_record($this->notice_2_uni($data_notice),$source_id)){
262                                        // notice déjà en entrepot, on ne va pas chercher les suivantes
263                                        break;
264                                }
265                               
266                        }       
267                }                               
268                curl_close($ch);       
269                return $this->n_recu;
270        }
271       
272    function parse_xml($ch,$data) {
273                $notices=explode("6",$data);
274                print $notices[1]; 
275        return strlen($data);
276        }
277       
278        function search($source_id,$query,$search_id) {
279        }       
280       
281        function notice_2_uni($nt) {
282
283                $unimarc=array();
284                $unimarc["001"][0]=$nt["id"];
285
286                $unimarc["200"][0]["a"][0]=$nt["Title"];
287               
288                //Editeurs
289                if ($nt["Publication"]) $unimarc["210"][0]["c"][0]=$nt["Publication"];
290                if ($nt["Publication_Date"]) $unimarc["210"][0]["d"][]=$nt["Publication_Date"];
291               
292                // DOI
293                if ($nt["DOI"]){
294                        $unimarc["014"][0]["a"][0]=$nt["DOI"];
295                        $unimarc["014"][0]["b"][0]="DOI";
296                } 
297               
298                if ($nt["Affiliation"])  $unimarc["300"][0]["a"][0]=$nt["Affiliation"];
299               
300                //Résumé
301                if ($nt["Abstract"])  $unimarc["330"][0]["a"][0]=$nt["Abstract"];
302                               
303                if (count($nt["numberofpages"])) $unimarc["215"][0]["a"][]=$nt["numberofpages"];
304               
305                //Auteurs
306                $aut=array();
307                if (count($nt["Authors"])) {                   
308                        if (count($nt["Authors"])>1) $autf="701"; else $autf="700";
309                        for ($i=0; $i<count($nt["Authors"]); $i++) {
310                                       
311                                $name_surname=explode(",",$nt["Authors"][$i]); 
312                                if(count($name_surname)==2) {
313                                        $aut[$i]["a"][0]=$name_surname[0];
314                                        $aut[$i]["b"][0]=$name_surname[1];
315                                } else{                                 
316                                        $aut[$i]["a"][0]=$nt["Authors"][$i];
317                                } 
318                        //      $aut[$i]["4"][0]="070";
319                        }
320                        $unimarc[$autf]=$aut;                   
321                }
322                if ($nt["Url_notice"]){
323                        $unimarc["856"][0]["u"][0]=$nt["Url_notice"];
324                } 
325               
326                // Link doc num
327                if(count($nt["doc_links"])) {
328                        $i=0;
329                        foreach($nt["doc_links"] as $key =>$val){
330                                $unimarc["897"][$i]["a"][0]=$val["link"];
331                                if($val["label"])
332                                        $unimarc["897"][$i]["b"][0]=$val["label"];
333                                else
334                                        $unimarc["897"][$i]["b"][0]=$key;
335                                $i++;
336                        }
337                }
338                // Keywords
339                if ($nt["Keywords"])  $unimarc["610"][0]["a"][0]=$nt["Keywords"];                       
340                // Origin
341                if ($nt["Origin"])  $unimarc["801"][0]["b"][0]=$nt["Origin"];
342                               
343                return $unimarc;
344        }       
345       
346        function rec_record($record,$source_id) {
347                global $charset,$base_path,$url,$search_index;
348               
349                $date_import=date("Y-m-d H:i:s",time());
350               
351                //Recherche du 001
352                $ref=$record["001"][0];
353                //Mise à jour
354                if ($ref) {
355                        //Si conservation des anciennes notices, on regarde si elle existe
356                        if (!$this->del_old) {
357                                $requete="select count(*) from entrepot_source_".$source_id." where ref='".addslashes($ref)."' ";
358                                $rref=pmb_mysql_query($requete);
359                                if ($rref) {
360                                        $ref_exists=pmb_mysql_result($rref,0,0);
361                                        if($ref_exists) return 1;
362                                }
363                        }
364                        //Si pas de conservation des anciennes notices, on supprime
365                        if ($this->del_old) {
366                                $requete="delete from entrepot_source_".$source_id." where ref='".addslashes($ref)."' ";
367                                pmb_mysql_query($requete);
368                                $this->delete_from_external_count($source_id, $ref);
369                        }
370                        //Si pas de conservation ou reférence inexistante
371                        if (($this->del_old)||((!$this->del_old)&&(!$ref_exists))) {
372                                //Insertion de l'entête
373                                $n_header["rs"]="*";
374                                $n_header["ru"]="*";
375                                $n_header["el"]="1";
376                                $n_header["bl"]="m";
377                                $n_header["hl"]="0";
378                                $n_header["dt"]=$this->types[$search_index[$url][0]];
379                                if (!$n_header["dt"]) $n_header["dt"]="a";
380                               
381                                $n_header["001"]=$record["001"][0];
382                                //Récupération d'un ID
383                                $requete="insert into external_count (recid, source_id) values('".addslashes($this->get_id()." ".$source_id." ".$ref)."', ".$source_id.")";
384                                $rid=pmb_mysql_query($requete);
385                                if ($rid) $recid=pmb_mysql_insert_id();
386                               
387                                foreach($n_header as $hc=>$code) {
388                                        $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(
389                                        '".addslashes($this->get_id())."',".$source_id.",'".addslashes($ref)."','".$date_import."',
390                                        '".$hc."','',-1,0,'".addslashes($code)."','',$recid,'".$recid."')";
391                                        pmb_mysql_query($requete);
392                                }
393                               
394                                $field_order=0;
395                                foreach ($record as $field=>$val) {
396                                        for ($i=0; $i<count($val); $i++) {
397                                                if (is_array($val[$i])) {
398                                                        foreach ($val[$i] as $sfield=>$vals) {
399                                                                for ($j=0; $j<count($vals); $j++) {
400                                                                        //if ($charset!="utf-8")  $vals[$j]=utf8_decode($vals[$j]);
401                                                                        $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(
402                                                                        '".addslashes($this->get_id())."',".$source_id.",'".addslashes($ref)."','".$date_import."',
403                                                                        '".addslashes($field)."','".addslashes($sfield)."',".$field_order.",".$j.",'".addslashes($vals[$j])."',
404                                                                        ' ".addslashes(strip_empty_words($vals[$j]))." ',$recid)";
405                                                                        pmb_mysql_query($requete);
406                                                                }
407                                                        }
408                                                } else {
409                                                        //if ($charset!="utf-8")  $vals[$i]=utf8_decode($vals[$i]);
410                                                        $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(
411                                                        '".addslashes($this->get_id())."',".$source_id.",'".addslashes($ref)."','".$date_import."',
412                                                        '".addslashes($field)."','',".$field_order.",0,'".addslashes($val[$i])."',
413                                                        ' ".addslashes(strip_empty_words($val[$i]))." ',$recid)";
414                                                        pmb_mysql_query($requete);
415                                                }
416                                                $field_order++;
417                                        }
418                                }
419                                $this->n_recu++;
420                        }
421                }
422        }
423       
424
425function get_field_from_sep($chaine, $deb,$html_decode=0,$keep_tags=""){
426        global $charset;
427        $i_deb=strpos($chaine,$deb);
428        if ($i_deb === false) return "";
429        $i_deb+=strlen($deb);
430        if($html_decode){
431                //return html_entity_decode(substr($chaine,$i_deb),ENT_QUOTES,$charset);       
432                return html_entity_decode(strip_tags(substr($chaine,$i_deb),$keep_tags),ENT_QUOTES,$charset); 
433        }else
434                return substr($chaine,$i_deb); 
435       
436}
437function get_field_betwen_2sep($chaine, $deb,$end,$html_decode=0,$keep_tags=""){
438        global $charset;
439        $i_deb=strpos($chaine,$deb);
440        if ($i_deb === false) return "";
441        $i_deb+=strlen($deb);
442        $chaine_deb=substr($chaine,$i_deb);
443        $i_end=strpos($chaine_deb,$end);
444        if ($i_end === false) return "";
445        if($html_decode){
446                // return html_entity_decode(substr($chaine_deb,0,$i_end),ENT_QUOTES,$charset);
447                return html_entity_decode(strip_tags(substr($chaine_deb,0,$i_end),$keep_tags),ENT_QUOTES,$charset); 
448        }else
449                return substr($chaine_deb,0,$i_end);   
450}
451}// class end
452
453
Note: See TracBrowser for help on using the repository browser.