status)) $this->status = $this->init_sources_status(); return $this->status; } public function init_sources_status(){ $sgbd = $this->sgbd(); $env = $this->env(); $status = array(); if($rst = $sgbd->open_data("sml_classes")){ while($v_rst = $sgbd->fetch_data($rst)){ if(isset($v_rst)){ $status[$v_rst["id"]] = $v_rst; } else{ $status = false; break; } } $sgbd->close_data($rst); } else $status = false; return $status; } # ---------------------------------------------------------------------------------------- # sources # public function init_sources_table(){ return true; } public function sources($params){ $sgbd = $this->sgbd(); $env = $this->env(); // ------------------------------------------------------------------------------- // filtres $start = isset($params["start"]) ? $params["start"] : null; $id_user = isset($params["id_user"]) ? $params["id_user"] : null; $id_groupe = isset($params["id_groupe"]) ? $params["id_groupe"] : null; $status = isset($params["status"]) ? $params["status"] : null; $id_source = isset($params["id_source"]) ? $params["id_source"] : null; $id_composition = isset($params["id_composition"]) ? $params["id_composition"] : null; $id_source_derivation = isset($params["id_source_derivation"]) ? $params["id_source_derivation"] : null; $id_licence = isset($params["id_licence"]) ? $params["id_licence"] : null; $is_reference = isset($params["is_reference"]) ? $params["is_reference"] : null; $order_by = isset($params["order_by"]) ? $params["order_by"] : "ordre"; $order = isset($params["order"]) ? $params["order"] : "ASC"; // ------------------------------------------------------------------------------- // infos pour verifier les filtres if(isset($id_user) || isset($id_groupe)){ $in_source_ids = array(); $in_groupe_ids = array(); if(isset($id_groupe)) $in_groupe_ids[$id_groupe] = true; else{ if(($groupes = $this->groupes($id_user)) !== false){ foreach($groupes["list"] as $id_groupe => $groupe) $in_groupe_ids[$id_groupe] = true; } else return false; } $OK = true; if($rst = $sgbd->open_data("sml_sources_authors")){ while($OK && $v_rst = $sgbd->fetch_data($rst)){ if(isset($v_rst) && isset($v_rst["id_source"]) && isset($v_rst["id_author"])){ if(isset($in_groupe_ids[$v_rst["id_author"]])) $in_source_ids[$v_rst["id_source"]] = true; } else $OK = false; } $sgbd->close_data($rst); } else $OK = false; if(!$OK) return false; } $compositions = array(); if(isset($id_source)){ if(($compositions = $this->source_compositions(array("id_source" => $id_source))) === false){ return false; } } elseif(isset($id_composition)){ if(($compositions = $this->source_compositions(array("id_composition" => $id_composition))) === false){ return false; } } $derivations = array(); if(isset($id_source_derivation)){ if(($derivations = $this->source_derivations($id_source_derivation)) === false){ return false; } } // ------------------------------------------------------------------------------- // boucle principale $sources = array("list" => array(), "total" => 0); $res = array(); if($rst = $sgbd->open_data("sml_sources")){ while($v_rst = $sgbd->fetch_data($rst)){ if(isset($v_rst)){ $res[$v_rst["id"]] = $v_rst; if(!isset($res[$v_rst["id"]]["ordre"])) $res[$v_rst["id"]]["ordre"] = 0; } else{ $res = false; break; } } $sgbd->close_data($rst); if($res !== false){ $res = $this->ordonne($res, $order_by, $order); foreach($res as $id_res => $v_rst){ // ------------------------------- par defaut $MATCH = true; // ------------------------------- filtre sur id_user et id_groupe if(isset($in_source_ids)){ $MATCH = isset($in_source_ids[$v_rst["id"]]) && $in_source_ids[$v_rst["id"]]; } // ------------------------------- filtre sur status if($MATCH){ $MATCH = !isset($status) || (isset($v_rst["id_class"]) && $v_rst["id_class"] == $status); } // -------------------------------- filtre sur id_source if($MATCH){ if(isset($id_source)){ $MATCH = false; if($compositions && is_array($compositions[$id_source])){ foreach($compositions[$id_source] as $id_composition){ if(isset($v_rst["id"]) && $v_rst["id"] == $id_composition){ $MATCH = true; break; } } } } } // -------------------------------- filtre sur id_composition if($MATCH){ if(isset($id_composition)){ if($id_composition){ $MATCH = false; if($compositions && is_array($compositions[$id_composition])){ foreach($compositions[$id_composition] as $_id_source){ if(isset($v_rst["id"]) && $v_rst["id"] == $_id_source){ $MATCH = true; break; } } } } else{ if($compositions){ if(isset($compositions[$v_rst["id"]])) $MATCH = false; } } } } // -------------------------------- filtre sur id_source_derivation if($MATCH){ if(isset($id_source_derivation)){ $MATCH = false; if($derivations && is_array($derivations[$id_source_derivation])){ foreach($derivations[$id_source_derivation] as $_id_derivation){ if(isset($v_rst["id"]) && $v_rst["id"] == $_id_derivation){ $MATCH = true; break; } } } } } // -------------------------------- filtre sur la licence if($MATCH){ if(isset($id_licence)){ $MATCH = false; if(isset($v_rst["licence"]) && $v_rst["licence"] == $id_licence) $MATCH = true; } } // -------------------------------- filtre sur is_reference if($MATCH){ if(isset($is_reference)){ if($is_reference){ $MATCH = isset($v_rst["reference"]) && $v_rst["reference"]; } else{ $MATCH = !isset($v_rst["reference"]) || !$v_rst["reference"]; } } } // -------------------------------- filtre sur quantite de resultats if($MATCH){ $sources["total"]++; $MATCH = !isset($start) || !$env->config("max_list") || ($sources["total"] > $start && $sources["total"] <= ($start + $env->config("max_list"))); } // -------------------------------- ajout aux resultats si MATCH if($MATCH) $sources["list"][$v_rst["id"]] = $v_rst; } } } else return false; foreach($sources["list"] as $id_source => $source){ if(($sources["list"][$source["id"]] = $this->load_source($source)) === false) return false; } return $sources; } public function source($id, $load = false){ $sgbd = $this->sgbd(); if(($source = $sgbd->get_data("sml_sources", $id)) !== false){ $source["status"] = $source["id_class"]; $source = $load ? $this->load_source($source) : $this->get_source_from_v_rst($source); return $source; } return false; } public function get_source_from_v_rst($v_rst){ $sgbd = $this->sgbd(); $source = $this->empty_source(); foreach($v_rst as $rst_key => $rst_value) $source[$rst_key] = $rst_value; $source["status"] = $source["id_class"]; if($source["reference"]){ if(!is_array($source["reference"])){ $reference_url = $source["reference"]; $source["reference"] = $this->empty_source(); $source["reference"]["xml"]["url"] = $reference_url; } } else{ if(!is_array($source["licence"])){ $source["licence"] = array( "id" => $source["licence"] ); } } return $source; } public function load_source($source){ $env = $this->env(); if(!isset($source["id"])) return false; $source = $this->get_source_from_v_rst($source); $source["xml"] = array( "url" => $this->source_xml_url($source["id"]), "content" => $this->get_source_xml($source["id"]) ); $source["documents"] = array(); if(($source["groupes"] = $this->source_groupes($source["id"])) === false) return false; $source["image_uri"] = ( isset($source["image"]) && $source["image"] ? $env->path("content")."uploads/".$source["image"] : "" ); if(($source["has_sources"] = $this->has_sources($source["id"])) === false) return false; if(($source["has_derivations"] = $this->source_derivations(array("derivation" => $source["id"]))) === false) return false; if(($source["derivations"] = $this->source_derivations(array("id_source" => $source["id"]))) === false) return false; if(($source["reference"] = $this->source_reference($source)) === false) return false; if($user = $env->user()){ if(($source["permissions"] = $this->source_permissions($source, $user["id"])) === false) return false; } if(!$source["reference"]){ if(($source["documents"] = $this->source_documents($source["id"])) === false) return false; } return $source; } public function add_source( $groupes, $titre, $status, $licence, $documents = array(), $reference = array(), $derivations = array(), $infos = array() ){ $sgbd = $this->sgbd(); $source = array( "id_class" => $status, "reference" => $reference ? $reference["xml"]["url"] : null, "titre" => $reference ? null : $titre, "licence" => $reference ? null : $licence, "date_creation" => isset($infos["date_creation"]) ? $infos["date_creation"] : null, "date_inscription" => isset($infos["date_inscription"]) ? $infos["date_inscription"] : date("Y-m-d") ); foreach($infos as $key => $value) if(!isset($source[$key])) $source[$key] = $value; $id = $sgbd->add_data("sml_sources", $source); if(!isset($id)) return false; foreach($groupes as $id_groupe => $groupe){ if($groupe["id"] && $groupe["id_groupe_status"]){ if(!$this->add_source_groupe($id, $groupe["id"], $groupe["id_groupe_status"])) return false; } else return false; } foreach($derivations as $source_derivation){ if( ( $id_source_derivation = $this->add_source_derivation( $id, $source_derivation["xml"]["url"], $source_derivation["xml"]["use_edit_content"] ? $source_derivation["xml"]["content"] : "" ) ) === false ){ return false; } } if($reference){ if($reference["xml"]["use_edit_content"]){ if(!$this->set_edit_reference_content($id, $reference["xml"]["content"])){ return false; } } } else{ foreach($documents as $document){ if(!$this->add_source_document($id, $document)) return false; } } if(!$this->set_source_xml($id)) return false; return $id; } public function set_source( $id, $groupes, $titre, $status, $licence, $documents = array(), $reference = array(), $derivations = array(), $infos = array() ){ if($source = $this->source($id)){ $sgbd = $this->sgbd(); $source["reference"] = $reference ? $reference["xml"]["url"] : null; $source["titre"] = $reference ? null : $titre; $source["licence"] = $reference ? null : $licence; $source["date_creation"] = isset($infos["date_creation"]) ? $infos["date_creation"] : null; foreach($infos as $key => $value) $source[$key] = $value; if(!$sgbd->set_data("sml_sources", $id, $source)) return false; if(!$this->del_source_groupes($id)) return false; foreach($groupes as $id_groupe => $groupe){ if($groupe["id"] && $groupe["id_groupe_status"]){ if(!$this->add_source_groupe($id, $groupe["id"], $groupe["id_groupe_status"])) return false; } else return false; } if(!$this->del_source_derivations($id)) return false; if(!$this->del_edit_reference_content($id)) return false; if(!$this->del_source_documents($id)) return false; foreach($derivations as $source_derivation){ if( ( $id_source_derivation = $this->add_source_derivation( $id, $source_derivation["xml"]["url"], $source_derivation["xml"]["use_edit_content"] ? $source_derivation["xml"]["content"] : "" ) ) === false ){ return false; } } if($reference){ if($reference["xml"]["use_edit_content"]){ if(!$this->set_edit_reference_content($id, $reference["xml"]["content"])){ return false; } } } else{ foreach($documents as $document){ if(!$this->add_source_document($id, $document)) return false; } } if(!$this->set_source_xml($id)) return false; return true; } return false; } public function set_source_info($id_source, $key, $value){ $sgbd = $this->sgbd(); if($source = $sgbd->get_data("sml_sources", $id_source)){ $source[$key] = $value; if($sgbd->set_data("sml_sources", $id_source, $source)) return true; } return false; } public function del_source($id){ $sgbd = $this->sgbd(); if(!$this->del_source_compositions(array("id_source" => $id, "id_composition" => $id))) return false; if(!$this->del_edit_reference_content($id)) return false; if(!$this->del_source_derivations($id)) return false; if(!$this->del_source_xml($id)) return false; if(!$this->del_source_documents($id)) return false; if(!$this->del_source_groupes($id)) return false; if(!$sgbd->del_data("sml_sources", $id)) return false; return true; } # ---------------------------------------------------------------------------------------- # derivations de sources # public function init_source_derivations(){ return true; } public function source_derivations($params){ $sgbd = $this->sgbd(); $env = $this->env(); $derivations = array(); // sources dont "id_source" est une derivation if(isset($params["id_source"])){ if($rst = $sgbd->open_data("sml_source_derivations")){ while($v_rst = $sgbd->fetch_data($rst)){ if(isset($v_rst)){ if(isset($v_rst["id"]) && isset($v_rst["id_source"]) && $v_rst["id_source"] == $params["id_source"]){ $derivations[$v_rst["id"]] = array(); $derivation_edit_file = $this->derivation_edit_xml_path($v_rst["id_source"], $v_rst["id"]); if(file_exists($derivation_edit_file)){ if(($derivation_edit_content = $this->get_edit_derivation_content($v_rst["id_source"], $v_rst["id"])) !== false){ if(($derivations[$v_rst["id"]] = $this->source_xml_read($v_rst["derivation"], $derivation_edit_content)) !==false){ $derivations[$v_rst["id"]]["xml"] = array( "url" => $v_rst["derivation"], "content" => $derivation_edit_content, "use_edit_content" => true ); } else{ $derivations = null; break; } } else{ $derivations = null; break; } } else{ if(($derivations[$v_rst["id"]] = $this->source_xml_read($v_rst["derivation"])) !==false){ $derivations[$v_rst["id"]]["id_source"] = $v_rst["id_source"]; } else $derivations[$v_rst["id"]] = $this->empty_source(); } $derivations[$v_rst["id"]]["id_source"] = $v_rst["id_source"]; } } else{ $derivations = null; break; } } $sgbd->close_data($rst); } if(!isset($derivations)) return false; return $derivations; } // sources qui derivent de "derivation" elseif(isset($params["derivation"])){ $source_xml_url = $params["derivation"]; if(preg_match("/^[0-9]+$/", $source_xml_url)) $source_xml_url = $this->source_xml_url($source_xml_url); $id_sources = array(); if($rst = $sgbd->open_data("sml_source_derivations")){ while($v_rst = $sgbd->fetch_data($rst)){ if(isset($v_rst)){ if(isset($v_rst["id_source"]) && isset($v_rst["derivation"]) && $v_rst["derivation"] == $source_xml_url){ $id_sources[$v_rst["id_source"]] = true; } } else{ $id_sources = false; break; } } $sgbd->close_data($rst); } else $id_sources = false; if($id_sources === false) return false; if($id_sources){ if($rst = $sgbd->open_data("sml_sources")){ while($v_rst = $sgbd->fetch_data($rst)){ if(isset($v_rst)){ if(isset($v_rst["id"]) && isset($id_sources[$v_rst["id"]])){ $derivations[$v_rst["id"]] = $v_rst; } } else{ $derivations = false; break; } } $sgbd->close_data($rst); } else $derivations = false; } return $derivations; } return false; } public function source_derivation($id){ $sgbd = $this->sgbd(); return $sgbd->get_data("sml_source_derivations", $id); } public function add_source_derivation($id_source, $derivation, $edit_content = ""){ $sgbd = $this->sgbd(); $id_source_derivation = $sgbd->add_data( "sml_source_derivations", array( "id_source" => $id_source, "derivation" => $derivation ) ); if(isset($id_source_derivation)){ if($edit_content){ if(!$this->set_edit_derivation_content($id_source, $id_source_derivation, $edit_content)){ $id_source_derivation = false; } } } else $id_source_derivation = false; return $id_source_derivation; } public function set_source_derivation($id_source_derivation, $id_source, $derivation, $edit_content = ""){ $sgbd = $this->sgbd(); if( ( $sgbd->set_data( "sml_source_derivations", $id_source_derivation, array( "id_source" => $id_source, "derivation" => $derivation ) ) ) ){ if($edit_content){ if(!$this->set_edit_derivation_content($id_source, $id_source_derivation, $edit_content)){ return false; } } return true; } return false; } public function del_source_derivation($id_source_derivation){ if(($derivation = $this->source_derivation($id_source_derivation)) !== false){ if(($derivations = $this->source_derivations(array("id_source" => $derivation["id_source"]))) !== false){ $sgbd = $this->sgbd(); if(!$sgbd->del_data("sml_source_derivations", $id_source_derivation)) return false; if(count($derivations) > 1){ return $this->del_edit_derivation_content($derivation["id_source"], $id_source_derivation); } else return $this->del_edit_derivations($derivation["id_source"]); } } return false; } public function del_source_derivations($id_source){ $sgbd = $this->sgbd(); $id_source_derivations = array(); if($rst = $sgbd->open_data("sml_source_derivations")){ while($v_rst = $sgbd->fetch_data($rst)){ if(isset($v_rst)){ if(isset($v_rst["id"]) && isset($v_rst["id_source"]) && $v_rst["id_source"] == $id_source){ $id_source_derivations[] = $v_rst["id"]; } } else{ $id_source_derivations = false; break; } } $sgbd->close_data($rst); } else $id_source_derivations = false; if($id_source_derivations === false) return false; if($id_source_derivations){ foreach($id_source_derivations as $id_source_derivation){ if(!$sgbd->del_data("sml_source_derivations", $id_source_derivation)) return false; } } return $this->del_edit_derivations($id_source); } # ---------------------------------------------------------------------------------------- # references # public function source_reference($source){ $reference = array(); if($source["reference"]){ if(!is_array($source["reference"])){ $source["reference"] = array( "url" => $source["reference"], "content" => "", "use_edit_content" => false ); } $reference_edit_file = $this->reference_edit_xml_path($source["id"]); if(file_exists($reference_edit_file)){ if(($reference_edit_content = $this->get_edit_reference_content($source["id"])) !== false){ if(($reference = $this->source_xml_read($source["reference"], $reference_edit_content)) !==false){ $reference["xml"] = array( "url" => $source["reference"]["xml"]["url"], "content" => $reference_edit_content, "use_edit_content" => true ); } else return false; } else return false; } else{ if(($reference = $this->source_xml_read($source["reference"]["xml"]["url"])) ===false){ $reference = $this->empty_source(); } } } return $reference; } # ---------------------------------------------------------------------------------------- # documents # public function source_documents($id_source){ $sgbd = $this->sgbd(); $documents = array(); if($sgbd->data_exists("sml_sources/".$id_source)){ if($rst = $sgbd->open_data("sml_sources/".$id_source)){ $OK = true; while($OK && ($document = $sgbd->fetch_data($rst))){ if(isset($document)) $documents[$document["id"]] = $document; else $OK = false; } $sgbd->close_data($rst); } else $OK = false; if(!$OK) return false; } return $documents; } public function add_source_document($id_source, $document){ $sgbd = $this->sgbd(); if(!$sgbd->data_exists("sml_sources/".$id_source)){ if(!$sgbd->create_data("sml_sources/".$id_source)) return false; } if( !( $id_document = $sgbd->add_data( "sml_sources/".$id_source, array( "nom" => $document["nom"], "url" => $document["url"] ) ) ) ){ return false; } return $id_document; } public function del_source_documents($id_source){ $sgbd = $this->sgbd(); if($sgbd->data_exists("sml_sources/".$id_source)){ if(!$sgbd->remove_data("sml_sources/".$id_source)) return false; } return true; } # ---------------------------------------------------------------------------------------- # compositions de sources # public function source_compositions($params){ $id_source = isset($params["id_source"]) ? $params["id_source"] : null; $id_composition = isset($params["id_composition"]) ? $params["id_composition"] : null; $sgbd = $this->sgbd(); $env = $this->env(); $compositions = array(); if(isset($id_source)){ if($rst = $sgbd->open_data("sml_source_compositions")){ while($v_rst = $sgbd->fetch_data($rst)){ if(isset($v_rst)){ if(isset($v_rst["id_source"]) && isset($v_rst["id_composition"]) && $v_rst["id_source"] == $id_source){ if(!isset($compositions[$v_rst["id_source"]])) $compositions[$v_rst["id_source"]] = array(); $compositions[$v_rst["id_source"]][] = $v_rst["id_composition"]; } } else{ $compositions = false; break; } } $sgbd->close_data($rst); } else $compositions = false; } elseif(isset($id_composition)){ if($id_composition){ if($rst = $sgbd->open_data("sml_source_compositions")){ while($v_rst = $sgbd->fetch_data($rst)){ if(isset($v_rst)){ if(isset($v_rst["id_source"]) && isset($v_rst["id_composition"]) && $v_rst["id_composition"] == $id_composition){ if(!isset($compositions[$v_rst["id_composition"]])) $compositions[$v_rst["id_composition"]] = array(); $compositions[$v_rst["id_composition"]][] = $v_rst["id_source"]; } } else{ $compositions = false; break; } } $sgbd->close_data($rst); } else $compositions = false; } else{ if($rst = $sgbd->open_data("sml_source_compositions")){ while($v_rst = $sgbd->fetch_data($rst)){ if(isset($v_rst)){ if(isset($v_rst["id_source"])) $compositions[$v_rst["id_source"]] = true; } else{ $compositions = false; break; } } $sgbd->close_data($rst); } else $compositions = false; } } return $compositions; } public function set_source_composition($id_source, $id_composition){ $sgbd = $this->sgbd(); if( $sgbd->add_data( "sml_source_compositions", array( "id_source" => $id_source, "id_composition" => $id_composition ) ) ){ return $this->set_source_xml($id_composition); } return false; } public function del_source_compositions($params){ $OK = true; $id_source = isset($params["id_source"]) ? $params["id_source"] : null; $id_composition = isset($params["id_composition"]) ? $params["id_composition"] : null; $to_delete = array(); $to_update = array(); if(isset($id_composition)) $to_update[$id_composition] = true; $sgbd = $this->sgbd(); if($rst = $sgbd->open_data("sml_source_compositions")){ while($v_rst = $sgbd->fetch_data($rst)){ if(isset($v_rst)){ if(isset($v_rst["id"]) && isset($v_rst["id_source"]) && isset($v_rst["id_composition"])){ if( (isset($id_source) && $v_rst["id_source"] == $id_source) || (isset($id_composition) && $v_rst["id_composition"] == $id_composition) ){ $to_delete[] = $v_rst["id"]; } if(isset($id_source) && $v_rst["id_source"] == $id_source) $to_update[$v_rst["id_composition"]] = true; } } else{ $OK = false; break; } } $sgbd->close_data($rst); } else $OK = false; if(!$OK) return false; foreach($to_delete as $id_source_composition){ if(!$sgbd->del_data("sml_source_compositions", $id_source_composition)) return false; } foreach($to_update as $id_source_xml => $delete){ if(!$this->set_source_xml($id_source_xml)) return false; } return true; } public function has_sources($id_composition){ $sgbd = $this->sgbd(); $env = $this->env(); $has_sources = 0; if($rst = $sgbd->open_data("sml_source_compositions")){ while($v_rst = $sgbd->fetch_data($rst)){ if(isset($v_rst)){ if(isset($v_rst["id_source"]) && isset($v_rst["id_composition"])){ if($v_rst["id_composition"] == $id_composition){ $has_sources = 1; break; } } } else{ $has_sources = false; break; } } $sgbd->close_data($rst); } else $has_sources = false; return $has_sources; } public function source_ariane($id_source, $ariane = array()){ if(($compositions = $this->source_compositions(array("id_source" => $id_source))) !== false){ if(isset($compositions[$id_source]) && $compositions[$id_source]){ foreach($compositions[$id_source] as $id_composition){ if(($ariane = $this->source_ariane($id_composition, $ariane)) !== false){ if(($ariane[$id_composition] = $this->source($id_composition)) !== false){ } else $ariane = false; } else $ariane = false; break; } } } else $ariane = false; return $ariane; } }