コード例 #1
0
 /**
  * \brief Instanciation de l'enregistrement OAI
  *
  * Créé une représentation d'un enregistrement OAI et le transforme en uni_marc si possible
  */
 function oai_record($record, $charset = "iso-8859-1", $base_path = "", $prefix = "", $xslt_transform = "", $sets_names = "")
 {
     $this->srecord = $record;
     $this->charset = $charset;
     $this->prefix = $prefix;
     $this->base_path = $base_path;
     $this->xslt_transform = $xslt_transform;
     $precord = new xml_dom('<?xml version="1.0" encoding="' . $charset . '"?>' . $record, $charset);
     if ($precord->error) {
         $this->error = true;
         $this->error_message = $precord->error_message;
     } else {
         //Header
         $this->header["IDENTIFIER"] = $precord->get_value("record/header/identifier");
         $this->header["DATESTAMP"] = $precord->get_value("record/header/datestamp");
         $this->header["SETSPECS"] = $precord->get_values("record/header/setSpec");
         $this->header["STATUS"] = $precord->get_values("record/header/status") ? $precord->get_values("record/header/status") : $precord->get_attribute($precord->get_node("record/header"), "status");
         //Enregistrement
         $this->metadata = $precord->get_value("record/metadata");
         //About
         $this->about = $precord->get_value("record/about");
         $nmeta = $precord->get_node("record/metadata");
         //Conversion éventuelle en unimarc
         if (!$this->prefix) {
             //Recherche du premier fils élément
             for ($i = 0; $i < count($nmeta["CHILDS"]); $i++) {
                 if ($nmeta["CHILDS"][$i]["TYPE"] == 1) {
                     $handler = explode(":", $nmeta["CHILDS"][$i]["NAME"]);
                     $this->handler = $handler[0];
                     break;
                 }
             }
         } else {
             $this->handler = $this->prefix;
         }
         $hd = $precord->get_node("record/header");
         //Petit truchement pour récupérer le nom des sets
         if (count($this->header["SETSPECS"])) {
             for ($i = 0; $i < count($this->header["SETSPECS"]); $i++) {
                 $setName = array();
                 $setName["NAME"] = "setName";
                 $setName["ATTRIBS"] = array();
                 $setName["TYPE"] = 1;
                 $setName["CHILDS"][0]["DATA"] = $sets_names[$this->header["SETSPECS"][$i]] ? $sets_names[$this->header["SETSPECS"][$i]] : $this->header["SETSPECS"][$i];
                 $setName["CHILDS"][0]["TYPE"] = 2;
                 $hd["CHILDS"][] = $setName;
             }
         }
         //Récupération de la feuille xslt si elle n'a pas été fournie
         if (!$this->xslt_transform) {
             if (file_exists($this->base_path . "/" . $this->handler . ".xsl")) {
                 $this->xslt_transform = file_get_contents($this->base_path . "/" . $this->handler . ".xsl");
             }
         }
         //Si on peut nécéssaire, on transforme en unimarc
         if ($this->xslt_transform) {
             $this->unimarc = $this->to_unimarc("<record><header>" . $precord->get_datas($hd) . "</header><metadata>" . $this->metadata . "</metadata></record>");
         }
         if ($this->prefix == "pmb_xml_unimarc") {
             $this->unimarc = "<?xml version='1.0' encoding='" . $this->charset . "'?>\n<unimarc>\n" . $this->metadata . "</unimarc>";
         }
     }
 }
コード例 #2
0
ファイル: oai.class.php プロジェクト: noble82/proyectos-ULS
 function rec_record($record)
 {
     global $charset, $base_path;
     $rec = new oai_record($record, $charset, $base_path . "/admin/connecteurs/in/oai/xslt", $this->metadata_prefix, $this->xslt_transform, $this->sets_names);
     $rec_uni = $rec->unimarc;
     if (!$rec->error) {
         //On a un enregistrement unimarc, on l'enregistre
         $rec_uni_dom = new xml_dom($rec_uni, $charset);
         if (!$rec_uni_dom->error) {
             //Initialisation
             $ref = "";
             $ufield = "";
             $usubfield = "";
             $field_order = 0;
             $subfield_order = 0;
             $value = "";
             $date_import = $rec->header["DATESTAMP"];
             $fs = $rec_uni_dom->get_nodes("unimarc/notice/f");
             //Recherche du 001
             for ($i = 0; $i < count($fs); $i++) {
                 if ($fs[$i]["ATTRIBS"]["c"] == "001") {
                     $ref = $rec_uni_dom->get_datas($fs[$i]);
                     break;
                 }
             }
             //Mise à jour
             if ($ref) {
                 //Si conservation des anciennes notices, on regarde si elle existe
                 if (!$this->del_old) {
                     $requete = "select count(*) from entrepot_source_" . $this->source_id . " where connector_id='" . addslashes($this->get_id()) . "' and ref='" . addslashes($ref) . "'";
                     $rref = pmb_mysql_query($requete);
                     if ($rref) {
                         $ref_exists = pmb_mysql_result($rref, 0, 0);
                     }
                 }
                 //Si pas de conservation des anciennes notices, on supprime
                 if ($this->del_old) {
                     $requete = "delete from entrepot_source_" . $this->source_id . " where connector_id='" . addslashes($this->get_id()) . "' and ref='" . addslashes($ref) . "'";
                     pmb_mysql_query($requete);
                 }
                 //Si pas de conservation ou reférence inexistante
                 if ($this->del_old || !$this->del_old && !$ref_exists) {
                     //Insertion de l'entête
                     $n_header["rs"] = $rec_uni_dom->get_value("unimarc/notice/rs");
                     $n_header["ru"] = $rec_uni_dom->get_value("unimarc/notice/ru");
                     $n_header["el"] = $rec_uni_dom->get_value("unimarc/notice/el");
                     $n_header["bl"] = $rec_uni_dom->get_value("unimarc/notice/bl");
                     $n_header["hl"] = $rec_uni_dom->get_value("unimarc/notice/hl");
                     $n_header["dt"] = $rec_uni_dom->get_value("unimarc/notice/dt");
                     //Récupération d'un ID
                     $requete = "insert into external_count (recid) values('" . addslashes($this->get_id() . " " . $this->source_id . " " . $ref) . "')";
                     $rid = pmb_mysql_query($requete);
                     if ($rid) {
                         $recid = pmb_mysql_insert_id();
                     }
                     foreach ($n_header as $hc => $code) {
                         $requete = "insert into entrepot_source_" . $this->source_id . " (connector_id,source_id,ref,date_import,ufield,usubfield,field_order,subfield_order,value,i_value,recid) values(\n\t\t\t\t\t\t\t'" . addslashes($this->get_id()) . "'," . $this->source_id . ",'" . addslashes($ref) . "','" . addslashes($date_import) . "',\n\t\t\t\t\t\t\t'" . $hc . "','',-1,0,'" . addslashes($code) . "','',{$recid})";
                         pmb_mysql_query($requete);
                     }
                     for ($i = 0; $i < count($fs); $i++) {
                         $ufield = $fs[$i]["ATTRIBS"]["c"];
                         $field_order = $i;
                         $ss = $rec_uni_dom->get_nodes("s", $fs[$i]);
                         if (is_array($ss)) {
                             for ($j = 0; $j < count($ss); $j++) {
                                 $usubfield = $ss[$j]["ATTRIBS"]["c"];
                                 $value = $rec_uni_dom->get_datas($ss[$j]);
                                 $subfield_order = $j;
                                 $requete = "insert into entrepot_source_" . $this->source_id . " (connector_id,source_id,ref,date_import,ufield,usubfield,field_order,subfield_order,value,i_value,recid) values(\n\t\t\t\t\t\t\t\t\t'" . addslashes($this->get_id()) . "'," . $this->source_id . ",'" . addslashes($ref) . "','" . addslashes($date_import) . "',\n\t\t\t\t\t\t\t\t\t'" . addslashes($ufield) . "','" . addslashes($usubfield) . "'," . $field_order . "," . $subfield_order . ",'" . addslashes($value) . "',\n\t\t\t\t\t\t\t\t\t' " . addslashes(strip_empty_words($value)) . " ',{$recid})";
                                 pmb_mysql_query($requete);
                             }
                         } else {
                             $value = $rec_uni_dom->get_datas($fs[$i]);
                             $requete = "insert into entrepot_source_" . $this->source_id . " (connector_id,source_id,ref,date_import,ufield,usubfield,field_order,subfield_order,value,i_value,recid) values(\n\t\t\t\t\t\t\t\t'" . addslashes($this->get_id()) . "'," . $this->source_id . ",'" . addslashes($ref) . "','" . addslashes($date_import) . "',\n\t\t\t\t\t\t\t\t'" . addslashes($ufield) . "','" . addslashes($usubfield) . "'," . $field_order . "," . $subfield_order . ",'" . addslashes($value) . "',\n\t\t\t\t\t\t\t\t' " . addslashes(strip_empty_words($value)) . " ',{$recid})";
                             pmb_mysql_query($requete);
                         }
                     }
                 }
                 $this->n_recu++;
             }
         }
     }
 }
コード例 #3
0
 public function rec_record($record = array())
 {
     global $dbh, $charset, $base_path;
     $xml = new DOMDocument('1.0', 'utf-8');
     //$xml->formatOutput = true;
     $xml_rec = $xml->createElement('record');
     $xml->appendChild($xml_rec);
     $xml_rec->setAttribute('key', $record['zapi:key']);
     $xml_rec->setAttribute('version', $record['zapi:version']);
     if (is_array($record['content']) && count($record['content'])) {
         foreach ($record['content'] as $k => $v) {
             $this->recurse_record($xml, $xml_rec, $k, $v);
         }
     }
     if (is_array($record['attachments']) && count($record['attachments'])) {
         $xml_atts = $xml->createElement('attachments');
         $xml_rec->appendChild($xml_atts);
         foreach ($record['attachments'] as $k => $attachment) {
             $xml_att = $xml->createElement('attachment');
             $xml_atts->appendChild($xml_att);
             foreach ($attachment['content'] as $k1 => $v1) {
                 $xml_att->setAttribute('zapi:key', $attachment['zapi:key']);
                 $xml_att->setAttribute('zapi:version', $record['zapi:version']);
                 if ($record['url']) {
                     $new_elt = $xml->createElement('url', $record['url']);
                     $xml_att->appendChild($new_elt);
                 }
                 $this->recurse_record($xml, $xml_att, $k1, $v1);
             }
         }
     }
     $in = $xml->saveXML();
     $xsl_filename = $base_path . '/admin/connecteurs/in/zotero/xslt/zotero_atom_json.xsl';
     $proc = new XSLTProcessor();
     $xslDoc = new DOMDocument();
     $xslDoc->load($xsl_filename);
     $proc->registerPHPFunctions();
     $proc->importStylesheet($xslDoc);
     $out = $proc->transformToXml($xml);
     $ref = 0;
     if ($out) {
         //On a un enregistrement unimarc, on l'enregistre
         $rec_uni_dom = new xml_dom($out, $charset);
         if (!$rec_uni_dom->error) {
             //Initialisation
             $ref = "";
             $ufield = "";
             $usubfield = "";
             $field_order = 0;
             $subfield_order = 0;
             $value = "";
             $date_import = date('Y-m-d H:i:s');
             $fs = $rec_uni_dom->get_nodes("unimarc/notice/f");
             //Recherche du 001
             for ($i = 0; $i < count($fs); $i++) {
                 if ($fs[$i]["ATTRIBS"]["c"] == "001") {
                     $ref = $rec_uni_dom->get_datas($fs[$i]);
                     break;
                 }
             }
             //Mise à jour
             if ($ref) {
                 //Suppression anciennes notices
                 $q = "delete from entrepot_source_" . $this->source_id . " where ref='" . addslashes($ref) . "'";
                 @pmb_mysql_query($q, $dbh);
                 //Insertion de l'entête
                 $n_header["rs"] = $rec_uni_dom->get_value("unimarc/notice/rs");
                 $n_header["ru"] = $rec_uni_dom->get_value("unimarc/notice/ru");
                 $n_header["el"] = $rec_uni_dom->get_value("unimarc/notice/el");
                 $n_header["bl"] = $rec_uni_dom->get_value("unimarc/notice/bl");
                 $n_header["hl"] = $rec_uni_dom->get_value("unimarc/notice/hl");
                 $n_header["dt"] = $rec_uni_dom->get_value("unimarc/notice/dt");
                 //Récupération d'un ID
                 $requete = "insert into external_count (recid, source_id) values('" . addslashes($this->get_id() . " " . $this->source_id . " " . $ref) . "', " . $this->source_id . ")";
                 $rid = pmb_mysql_query($requete);
                 if ($rid) {
                     $recid = pmb_mysql_insert_id();
                 }
                 foreach ($n_header as $hc => $code) {
                     $requete = "insert into entrepot_source_" . $this->source_id . " (connector_id,source_id,ref,date_import,ufield,usubfield,field_order,subfield_order,value,i_value,recid) values(\r\n\t\t\t\t\t\t'" . addslashes($this->get_id()) . "'," . $this->source_id . ",'" . addslashes($ref) . "','" . addslashes($date_import) . "',\r\n\t\t\t\t\t\t'" . $hc . "','',-1,0,'" . addslashes($code) . "','',{$recid})";
                     pmb_mysql_query($requete);
                 }
                 for ($i = 0; $i < count($fs); $i++) {
                     $ufield = $fs[$i]["ATTRIBS"]["c"];
                     $field_order = $i;
                     $ss = $rec_uni_dom->get_nodes("s", $fs[$i]);
                     if (is_array($ss)) {
                         for ($j = 0; $j < count($ss); $j++) {
                             $usubfield = $ss[$j]["ATTRIBS"]["c"];
                             $value = $rec_uni_dom->get_datas($ss[$j]);
                             $subfield_order = $j;
                             $requete = "insert into entrepot_source_" . $this->source_id . " (connector_id,source_id,ref,date_import,ufield,usubfield,field_order,subfield_order,value,i_value,recid) values(\r\n\t\t\t\t\t\t\t\t'" . addslashes($this->get_id()) . "'," . $this->source_id . ",'" . addslashes($ref) . "','" . addslashes($date_import) . "',\r\n\t\t\t\t\t\t\t\t'" . addslashes($ufield) . "','" . addslashes($usubfield) . "'," . $field_order . "," . $subfield_order . ",'" . addslashes($value) . "',\r\n\t\t\t\t\t\t\t\t' " . addslashes(strip_empty_words($value)) . " ',{$recid})";
                             pmb_mysql_query($requete);
                         }
                     } else {
                         $value = $rec_uni_dom->get_datas($fs[$i]);
                         $requete = "insert into entrepot_source_" . $this->source_id . " (connector_id,source_id,ref,date_import,ufield,usubfield,field_order,subfield_order,value,i_value,recid) values(\r\n\t\t\t\t\t\t\t'" . addslashes($this->get_id()) . "'," . $this->source_id . ",'" . addslashes($ref) . "','" . addslashes($date_import) . "',\r\n\t\t\t\t\t\t\t'" . addslashes($ufield) . "','" . addslashes($usubfield) . "'," . $field_order . "," . $subfield_order . ",'" . addslashes($value) . "',\r\n\t\t\t\t\t\t\t' " . addslashes(strip_empty_words($value)) . " ',{$recid})";
                         pmb_mysql_query($requete);
                     }
                 }
             }
         }
     }
     return $ref;
 }