/** * \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>"; } } }
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++; } } } }
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; }