handler=$handler;
$this->params=$params;
}
/**
* Aiguilleur principal
*/
public function proceed(){
global $pmb_allow_authorities_first_page, $force_delete;
//on affecte la proprité item par une instance si nécessaire...
$this->init_item();
switch($this->params->action){
case "ajax_selector" :
return $this->proceed_ajax_selector();
break;
case "list_selector":
$this->proceed_list_selector();
break;
case "edit" :
print $this->get_menu();
$this->proceed_edit();
break;
case "save" :
print $this->get_menu();
$this->proceed_save();
break;
case "search" :
print $this->get_menu();
//si on peut on s'évite le processus de recherche... il est moins fluide !
if($this->params->user_input == "*" ){
$this->proceed_list();
}else{
$this->proceed_search();
}
break;
case "delete" :
print $this->get_menu();
$this->proceed_delete(true);
break;
case "confirm_delete" :
if(!isset($force_delete)) $force_delete = false;
$this->proceed_delete($force_delete);
break;
case "delete_from_cart" :
//voir plus tard si on veut forcer la suppression
return $this->proceed_delete_from_cart(false);
break;
case "add": //Cas ajouté pour être en conformité avec le cas des selecteurs autorité (voir ./selectors/classes/selector_ontology.class.php)
return $this->proceed_selector_add();
break;
case "update": //Cas ajouté pour être en conformité avec le cas des selecteurs autorité (voir ./selectors/classes/selector_ontology.class.php)
return $this->proceed_save(false);
break;
case "list" :
default :
print $this->get_menu();
if(!$pmb_allow_authorities_first_page && $this->params->user_input == "" && $this->params->sub == 'concept') {
$ui_class_name = self::resolve_ui_class_name($this->params->sub,$this->handler->get_onto_name());
print $ui_class_name::get_search_form($this,$this->params);
}else {
$this->proceed_list();
}
break;
}
}
protected function init_item(){
//dans le framework
if(!$this->item && $this->params->sub && ((isset($this->params->id) && $this->params->id) || in_array($this->params->action, array('edit', 'save', 'add', 'push', 'save_push', 'update')))){
if(in_array($this->params->action, array('save', 'save_push', 'update'))){
//lors d'une sauvegarde d'un item, on a posté l'uri
$this->item = $this->handler->get_item($this->handler->get_class_uri($this->params->sub), $this->params->item_uri);
}else{
$this->item = $this->handler->get_item($this->handler->get_class_uri($this->params->sub), onto_common_uri::get_uri($this->params->id));
}
$this->item->set_framework_params($this->params);
}
}
protected function proceed_edit(){
print $this->item->get_form("./".$this->get_base_resource()."categ=".$this->params->categ."&sub=".$this->params->sub."&id=".$this->params->id);
}
protected function proceed_save($list = true){
$this->item->get_values_from_form();
$result = $this->handler->save($this->item);
if($result !== true){
$ui_class_name=self::resolve_ui_class_name($this->params->sub,$this->handler->get_onto_name());
$ui_class_name::display_errors($this,$result);
}else {
vedette_composee::update_vedettes_built_with_element(onto_common_uri::get_id($this->item->get_uri()), TYPE_ONTOLOGY);
if ($list){
$this->proceed_list();
}else{ //Cas ajouté pour les selecteurs
return onto_common_uri::get_id($this->item->get_uri());
}
}
}
protected function proceed_delete($force_delete = false, $print = true){
$this->delete_onto_files();
$result = $this->handler->delete($this->item,$force_delete);
if (!$print) {
return $result;
}
if ($force_delete || !count($result)) {
$this->proceed_list();
} else {
$this->proceed_confirm_delete($result);
}
}
protected function proceed_list($no_print = false){
$ui_class_name=self::resolve_ui_class_name($this->params->sub,$this->handler->get_onto_name());
$result = $ui_class_name::get_search_form($this,$this->params);
$result.= $ui_class_name::get_list($this,$this->params);
$this->set_session_history($this->get_human_query(), 'classic');
$result = str_replace("!!caddie_link!!", entities_authorities_controller::get_caddie_link(), $result);
if(!$no_print) echo($result);
return $result;
}
protected function proceed_list_selector(){
$type = $this->get_item_type_to_list($this->params,true);
$ui_class_name=self::resolve_ui_class_name($type,$this->handler->get_onto_name());
print $ui_class_name::get_search_form_selector($this,$this->params);
print $ui_class_name::get_list_selector($this,$this->params);
}
protected function proceed_ajax_selector(){
//on regarde le range (multiple ou pas..)
$ranges = explode("|||",$this->params->att_id_filter);
$list = array();
foreach ($ranges as $range){
$elements = $this->get_ajax_searched_elements($range);
foreach($elements['elements'] as $key => $value){
$newKey = $key;
if($this->params->return_concept_id){
$newKey = onto_common_uri::get_id($key);
}
$list['elements'][$newKey] = $value;
if(count($ranges)>1){
$list['prefix'][$key]['libelle'] = $elements['label'];
$list['prefix'][$key]['id'] = $range;
}
}
}
return $list;
}
protected function proceed_search($no_print = false) {
$ui_class_name=self::resolve_ui_class_name($this->params->sub, $this->handler->get_onto_name());
$result = $ui_class_name::get_search_form($this, $this->params);
$result.= $ui_class_name::get_list($this, $this->params);
if(!$no_print) echo($result);
return $result;
}
protected function proceed_selector_add(){
//on en aura besoin à la sauvegarde...
$_SESSION['onto_skos_concept_selector_last_parent_id'] = $this->params->parent_id;
//réglons rapidement ce problème... cf. dette technique
print "
";
$type = $this->get_item_type_to_list($this->params,true);
print $this->item->get_form($this->params->base_url, '', 'update');
}
protected function proceed_confirm_delete($result){
$ui_class_name=self::resolve_ui_class_name($this->params->sub,$this->handler->get_onto_name());
print $ui_class_name::get_list_assertions($this, $this->params, $result);
}
/**
* Retourne le menu en fonction des classes de l'ontologie
*
* @return string menu
*/
public function get_menu(){
global $base_path;
$menu = "
".$this->get_title()."
";
return $menu;
}
public function get_base_resource($with_params=true){
$end = "?";
if(strpos($this->params->base_resource,"?")){
$end = "&";
}
return $this->params->base_resource.($with_params? $end : "");
}
/**
* Retourn le titre en fonction des classes de l'ontologie
*
* @return string title
*/
public function get_title(){
global $msg;
if(isset($msg['onto_'.$this->handler->get_onto_name()])){
$title = $msg['onto_'.$this->handler->get_onto_name()];
}else {
$title = $this->handler->get_title();
}
if($this->params->sub){
$classes = $this->handler->get_classes();
foreach($classes as $class){
if($class->pmb_name == $this->params->sub){
$title.= " > ".$this->get_label($class->pmb_name);
}
}
}
return $title;
}
/**
*
* Retourne une liste sans hierarchie
*
* (non-PHPdoc)
* @see onto_common_handler::get_list()
*
* @var string class_uri
* @var onto_param params
*/
public function get_list($class_uri,$params){
global $lang;
$page = $params->page-1;
$displayLabel = $this->handler->get_display_label($class_uri);
$this->nb_results = $this->handler->get_nb_elements($class_uri);
$query = "select * where {
?elem rdf:type <".$class_uri."> .
?elem <".$displayLabel."> ?label
} order by ?label";
if($params->nb_per_page>0){
$query.= " limit ".$params->nb_per_page;
}
if($page>0){
$query.= " offset ".($page*$params->nb_per_page);
}
$this->handler->data_query($query);
$results = $this->handler->data_result();
$list = array(
'nb_total_elements' => $this->nb_results,
'nb_onto_element_per_page' => $params->nb_per_page,
'page' => $page
);
$list['elements'] = array();
if($results && count($results)){
foreach($results as $result){
if(!isset($list['elements'][$result->elem]['default']) || !$list['elements'][$result->elem]['default']){
$list['elements'][$result->elem]['default'] = $result->label;
}
if(isset($result->label_lang) && substr($lang,0,2) == $result->label_lang){
$list['elements'][$result->elem][$lang] = $result->label;
}
}
}
return $list;
}
/**
* Renvoie un libellé en fonction du nom ou de l'uri
*
* @param string $name
*/
public function get_label($name){
return $this->handler->get_label($name);
}
/**
* renvoie le nom de l'ontologie
*
* @return string
*/
public function get_onto_name(){
return $this->handler->get_onto_name();
}
/**
* Retourne le nom de la classe ontologie en fonction de son uri
*
* @param string $uri_class
*/
public function get_class_label($uri_class){
return $this->handler->get_class_label($uri_class);
}
/**
* Renvoie l'uri d'une classe en fonction de son nom pmb
*
* @param string $class_name
*/
public function get_class_uri($class_name){
return $this->handler->get_class_uri($class_name);
}
/**
* Renvoie le nom PMB d'une classe en fonction de son uri
*
* @param string $class_uri
*/
public function get_class_pmb_name($class_uri){
return $this->handler->get_class_pmb_name($class_uri);
}
/**
* retourne les uri des classes de l'ontologie
*
* @return array
*/
public function get_classes(){
return $this->handler->get_classes();
}
/**
* Retourne le label d'un data en fonction de son uri.
*
* @param unknown_type $uri
*/
public function get_data_label($uri){
return $this->handler->get_data_label($uri);
}
/**
*
* Renvoi le nom de la class ui à utiliser pour la classe
*
* @return string
*/
public static function resolve_ui_class_name($class_name,$ontology_name){
return self::search_ui_class_name($class_name,$ontology_name);
}
/**
* Renvoie les propriétés en fonction d'un nom de classe pmb
*
* @param string $pmb_name
*
* @return array
*/
public function get_onto_property_from_pmb_name($pmb_name) {
return $this->handler->get_onto_property_from_pmb_name($pmb_name);
}
/**
*
* Recherche et renvoi le nom de classe ui le plus approprié pour la classe dont on passe le nom
*
* @param string $class_name
* @param string $ontology_name
* @return string
*/
public static function search_ui_class_name($class_name,$ontology_name = ''){
$suffixe = "_ui";
$prefix = "onto_";
if(class_exists($prefix.$ontology_name.'_'.$class_name.$suffixe)){
//La classe ui a le même nom que la classe
//ex : onto_skos_concept<=>onto_skos_concept_ui
return $prefix.$ontology_name.'_'.$class_name.$suffixe;
}else{
//On ne trouve pas l'ui exact, on remonte dans le common pour prendre l'ui qui correspond au type de classe
//ex : onto_skos_concept<=>onto_common_concept_ui
if(class_exists($prefix.'common_'.$class_name.$suffixe)){
return $prefix.'common_'.$class_name.$suffixe;
}else{
if (class_exists('onto_common'.$suffixe)) {
//Pas d'ui correspondant dans le common au nom de la classe... on renvoie onto_common_ui
return 'onto_common'.$suffixe;
} else {
return 'onto_common_ui';
}
}
}
return false;
}
public function get_searched_elements($class_uri,$params){
$search_class_name = $this->get_searcher_class_name($class_uri);
if($params->deb_rech && $search_class_name){
$searcher = new $search_class_name($params->deb_rech);
if($searcher->get_nb_results()){
$results = $searcher->get_sorted_result("default",(($params->page-1)*$params->nb_per_page),$params->nb_per_page);
}else{
$results = array();
}
$elements = array(
'nb_total_elements' => $searcher->get_nb_results(),
'nb_onto_element_per_page' => $params->nb_per_page,
'page' => $params->page-1
);
$elements['elements'] = array();
foreach($results as $item){
$elements['elements'][onto_common_uri::get_uri($item)]['default'] = $this->get_data_label(onto_common_uri::get_uri($item));
}
}else {
//PAS DE CLASSE DE RECHERCHE, on affiche juste la liste
$elements = $this->get_list($class_uri,$params);
}
return $elements;
}
public function get_searched_list($class_uri, $params, $user_query_var="user_input"){
global $dbh;
if(!$params->{$user_query_var} || $params->{$user_query_var} == "*"){
return $this->get_list($class_uri, $params);
}else{
$search_class_name = $this->get_searcher_class_name($class_uri);
if(strpos($search_class_name,'searcher_ontologies') === 0 && isset($params->ontology_id)){
$searcher = new $search_class_name(stripslashes($params->{$user_query_var}),$params->ontology_id);
}else{
$searcher = new $search_class_name(stripslashes($params->{$user_query_var}));
}
$this->nb_results = $searcher->get_nb_results();
if($this->nb_results){
$results = $searcher->get_sorted_result("default",(($params->page-1)*$params->nb_per_page),$params->nb_per_page);
}else{
$results = array();
}
$list = array(
'nb_total_elements' => $this->nb_results,
'nb_onto_element_per_page' => $params->nb_per_page,
'page' => $params->page-1
);
$list['elements'] = array();
if(is_array($results)) {
foreach($results as $item){
/* $id = onto_common_uri::get_id(onto_common_uri::get_uri($item));
$concept = authorities_collection::get_authority(AUT_TABLE_INDEX_CONCEPT, $id);
$parent_label = $concept->get_scheme();
if ($parent_label != "") {
$parent_label = "[" . $parent_label . "] ";
}
$list['elements'][onto_common_uri::get_uri($item)]['default'] = $parent_label . $this->get_data_label(onto_common_uri::get_uri($item));
*/
$list['elements'][onto_common_uri::get_uri($item)]['default'] = $this->get_data_label(onto_common_uri::get_uri($item));
}
}
}
return $list;
}
public function get_searcher_class_name($class_uri){
global $sphinx_active;
$classes= $this->handler->get_classes();
if ($sphinx_active) {
$search_class_name = 'searcher_sphinx_'.$this->handler->get_onto_name().'_'.$classes[$class_uri]->pmb_name;
if (class_exists($search_class_name)) {
return $search_class_name;
}
$search_class_name.= 's';
if (class_exists($search_class_name)) {
return $search_class_name;
}
$search_class_name = 'searcher_sphinx_'.$classes[$class_uri]->pmb_name;
if (class_exists($search_class_name)) {
return $search_class_name;
}
$search_class_name.= 's';
if (class_exists($search_class_name)) {
return $search_class_name;
}
}
$search_class_name = "searcher_autorities_".$this->handler->get_onto_name()."_".$classes[$class_uri]->pmb_name;
if(class_exists($search_class_name)){
return $search_class_name;
}
$search_class_name.= "s";
if(class_exists($search_class_name)){
return $search_class_name;
}
$search_class_name = 'searcher_ontologies_'.$classes[$class_uri]->pmb_name;
if(!class_exists($search_class_name)){
$search_class_name.= 's';
if (class_exists($search_class_name)) {
return $search_class_name;
}
}
$search_class_name = 'searcher_ontologies';
return $search_class_name;
}
/**
*
* Retourne une liste des éléments utilisable pour l'autocomplétion (retourne une liste vide si pas de recherche implémentée pour le type d'item
*
* @return array $elements
*/
public function get_ajax_searched_elements($class_uri){
$search_class_name = $this->get_searcher_class_name($class_uri);
$elements = array(
'label' => "[".$this->get_label($class_uri)."]",
'elements' => array()
);
if($this->params->datas && $search_class_name){
$searcher = new $search_class_name(($this->params->datas == "*" ? '*' : $this->params->datas.'*'));
if($searcher->get_nb_results()){
$results = $searcher->get_sorted_result("default",0,20);
}else{
$results = array();
}
foreach($results as $id){
$elements['elements'][onto_common_uri::get_uri($id)] = $this->get_data_label(onto_common_uri::get_uri($id));
}
}
return $elements;
}
/**
*
* Retourne une liste des éléments à lister
*
* @return array $elements
*/
public function get_list_elements($params){
$class_uri = $this->get_item_type_to_list($params);
switch($params->action){
case "search" :
if(empty($params->user_input)){
$params->user_input = '*';
}
if($this->get_searcher_class_name($class_uri) != false){
return $this->get_searched_list($class_uri, $params);
}
break;
case "list_selector" :
if($params->deb_rech == "*"){
return $this->get_list($class_uri, $params);
}
if($this->get_searcher_class_name($class_uri) != false){
return $this->get_searched_list($class_uri, $params, "deb_rech");
}
break;
}
return $this->get_list($class_uri, $params);
}
protected function get_item_type_to_list($params, $pmb_name = false){
//on commence par récupérer l'URI de la classe de l'ontologie des éléments que l'on veut lister...
switch($params->action){
case "list_selector":
case "selector_add" :
case "selector_save" :
//dans le cas de list_selector, l'information peut provenir de différents endroits selon que l'on soit dans un sélecteur dans un formulaire du framework ou en externe
//1er cas : pas d'objs, pas d'éléments, l'infos est dans le sub
if (!$this->params->objs && !$params->element) {
$class_uri = $this->get_class_uri($params->sub);
}else{
//2ème cas : on a objs, on est dans le framework et objs contient le nom PMB de la propriété
if($this->params->objs != ""){
//on récupère la propriété
$property = $this->get_onto_property_from_pmb_name($params->objs);
//à partir de la propriété, on a le range
$class_uri = $property->range[$params->range];
}else {
//3ème et dernier cas, on prend le le pmb_name dans element
$class_uri = $this->get_class_uri($params->element);
}
}
break;
//sinon c'est simple, c'est dans le sub
default :
$class_uri = $this->get_class_uri($params->sub);
break;
}
if($pmb_name){
return $this->get_class_pmb_name($class_uri);
}
return $class_uri;
}
public function get_ontology_display_name_from_uri($uri){
global $opac_url_base;
$display_name = "";
if(strpos($uri, "skos") !== false) {
$display_name = "http://www.w3.org/2004/02/skos/core#prefLabel";
}
if(strpos($uri, $opac_url_base."ontologies/") !== false) {
$ontology_id = substr(str_replace($opac_url_base."ontologies/", "", $uri), 0, strpos(str_replace($opac_url_base."ontologies/", "", $uri), "#"));
$ontology = new ontology($ontology_id);
$display_name = $ontology->get_display_label_property($uri);
}
return $display_name;
}
public function get_skos_datastore(){
$data_store_config = array(
/* db */
'db_name' => DATA_BASE,
'db_user' => USER_NAME,
'db_pwd' => USER_PASS,
'db_host' => SQL_SERVER,
/* store */
'store_name' => 'rdfstore',
/* stop after 100 errors */
'max_errors' => 100,
'store_strip_mb_comp_str' => 0
);
return new onto_store_arc2($data_store_config);
}
public function get_skos_controler(){
global $deflt_concept_scheme;
$params = new onto_param(array(
'categ'=>'concepts',
'sub'=> 'concept',
'action'=>'list',
'page'=>'1',
'nb_per_page'=>'20',
'id'=>'',
'parent_id'=>'',
'user_input'=>'',
'concept_scheme' => ((isset($_SESSION['onto_skos_concept_last_concept_scheme']) && ($_SESSION['onto_skos_concept_last_concept_scheme'] !== "")) ? $_SESSION['onto_skos_concept_last_concept_scheme'] : $deflt_concept_scheme),
'item_uri' => "",
'only_top_concepts' => ((!$skos_concept_search_form_submitted && isset($_SESSION['onto_skos_concept_only_top_concepts'])) ? $_SESSION['onto_skos_concept_only_top_concepts'] : 0),
'base_resource'=> "autorites.php"
));
return new onto_skos_controler($this->get_skos_handler(), $params);
}
public function get_skos_handler(){
global $class_path;
$onto_store_config = array(
/* db */
'db_name' => DATA_BASE,
'db_user' => USER_NAME,
'db_pwd' => USER_PASS,
'db_host' => SQL_SERVER,
/* store */
'store_name' => 'ontology',
/* stop after 100 errors */
'max_errors' => 100,
'store_strip_mb_comp_str' => 0
);
$data_store_config = array(
/* db */
'db_name' => DATA_BASE,
'db_user' => USER_NAME,
'db_pwd' => USER_PASS,
'db_host' => SQL_SERVER,
/* store */
'store_name' => 'rdfstore',
/* stop after 100 errors */
'max_errors' => 100,
'store_strip_mb_comp_str' => 0
);
$handler = new onto_handler($class_path."/rdf/skos_pmb.rdf", "arc2", $onto_store_config, "arc2", $data_store_config, $this->get_skos_namespaces(), 'http://www.w3.org/2004/02/skos/core#prefLabel');
$handler->get_ontology();
return $handler;
}
public function get_skos_namespaces(){
return array(
"skos" => "http://www.w3.org/2004/02/skos/core#",
"dc" => "http://purl.org/dc/elements/1.1",
"dct" => "http://purl.org/dc/terms/",
"owl" => "http://www.w3.org/2002/07/owl#",
"rdf" => "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
"rdfs" => "http://www.w3.org/2000/01/rdf-schema#",
"xsd" => "http://www.w3.org/2001/XMLSchema#",
"pmb" => "http://www.pmbservices.fr/ontology#"
);
}
/**
* Retourne vrai si la classe est une sous classe d'une indexation, faux sinon
* @param string $pmb_name Nom machine PMB d'une classe
*/
public function class_is_indexed($pmb_name){
$class_uri = $this->get_class_uri($pmb_name);
if($class_uri){
return $this->handler->class_is_indexed($class_uri);
}
return false;
}
protected function proceed_delete_from_cart($force_delete = false){
$result = $this->proceed_delete(false, false);
return $result;
}
protected function delete_onto_files() {
if($this->params) {
$existing_documents = onto_files::get_existing_documents_from_object($this->handler->get_onto_name(), $this->item->get_id());
if (count($existing_documents)) {
// On supprime les documents qui ne sont plus dans le formulaire
foreach ($existing_documents as $document_id) {
$onto_file = new onto_files($document_id);
$onto_file->delete();
}
}
}
}
public function get_nb_results() {
return $this->nb_results;
}
public function get_human_query() {
return '';
}
protected function set_session_history($human_query, $search_type = "extended") {
}
}