=') && extension_loaded('xsl')) { require_once($include_path.'/xslt-php4-to-php5.inc.php'); } //Voici un array_unique qui marche aussi avec des objects et des arrays. function array_unique_more($array, $keep_key_assoc = false){ $duplicate_keys = array(); $tmp = array(); foreach ($array as $key=>$val){ // convert objects to arrays, in_array() does not support objects if (is_object($val)) $val = (array)$val; if (!in_array($val, $tmp)) $tmp[] = $val; else $duplicate_keys[] = $key; } foreach ($duplicate_keys as $key) unset($array[$key]); return $keep_key_assoc ? $array : array_values($array); } class aligastore extends connector { //Variables internes pour la progression de la récupération des notices public $current_set; //Set en cours de synchronisation public $total_sets; //Nombre total de sets sélectionnés public $metadata_prefix; //Préfixe du format de données courant public $search_id; public $xslt_transform; //Feuille xslt transmise public $sets_names; //Nom des sets pour faire plus joli !! public $url; public $username; public $password; public $blank_image; public $image_thumb_url; public $image_front; public $image_back; public $image_folder; public $image_folder_url; public $fetchimages; public function __construct($connector_path="") { parent::__construct($connector_path); } public function get_id() { return "aligastore"; } //Est-ce un entrepot ? public function is_repository() { return 3; } public function source_get_property_form($source_id) { global $charset; $params=$this->get_source_params($source_id); if ($params["PARAMETERS"]) { //Affichage du formulaire avec $params["PARAMETERS"] $vars=unserialize($params["PARAMETERS"]); foreach ($vars as $key=>$val) { global ${$key}; ${$key}=$val; } } //URL if (!isset($url)) $url = "http://www.aligastore.com/partenaires/xmldetaillivre.php"; $form="
"; //Username if (!isset($username)) $username=""; $form.="
"; //Password if (!isset($password)) $password=""; $form.="
"; //Image Thumb URL if (!isset($image_thumb_url)) $image_thumb_url="http://www.aligastore.com/query.dll/img?gcdFab=!!isbn!!&type=0"; $form.="
"; //Image Front if (!isset($image_front)) $image_front="http://www.aligastore.com/query.dll/img?gcdFab=!!isbn!!&type=1"; $form.="
"; //Image Back if (!isset($image_back)) $image_back="http://www.aligastore.com/query.dll/img?gcdFab=!!isbn!!&type=4"; $form.="
"; //Image Fetch? if (!isset($fetch_images)) $fetch_images=0; $form.="
"; //Image Folder if (!isset($image_folder)) $image_folder=""; $form.="
"; //Image Folder Public URL if (!isset($image_folder_public)) $image_folder_public=""; $form.="
"; $form.="
"; return $form; } public function make_serialized_source_properties($source_id) { global $url,$username, $password, $fetch_images, $image_folder, $image_thumb_url, $image_front, $image_back, $image_folder_public; $t["url"]=stripslashes($url); $t["username"]=stripslashes($username); $t["password"]=stripslashes($password); $t["fetch_images"]=stripslashes($fetch_images); $t["image_folder"]=stripslashes($image_folder); $t["image_folder_public"]=stripslashes($image_folder_public); $t["image_thumb_url"]=stripslashes($image_thumb_url); $t["image_front"]=stripslashes($image_front); $t["image_back"]=stripslashes($image_back); $this->sources[$source_id]["PARAMETERS"]=serialize($t); } //Récupération des proriétés globales par défaut du connecteur (timeout, retry, repository, parameters) public function fetch_default_global_values() { parent::fetch_default_global_values(); $this->repository=1; } public function rec_record($record, $source_id, $search_id) { global $charset; if (!trim($record)) return; //On a un enregistrement unimarc, on l'enregistre $rec_uni_dom=new xml_dom_aligastore($record,$charset, false); 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",time()); $fs=$rec_uni_dom->get_nodes("unimarc/notice/f"); //Recherche du 001 if ($fs) for ($i=0; $iget_datas($fs[$i]); break; } } if (!$ref) $ref = md5($record); //Mise à jour if ($ref) { //Si conservation des anciennes notices, on regarde si elle existe if (!$this->del_old) { $ref_exists = $this->has_ref($source_id, $ref); } //Si pas de conservation des anciennes notices, on supprime if ($this->del_old) { $this->delete_from_entrepot($source_id, $ref); $this->delete_from_external_count($source_id, $ref); } $ref_exists = false; //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 $recid = $this->insert_into_external_count($source_id, $ref); foreach($n_header as $hc=>$code) { $this->insert_header_into_entrepot($source_id, $ref, $date_import, $hc, $code, $recid, $search_id); } if ($fs) for ($i=0; $iget_nodes("s",$fs[$i]); if (is_array($ss)) { for ($j=0; $jget_datas($ss[$j]); $subfield_order=$j; $this->insert_content_into_entrepot($source_id, $ref, $date_import, $ufield, $usubfield, $field_order, $subfield_order, $value, $recid, $search_id); } } else { $value=$rec_uni_dom->get_datas($fs[$i]); $this->insert_content_into_entrepot($source_id, $ref, $date_import, $ufield, $usubfield, $field_order, 0, $value, $recid, $search_id); } } $this->rec_isbd_record($source_id, $ref, $recid); } $this->n_recu++; } } } public function form_pour_maj_entrepot($source_id,$sync_form="sync_form") { global $quoi_synchro; $form = ""; $form .= ""; $form .= $this->msg["aliga_syncbase"]; $form .= '
'; $form .= ''; $form .= '
'; $form .= $this->msg["aliga_sync_noticecaddie"]; $form .= '
'; $caddies = caddie::get_cart_list("NOTI"); foreach ($caddies as $caddie) { $form .= ' ('.($caddie["nb_item_base"]).' '.$this->msg["aliga_caddie_element"].')
'; } $form .= '
'; $form .= $this->msg["aliga_sync_explcaddie"]; $form .= '
'; $caddies = caddie::get_cart_list("EXPL"); foreach ($caddies as $caddie) { $form .= '
'; } $form .= '
'; $form .= "

"; return $form; } //Nécessaire pour passer les valeurs obtenues dans form_pour_maj_entrepot au javascript asynchrone public function get_maj_environnement($source_id) { global $quoi_synchro; $envt=array(); foreach ($quoi_synchro as $synchro) { $envt["quoi_synchro"][$synchro]=$synchro; } return $envt; } public function get_image_information($isbn, $download_images) { global $charset; //Récupération et traitement des images et des zones associées. $bypass_testvalidity = true; $images_status = array( "thumb" => "", "front" => "", "back" => "" ); if ($download_images) { $images_status = $this->fetch_and_record_images($isbn); } if (!$images_status["thumb"] && $this->image_thumb_url) { if ($bypass_testvalidity || $this->test_image_validity($isbn, $this->image_thumb_url)) { $url = str_replace("!!isbn!!", $isbn, $this->image_thumb_url); $images_status["thumb"] = $url; } } if (!$images_status["front"] && $this->image_front) { if ($bypass_testvalidity || $this->test_image_validity($isbn, $this->image_front)) { $url = str_replace("!!isbn!!", $isbn, $this->image_front); $images_status["front"] = $url; } } if (!$images_status["back"] && $this->image_back) { if ($bypass_testvalidity || $this->test_image_validity($isbn, $this->image_back)) { $url = str_replace("!!isbn!!", $isbn, $this->image_back); $images_status["back"] = $url; } } $image_information = ""; if ($images_status["thumb"]) { $image_information .= ''; $image_information .= ''; $image_information .= htmlspecialchars($images_status["thumb"],ENT_NOQUOTES,$charset); $image_information .= ''; $image_information .= ''; } if ($images_status["front"]) { $image_information .= ''; $image_information .= ''; $image_information .= htmlspecialchars($images_status["front"],ENT_NOQUOTES,$charset); $image_information .= ''; $image_information .= ''; $image_information .= htmlspecialchars($this->msg["aliga_cover_front"],ENT_NOQUOTES,$charset); $image_information .= ''; $image_information .= ''; } if ($images_status["back"]) { $image_information .= ''; $image_information .= ''; $image_information .= htmlspecialchars($images_status["back"],ENT_NOQUOTES,$charset); $image_information .= ''; $image_information .= ''; $image_information .= htmlspecialchars($this->msg["aliga_cover_back"],ENT_NOQUOTES,$charset); $image_information .= ''; $image_information .= ''; } return $image_information; } public function fetch_and_record_notice($isbn, $xsl) { if (!$isbn) return; $parameters = array( "LOG" => $this->username, "PASS" => $this->password, "GcdFab" => $isbn ); $base_url = $this->url; $arequest = new aligastore_request($base_url, $parameters); $arequest->aligastore_response(); if ($arequest->data) { $arequest->data = $this->apply_xsl_to_xml($arequest->data, $xsl); $images_are_present = preg_match("", $arequest->data); if ($images_are_present) $image_info = $this->get_image_information($isbn, $this->fetchimages); else $image_info = ""; $arequest->data = str_replace("", "", $arequest->data); $arequest->data = str_replace("", "", $arequest->data); $arequest->data = str_replace("", $image_info, $arequest->data); $this->rec_record($arequest->data, $this->source_id, $this->search_id); } } public function fetch_and_record_images($isbn) { if (!is_dir($this->image_folder)) return; $result = array( "thumb" => "", "front" => "", "back" => "" ); $ch = curl_init(); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); $folder = $this->image_folder; $folder_url = $this->image_folder_url; if (!file_exists($folder."/".$isbn."_thumb.jpg")) { $url = str_replace("!!isbn!!", $isbn, $this->image_thumb_url); curl_setopt($ch, CURLOPT_URL, $url); configurer_proxy_curl($ch,$url); $buffer = curl_exec($ch); if (!curl_error($ch)) { file_put_contents($folder."/".$isbn."_thumb.jpg", $buffer); $result['thumb'] = $folder_url."/".$isbn."_thumb.jpg"; } } else $result['thumb'] = $folder_url."/".$isbn."_thumb.jpg"; if (!file_exists($folder."/".$isbn."_front.jpg")) { $url = str_replace("!!isbn!!", $isbn, $this->image_front); curl_setopt($ch, CURLOPT_URL, $url); configurer_proxy_curl($ch,$url); $buffer = curl_exec($ch); if (!curl_error($ch)) { file_put_contents($folder."/".$isbn."_front.jpg", $buffer); $result['front'] = $folder_url."/".$isbn."_front.jpg"; } } else $result['front'] = $folder_url."/".$isbn."_front.jpg"; if (!file_exists($folder."/".$isbn."_back.jpg")) { $url = str_replace("!!isbn!!", $isbn, $this->image_back); curl_setopt($ch, CURLOPT_URL, $url); configurer_proxy_curl($ch,$url); $buffer = curl_exec($ch); if (!curl_error($ch)) { file_put_contents($folder."/".$isbn."_back.jpg", $buffer); $result['back'] = $folder_url."/".$isbn."_back.jpg"; } } else $result['back'] = $folder_url."/".$isbn."_back.jpg"; curl_close($ch); return $result; } public function get_blank_image($url_thumb) { $ch = curl_init(); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); $url = str_replace("!!isbn!!", "", $url_thumb); curl_setopt($ch, CURLOPT_URL, $url); $buffer = curl_exec($ch); curl_close($ch); return $buffer; } public function test_image_validity($isbn, $url) { if (!$this->blank_image) { $this->blank_image = $this->get_blank_image($url); } $ch = curl_init(); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); $url = str_replace("!!isbn!!", $isbn, $url); curl_setopt($ch, CURLOPT_URL, $url); $image = curl_exec($ch); curl_close($ch); return !($image == $this->blank_image); } public function maj_entrepot($source_id,$callback_progress="",$recover=false,$recover_env="") { global $dbh, $charset; @set_time_limit(0); $this->initSource($source_id); if ($recover) { $envt=unserialize($recover_env); $start_notice_id = $envt["current_notice_id"]; $count_lu=$envt["already_read_count"]; } else { $start_notice_id = 0; $count_lu = 0; } //Obtenons une liste d'ISBN à synchroniser //Toute la base $isbns = array(); global $quoi_synchro; if (!$quoi_synchro) $quoi_synchro = array("synchro_base"); foreach($quoi_synchro as $quoi_synchru) { if ($quoi_synchru == "synchro_base") { $sql_local = "SELECT code, notice_id FROM notices WHERE code != '' AND notice_id > ".addslashes($start_notice_id)." ORDER BY notice_id"; $res = pmb_mysql_query($sql_local); while($row = pmb_mysql_fetch_row($res)) { if (isISBN($row[0])) { $isbns[] = array("isbn" => $row[0], "notice_id" => $row[1]); } } } //Panier de notice else if (substr($quoi_synchru, 0, 21) == "synchro_noticecaddie_") { $caddie_id = substr($quoi_synchru, 21); $caddie_content_sql = "SELECT notices.code, notices.notice_id FROM caddie_content LEFT JOIN notices ON (caddie_content.object_id = notices.notice_id) WHERE caddie_content.caddie_id = ".addslashes($caddie_id).' AND notices.code != \'\''; $res = pmb_mysql_query($caddie_content_sql, $dbh); while ($row=pmb_mysql_fetch_row($res)) { if (isISBN($row[0])) { $isbns[] = array("isbn" => $row[0], "notice_id" => $row[1]); } } } //Panier d'exemplaires else if (substr($quoi_synchru, 0, 19) == "synchro_explcaddie_") { $caddie_id = substr($quoi_synchru, 19); $caddie_content_sql = "SELECT notices.code, notices.notice_id FROM caddie_content, exemplaires, notices WHERE caddie_content.object_id = exemplaires.expl_id AND exemplaires.expl_notice = notices.notice_id AND caddie_content.caddie_id = ".addslashes($caddie_id).' AND notices.code != \'\''; $res = pmb_mysql_query($caddie_content_sql, $dbh); while ($row=pmb_mysql_fetch_row($res)) { if (isISBN($row[0])) { $isbns[] = array("isbn" => $row[0], "notice_id" => $row[1]); } } } } //Et on dédoublonne $isbns = array_unique_more($isbns); //Allons chercher la feuille de conversion aliga->pmbunimarc global $base_path; $xsl_transform = file_get_contents($base_path."/admin/connecteurs/in/aligastore/xslt/aligatopmbunimarx.xsl"); //Et c'est parti $count_total = count($isbns)+$count_lu; $latest_percent = floor(100 * $count_lu / $count_total); foreach ($isbns as $isbn) { //Si on veut des images, il nous faut un isbn 13 $isbn["isbn"] = formatISBN($isbn["isbn"], 13); $isbn["isbn"] = preg_replace('/-|\.| /', '', $isbn["isbn"]); //Fetch! $this->fetch_and_record_notice($isbn["isbn"], $xsl_transform); if (floor(100 * $count_lu / $count_total) > $latest_percent) { //Mise à jour de source_sync pour reprise en cas d'erreur $envt["current_notice_id"]=$isbn["notice_id"]; $envt["already_read_count"]=$count_lu; $requete="update source_sync set env='".addslashes(serialize($envt))."' where source_id=".$source_id; pmb_mysql_query($requete); //Inform call_user_func($callback_progress,$count_lu/$count_total,$count_lu,$count_total); // $callback_progress($count_lu / $count_total, $count_lu, $count_total); $latest_percent = floor(100 * $count_lu / $count_total); flush(); ob_flush(); } $count_lu++; } return $count_lu; } //Fonction de recherche public function search($source_id,$query,$search_id) { global $base_path; $this->initSource($source_id); $isbns = array(); foreach($query as $amterm) { if ($amterm->ufield == '010$a') { $isbns[] = $amterm->values[0]; } } $xsl_transform = file_get_contents($base_path."/admin/connecteurs/in/aligastore/xslt/aligatopmbunimarx.xsl"); foreach($isbns as $isbn) { //Si on veut des images, il nous faut un isbn 13 $isbn = formatISBN($isbn, 13); $isbn = preg_replace('/-|\.| /', '', $isbn); $this->fetch_and_record_notice($isbn, $xsl_transform); } } public function enrichment_is_allow(){ return true; } public function getEnrichmentHeader(){ $header= array(); $header[]= ""; return $header; } public function getTypeOfEnrichment($source_id){ $type['type'] = array( "resume", "sommaire", "bio" ); $type['source_id'] = $source_id; return $type; } public function getEnrichment($notice_id,$source_id,$type="",$enrich_params=array(),$page=1){ $enrichment= array(); $infos = $this->getNoticeInfos($notice_id,$source_id); //on renvoi ce qui est demandé... si on demande rien, on renvoi tout.. switch ($type){ case "resume" : if($infos['resume']) $enrichment['resume']['content'] = $infos['resume']; else $enrichment['resume']['content'] = $this->msg['aliga_enrichment_no_resume']; break; case "sommaire" : if($infos['sommaire']) $enrichment['sommaire']['content'] = $infos['sommaire']; else $enrichment['sommaire']['content'] = $this->msg['aliga_enrichment_no_sommaire']; break; case "bio" : if($infos['bio']) $enrichment['bio']['content'] = $infos['bio']; else $enrichment['bio']['content'] = $this->msg['aliga_enrichment_no_bio']; break; default : if($infos['resume']) $enrichment['resume']['content'] = $infos['resume']; else $enrichment['resume']['content'] = $this->msg['aliga_enrichment_no_resume']; if($infos['sommaire']) $enrichment['sommaire']['content'] = $infos['sommaire']; else $enrichment['sommaire']['content'] = $this->msg['aliga_enrichment_no_sommaire']; if($infos['bio']) $enrichment['bio']['content'] = $infos['bio']; else $enrichment['bio']['content'] = $this->msg['aliga_enrichment_no_bio']; break; } $enrichment['source_label']=$this->msg['aliga_enrichment_source']; return $enrichment; } public function getNoticeInfos($notice_id,$source_id){ global $base_path,$charset; $this->initSource($source_id); $return = array(); $rqt = "select code from notices where notice_id = '".$notice_id."'"; $res = pmb_mysql_query($rqt); if(pmb_mysql_num_rows($res)){ $code = pmb_mysql_result($res,0,0); $code = preg_replace('/-|\.| /', '', $code); if($code != ""){ $parameters = array( "LOG" => $this->username, "PASS" => $this->password, "GcdFab" => $code ); $arequest = new aligastore_request($this->url, $parameters); $arequest->aligastore_response(); // $xsl_transform = file_get_contents($base_path."/admin/connecteurs/in/aligastore/xslt/aligatopmbunimarx.xsl"); $xsl_transform = file_get_contents($base_path."/admin/connecteurs/in/aligastore/xslt/aligaEnrichment.xsl"); if ($arequest->data){ file_put_contents("/home/arenou/public_html/alligastore.xml",$arequest->data); $arequest->data = $this->apply_xsl_to_xml($arequest->data, $xsl_transform); file_put_contents("/home/arenou/public_html/alligastore-convert.xml",$arequest->data); $dom=new xml_dom_aligastore($arequest->data,$charset, false); $return['resume'] = $dom->get_value("enrichment/resume"); $return['bio'] = $dom->get_value("enrichment/biographie"); $return['sommaire'] = $dom->get_value("enrichment/sommaire"); } } } return $return; } public function initSource($source_id){ $params=$this->get_source_params($source_id); $this->fetch_global_properties(); if ($params["PARAMETERS"]) { //Affichage du formulaire avec $params["PARAMETERS"] $vars=unserialize($params["PARAMETERS"]); foreach ($vars as $key=>$val) { global ${$key}; ${$key}=$val; } } if (!isset($url)) $url = ""; if (!isset($username)) $username = ""; if (!isset($password)) $password = ""; if (!isset($fetch_images)) $fetch_images = 0; if (!isset($image_folder)) $image_folder = 0; if (!isset($image_folder_public)) $image_folder_public = 0; if (!isset($image_thumb_url)) $image_thumb_url = 0; if (!isset($image_front)) $image_front = 0; if (!isset($image_back)) $image_back = 0; $this->url = $url; $this->username = $username; $this->password = $password; $this->source_id = $source_id; $this->search_id = 0; $this->image_thumb_url = $image_thumb_url; $this->image_front = $image_front; $this->image_back = $image_back; $this->image_folder = $image_folder; $this->image_folder_url = $image_folder_public; $this->fetchimages = $fetch_images; } } ?>