source: pmb4.2/trunk/fuentes/pmb/admin/connecteurs/in/databnf/databnf.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: 17.7 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: databnf.class.php,v 1.3 2015-04-03 11:16:27 jpermanne 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/rdf/arc2/ARC2.php");
12//require_once("$include_path/h2o/h2o.php");
13//require_once($base_path."/cms/modules/common/includes/pmb_h2o.inc.php");
14
15class databnf extends connector {
16        //Variables internes pour la progression de la récupération des notices
17        var $del_old;                           //Supression ou non des notices dejà existantes
18       
19        var $profile;                           //Profil wikipedia
20        var $match;                                     //Tableau des critères wikipedia
21        var $current_site;                      //Site courant du profile (n°)
22        var $searchindexes;                     //Liste des indexes de recherche possibles pour le site
23        var $current_searchindex;       //Numéro de l'index de recherche de la classe
24        var $match_index;                       //Type de recherche (power ou simple)
25        var $types;                                     //Types de documents pour la conversino des notices
26       
27        //Résultat de la synchro
28        var $error;                                     //Y-a-t-il eu une erreur       
29        var $error_message;                     //Si oui, message correspondant
30       
31    function databnf($connector_path="") {
32        parent::connector($connector_path);
33    }
34   
35    function get_id() {
36        return "databnf";
37    }
38   
39    //Est-ce un entrepot ?
40        function is_repository() {
41                return 2;
42        }
43   
44    function unserialize_source_params($source_id) {
45        $params=$this->get_source_params($source_id);
46                if ($params["PARAMETERS"]) {
47                        $vars=unserialize($params["PARAMETERS"]);
48                        $params["PARAMETERS"]=$vars;
49                }
50                return $params;
51    }
52   
53    function get_libelle($message) {
54        if (substr($message,0,4)=="msg:") return $this->msg[substr($message,4)]; else return $message;
55    }
56   
57    function source_get_property_form($source_id) {
58        $params=$this->get_source_params($source_id);
59        if ($params["PARAMETERS"]) {
60                //Affichage du formulaire avec $params["PARAMETERS"]
61                $vars=unserialize($params["PARAMETERS"]);
62                foreach ($vars as $key=>$val) {
63                        global $$key;
64                        $$key=$val;
65                }
66        }
67        $form="
68        <div class='row'>
69                <div class='colonne3'>
70                                <label for='sparql_endpoint_url'>".$this->msg["databnf_sparql_endpoint_url"]."</label>
71                </div>
72                <div class='colonne_suite'>
73                        <input type='text' class='saisie-40em' name='sparql_endpoint_url' id='sparql_endpoint_url' value='".htmlentities($sparql_endpoint_url,ENT_QUOTES,$charset)."' size='10'/>
74                </div>
75        </div>
76        <div class='row'></div>";
77        return $form;
78    }
79   
80    function make_serialized_source_properties($source_id) {
81        global $sparql_endpoint_url;
82        $t["sparql_endpoint_url"]=$sparql_endpoint_url;
83        $this->sources[$source_id]["PARAMETERS"]=serialize($t);
84        }
85       
86        //Récupération  des proriétés globales par défaut du connecteur (timeout, retry, repository, parameters)
87        function fetch_default_global_values() {
88                $this->timeout=5;
89                $this->repository=2;
90                $this->retry=3;
91                $this->ttl=1800;
92                $this->parameters="";
93        }
94       
95         //Formulaire des propriétés générales
96        function get_property_form() {
97                return "";
98        }
99   
100    function make_serialized_properties() {
101                $this->parameters = serialize(array());
102        }
103
104        function enrichment_is_allow(){
105                return true;
106        }
107       
108        function getEnrichmentHeader(){
109                global $lang;
110                $header= array();
111                return $header;
112        }
113       
114        function getTypeOfEnrichment($source_id){
115                $type['type'] = array(
116                        array( 
117                                'code' => "databnf_oeuvre",
118                                'label' => $this->msg["databnf_oeuvre_label"]
119                        ),
120                        array( 
121                                'code' => "databnf_bio",
122                                'label' => $this->msg["databnf_bio_label"]
123                        )
124                );             
125                $type['source_id'] = $source_id;
126                return $type;
127        }
128       
129        function getEnrichment($notice_id,$source_id,$type="",$enrich_params=array()){
130                $enrichment= array();
131                $params=$this->unserialize_source_params($source_id);
132                $sparql_end_point=$params["PARAMETERS"]["sparql_endpoint_url"];
133                //on renvoi ce qui est demandé... si on demande rien, on renvoi tout..
134                switch ($type){
135                        case "databnf_bio" :
136                                $enrichment['databnf_bio']['content'] = $this->get_author_page($notice_id,$sparql_end_point);   
137                                break;
138                        case "databnf_oeuvre" :
139                        default :
140                                $enrichment['databnf_oeuvre']['content'] = $this->noticeInfos($notice_id,$sparql_end_point);
141                                break;
142                }               
143                $enrichment['source_label']=$this->msg['databnf_enrichment_source'];
144                return $enrichment;
145        }
146       
147        function get_author_page($notice_id,$sparql_end_point){
148                global $lang;
149                global $charset;
150               
151                if($enrich_params['label']!=""){
152                        $author = $enrich_params['label'];
153                }else{
154                        //on va chercher l'auteur principal...
155                        $query = "select responsability_author, authority_number from responsability join authorities_sources on (authority_type='author' and num_authority=responsability_author) where responsability_notice =".$notice_id." and responsability_type=0";
156                        $result = pmb_mysql_query($query);
157                        if(pmb_mysql_num_rows($result)){
158                                $author_id = pmb_mysql_result($result,0,0);
159                                $author_number = pmb_mysql_result($result,0,1);
160                                $author_class = new auteur($author_id);
161                                $author =  $author_class->isbd_entry;
162                               
163                                //On y va !
164                                $config = array(
165                                                'remote_store_endpoint' => $sparql_end_point,
166                                                'remote_store_timeout' => 10
167                                );
168                                $store = ARC2::getRemoteStore($config);
169                               
170                                //Recherche de l'URI de l'auteur !
171                                $sparql="prefix skos: <http://www.w3.org/2004/02/skos/core#>
172                                SELECT * WHERE {
173                                        ?auteur rdf:type skos:Concept .
174                                        FILTER regex(?auteur, \"^http://data\.bnf\.fr:8080/ark:/12148/cb".$author_number."\") .
175                                }";
176                               
177                                $rows=$store->query($sparql,'rows');
178                               
179                                if ($rows[0]["auteur"]) {
180                                        $uri_auteur=$rows[0]["auteur"];
181                               
182                                        //Biographie...
183                                        $sparql="prefix foaf: <http://xmlns.com/foaf/0.1/>
184                                        prefix dc: <http://purl.org/dc/terms/>
185                                        prefix dcterm: <http://purl.org/dc/terms/>
186                                        prefix bnf-onto: <http://data.bnf.fr/ontology/bnf-onto/>
187                                        prefix rdagroup2elements: <http://RDVocab.info/ElementsGr2/>
188                                        prefix skos: <http://www.w3.org/2004/02/skos/core#>
189                                        SELECT * WHERE {
190                                                <$uri_auteur> foaf:focus ?person .
191                                                <$uri_auteur> skos:prefLabel ?isbd .
192                                                ?person foaf:page ?page .
193                                                OPTIONAL {
194                                                        ?person rdagroup2elements:biographicalInformation ?biographie .
195                                                }
196                                                OPTIONAL {
197                                                        ?person rdagroup2elements:dateOfBirth ?naissance .
198                                                }
199                                                OPTIONAL {
200                                                        ?person rdagroup2elements:placeOfBirth ?lieunaissance .
201                                                }
202                                                OPTIONAL {
203                                                        ?person rdagroup2elements:dateOfDeath ?mort .
204                                                }
205                                                OPTIONAL {
206                                                        ?person rdagroup2elements:placeOfDeath ?lieumort .
207                                                }
208                                        }";
209                                        try {
210                                                $rows=$store->query($sparql,'rows');
211                                        } catch(Exception $e) {
212                                                $rows=array();
213                                        }
214                                        $rows=array_uft8_decode($rows);
215                                        $template="{% for record in result %}
216                                                                <h3>{{record.isbd}}<div style='float:right'><a href='{{record.page}}' target='_blank'><img src='http://data.bnf.fr/data/85bec01e1d53356985bccf3036a2bb49/logo-data.gif' style='max-height:20px'/></a></div></h3>
217                                                                <br />
218                                                                <h3>Biographie (BNF)</h3>
219                                                                <table>
220                                                                <tr><td style='background:#EEEEEE'>Date de naissance</td><td>{{record.naissance}}</td></tr>
221                                                                <tr><td style='background:#EEEEEE'>Lieu de naissance</td><td>{{record.lieunaissance}}</td></tr>
222                                                                <tr><td style='background:#EEEEEE'>Date de décès</td><td>{{record.mort}}</td></tr>
223                                                                <tr><td style='background:#EEEEEE'>Lieu de décès</td><td>{{record.lieumort}}</td></tr>
224                                                                </table>
225                                                                <br/>
226                                                                <h4 style='font-size:1.2em'>{{record.biographie}}</h4>
227                                                                <br/>
228                                                           {% endfor %}";
229                                        $html_to_return = H2o::parseString($template)->render(array("result"=>$rows)); 
230                                       
231                                        //Vignettes
232                                        $sparql="prefix foaf: <http://xmlns.com/foaf/0.1/>
233                                                        prefix dc: <http://purl.org/dc/elements/1.1/>
234                                                        prefix dcterm: <http://purl.org/dc/terms/>
235                                                        SELECT * WHERE {
236                                                          <$uri_auteur> foaf:focus ?person .
237                                                          ?person foaf:depiction ?url .
238                                                        } LIMIT 5";
239                                        try {
240                                                $rows=$store->query($sparql,'rows');
241                                        } catch(Exception $e) {
242                                                $rows=array();
243                                        }
244                                        $rows=array_uft8_decode($rows);
245                                        $template="<h3>Vignettes (BnF)</h3>
246                                                          <table width='100%'>
247                                                                <tr>
248                                                          {% for record in result %}
249                                                                        <td align='center'><img src='{{record.url}}'/></td>
250                                                          {% endfor %}
251                                                            </tr>
252                                                          </table>";
253                                        $html_to_return .= H2o::parseString($template)->render(array("result"=>$rows));
254                                       
255                                        //Bibliographie
256                                        $sparql="prefix foaf: <http://xmlns.com/foaf/0.1/>
257                                                prefix dc: <http://purl.org/dc/terms/>
258                                                prefix dcterm: <http://purl.org/dc/terms/>
259                                                prefix frbr-rda: <http://purl.org/vocab/frbr/core#>
260                                                prefix rdarelationships: <http://rdvocab.info/RDARelationshipsWEMI/>
261                                               
262                                                SELECT ?oeuvre ?oeuvre_concept ?date ?title ?url ?gallica WHERE {
263                                                  <$uri_auteur> foaf:focus ?person .
264                                                  ?oeuvre dc:creator ?person .
265                                                  ?oeuvre_concept foaf:focus ?oeuvre .
266                                                  OPTIONAL {
267                                                     ?oeuvre dc:date ?date
268                                                  } .
269                                                  ?oeuvre dc:title ?title .
270                                                  OPTIONAL { ?oeuvre foaf:depiction ?url } .
271                                                  OPTIONAL {
272                                                      ?manifestation rdarelationships:workManifested ?oeuvre .
273                                                      ?manifestation rdarelationships:electronicReproduction ?gallica .
274                                                  } .
275                                                }  group by ?oeuvre order by ?date";
276                                        try {
277                                                $rows=$store->query($sparql,'rows');
278                                        } catch(Exception $e) {
279                                                $rows=array();
280                                        }
281                                        $rows=array_uft8_decode($rows);
282                                        $template="<h3>Bibliographie (BNF)</h3>
283                                                <div align='center'>
284                                                <div style='overflow-x:scroll;overflow-y:auto;width:850px;'>
285                                                <table>
286                                                   <tr>
287                                                {% for record in result %}
288                                                  <td style='background:#DDDDDD;' width='200px'>{% if record.date %}{{record.date}}{% else %}&nbsp;{% endif %}</td>
289                                                {% endfor %}
290                                                   </tr>
291                                                   <tr>
292                                                {% for record in result %}
293                                                  <td {% if loop.odd %}style='background:#EEEEEE;'{% endif %}>
294                                                    {% if loop.odd %}
295                                                      {% if record.url %}
296                                                        <a href='index.php?uri={{record.oeuvre_concept}}%23frbr:Work&lvl=cmspage&pageid=13'><img src='{{record.url}}' style='max-height:50px'/></a>
297                                                      {% else %}
298                                                        &nbsp;
299                                                      {% endif %}
300                                                      {% if record.gallica %}
301                                                          <a href='{{record.gallica}}' target='_blank'><img width='50px' src='http://gallica.bnf.fr/images/dynamic/perso/logo_gallica.png' /></a>
302                                                      {% endif %}
303                                                      <br />
304                                                      <a href='index.php?uri={{record.oeuvre_concept}}%23frbr:Work&lvl=cmspage&pageid=13'>{{record.title}}</a>
305                                                    {% else %}&nbsp;{% endif %}
306                                                  </td>
307                                                {% endfor %}
308                                                   </tr>
309                                                   <tr>
310                                                {% for record in result %}
311                                                  <td {% if loop.even %}style='background:#EEEEEE;'{% endif %}>{% if loop.even %}{% if record.url %}
312                                                        <a href='index.php?uri={{record.oeuvre_concept}}%23frbr:Work&lvl=cmspage&pageid=13'><img src='{{record.url}}' style='max-height:50px'/></a>
313                                                      {% else %}
314                                                        &nbsp;
315                                                      {% endif %}
316                                                      {% if record.gallica %}
317                                                          <a href='{{record.gallica}}' target='_blank'><img width='50px' src='http://gallica.bnf.fr/images/dynamic/perso/logo_gallica.png' /></a>
318                                                      {% endif %}
319                                                      <br />
320                                                      <a href='index.php?uri={{record.oeuvre_concept}}%23frbr:Work&lvl=cmspage&pageid=13'>{{record.title}}</a>{% else %}&nbsp;{% endif %}
321                                                  </td>
322                                                {% endfor %}
323                                                   </tr>
324                                                </table>
325                                                </div>
326                                                </div>";
327                                        $html_to_return .= H2o::parseString($template)->render(array("result"=>$rows));
328                                }
329                        }
330                }
331//              print $html_to_return;
332                return $html_to_return; 
333        }
334       
335        function noticeInfos($notice_id,$sparql_end_point){
336                global $lang,$charset;
337               
338                //On va rechercher l'isbn si il existe....
339                $requete="select code from notices where notice_id=$notice_id";
340                $resultat=pmb_mysql_query($requete);
341               
342                if (pmb_mysql_num_rows($resultat)) {
343                        $isbn=pmb_mysql_result($resultat,0,0);
344                } else $isbn="";
345                if ($isbn) {
346                        //On y va !
347                        $config = array(
348                                        'remote_store_endpoint' => $sparql_end_point,
349                                        'remote_store_timeout' => 10
350                        );
351                        $store = ARC2::getRemoteStore($config);
352                       
353                        $sparql="prefix bnf-onto: <http://data.bnf.fr/ontology/>
354                                prefix rdarelationships: <http://rdvocab.info/RDARelationshipsWEMI/>
355                                SELECT ?oeuvre WHERE {
356                                  ?manifestation bnf-onto:ISBN '$isbn' .
357                                  ?manifestation rdarelationships:workManifested ?oeuvre
358                                }";
359                        try {
360                                $rows=$store->query($sparql,'rows');
361                        } catch(Exception $e) {
362                                $rows=array();
363                        }
364                        if ($rows[0]["oeuvre"]) {
365                                $oeuvre=$rows[0]["oeuvre"];
366                                $sparql="prefix skos: <http://www.w3.org/2004/02/skos/core#>
367                                        prefix foaf: <http://xmlns.com/foaf/0.1/>
368                                        prefix dc: <http://purl.org/dc/terms/>
369                                        prefix bnf-onto: <http://data.bnf.fr/ontology/>
370                                        prefix rdarelationships: <http://rdvocab.info/RDARelationshipsWEMI/>
371                                        prefix rdagroup1Elements: <http://RDVocab.info/Elements/>
372                                        SELECT * WHERE {
373                                          <$oeuvre> rdfs:label ?titre .
374                                          OPTIONAL { <$oeuvre> dc:date ?date } .
375                                          OPTIONAL { <$oeuvre> foaf:depiction ?vignette } .
376                                          OPTIONAL { <$oeuvre> dc:description ?description } .
377                                          OPTIONAL { <$oeuvre> bnf-onto:subject ?sujet } .
378                                          OPTIONAL { <$oeuvre> dc:creator ?auteur .
379                                             ?auteur_concept foaf:focus ?auteur .
380                                             ?auteur_concept skos:prefLabel ?auteur_isbd .
381                                          } .
382                                          OPTIONAL { <$oeuvre> rdagroup1Elements:placeOfOriginOfTheWork ?lieu }
383                                        }";
384                                try {
385                                        $rows=$store->query($sparql,'rows');
386                                } catch(Exception $e) {
387                                        $rows=array();
388                                }
389                                $rows=array_uft8_decode($rows);
390                                $template="
391                                                <h3>{{result.0.titre}}<div style='float:right'><a href='$oeuvre' target='_blank'><img src='http://data.bnf.fr/data/85bec01e1d53356985bccf3036a2bb49/logo-data.gif' style='max-height:20px'/></a></div></h3>
392                                                                        <br />
393                                                                        <h3>Détail de l'oeuvre (BNF)</h3>
394                                                {% if result.0.vignette %}
395                                                        <table>
396                                                                <tr>
397                                                                        <td><img src='{{result.0.vignette}}' height='150px'/></td>
398                                                                        <td>
399                                                {% endif %}
400                                                <table>
401                                                        <tr><td style='background:#EEEEEE'>Date</td><td>{{result.0.date}}</td></tr>
402                                                        <tr><td style='background:#EEEEEE'>Sujet</td><td>{{result.0.sujet}}</td></tr>
403                                                        <tr><td style='background:#EEEEEE'>Auteur</td><td><a href='index.php?uri={{result.0.auteur_concept}}&lvl=cmspage&pageid=12'>{{result.0.auteur_isbd}}</a></td></tr>
404                                                </table>
405                                                {% if result.0.vignette %}
406                                                                </td>
407                                                        </tr>
408                                                  </table>
409                                                {% endif %}
410                                                <br/>   
411                                                <h4>{{result.0.description}}</h4>                       
412                                ";
413                                $html_to_return .= H2o::parseString($template)->render(array("result"=>$rows));
414                               
415                                //Récupération des exemplaires de Gallica
416                                $sparql="prefix skos: <http://www.w3.org/2004/02/skos/core#>
417                                        prefix foaf: <http://xmlns.com/foaf/0.1/>
418                                        prefix dc: <http://purl.org/dc/terms/>
419                                        prefix bnf-onto: <http://data.bnf.fr/ontology/>
420                                        prefix rdarelationships: <http://rdvocab.info/RDARelationshipsWEMI/>
421                                        prefix rdagroup1Elements: <http://RDVocab.info/Elements/>
422                                        SELECT * WHERE {
423                                                ?manifestation rdarelationships:workManifested <$oeuvre> .
424                                                OPTIONAL { ?manifestation rdarelationships:electronicReproduction ?gallica } .
425                                                OPTIONAL { ?manifestation bnf-onto:ISBN ?isbn } .
426                                                OPTIONAL { <$oeuvre> foaf:depiction ?vignette } .
427                                                OPTIONAL { ?manifestation dc:date ?date } .
428                                                OPTIONAL { ?manifestation rdagroup1Elements:publishersName ?publisher } .
429                                                OPTIONAL { ?manifestation rdagroup1Elements:note ?note } .
430                                                OPTIONAL { ?manifestation rdagroup1Elements:placeOfPublication ?place } .
431                                                OPTIONAL { ?manifestation rdagroup1Elements:dateOfCapture ?numerisele } .
432                                        } group by ?manifestation order by ?date
433                                ";
434                                try {
435                                        $rows=$store->query($sparql,'rows');
436                                } catch(Exception $e) {
437                                        $rows=array();
438                                }
439                                $rows=array_uft8_decode($rows);
440                                $template="
441                                                <h3>Editions numérisées dans Gallica</h3><br/>
442                                                <table>
443                                                {% for record in result %}
444                                                        {% if record.gallica %}
445                                                        <tr>
446                                                                <td><a href='{{record.gallica}}' target='_blank'><img height='40px' src='http://gallica.bnf.fr/images/dynamic/perso/logo_gallica.png' /></a></td>
447                                                                <td><a href='{{record.gallica}}' target='_blank'>Edition : {{record.date}} par {{record.publisher}} à {{record.place}}</a></td>
448                                                                <td>{{record.note}}</td>
449                                                                <td>{{record.numerisele}}</td>
450                                                        </tr>
451                                                        {% endif %}
452                                                {% endfor %}
453                                                </table>
454                                ";
455                                $html_to_return .= H2o::parseString($template)->render(array("result"=>$rows));
456                                $template="
457                                                <h3>Editions dans la bibliothèque</h3><br/>
458                                                <table>
459                                                {% for record in result %}
460                                                        {% if record.isbn %}
461                                                                {% sqlvalue i_catalog %}
462                                                                        select count(expl_id) as nb,notice_id from exemplaires join notices on expl_notice=notice_id where code='{{record.isbn}}' group by notice_id
463                                                                {% endsqlvalue %}
464                                                                {% if i_catalog.0.nb %}
465                                                                        <tr style='height:70px'>
466                                                                                <td><a href='index.php?lvl=notice_display&id={{i_catalog.0.notice_id}}' target='_blank'>{% if record.vignette %}<img src='{{record.vignette}}' height='70px'/>{% else %}&nbsp;{% endif %}</a></td>
467                                                                                <td><a href='index.php?lvl=notice_display&id={{i_catalog.0.notice_id}}' target='_blank'>Edition : {{record.date}} par {{record.publisher}} à {{record.place}}</a></td>
468                                                                                <td>{{record.note}}</td>
469                                                                                <td><a href='index.php?lvl=notice_display&id={{i_catalog.0.notice_id}}' target='_blank'>{{i_catalog.0.nb}} exemplaires disponible(s)</a></td>
470                                                                        </tr>
471                                                                {% endif %}
472                                                        {% endif %}
473                                                {% endfor %}
474                                                </table>
475                                ";
476                                try {
477                                        $html_to_return .= H2o::parseString($template)->render(array("result"=>$rows));
478                                } catch (Exception $e) {
479                                        $html_to_return.=highlight_string(print_r($e,true),true);
480                                }
481                        }
482                }
483                return $html_to_return; 
484        }
485}
486?>
Note: See TracBrowser for help on using the repository browser.