src/Controller/EventController.php line 70

Open in your IDE?
  1. <?php
  2. // src/Controller/EventController.php
  3. namespace App\Controller;
  4. use Symfony\Component\Routing\Annotation\Route;
  5. use Symfony\Component\HttpFoundation\Response;
  6. use Symfony\Component\HttpFoundation\Request;
  7. use App\Controller\DMAbstractController;
  8. class EventController  extends DMAbstractController
  9. {
  10.     public function getElementaryQuery($uri)
  11.     {
  12.         $sparqlTemplate = <<<txt
  13. construct { ?s ?p ?o } 
  14. WHERE 
  15. {
  16.     graph ?g { 
  17.             bind(<__uri__> as ?s) .
  18.            graph ?g { ?s ?p ?o } .
  19.            }
  20. } 
  21. txt;
  22.         $query =  str_replace( "__uri__" , $uri , $sparqlTemplate);
  23.         return $query;
  24.     }
  25.     function getCreatorName($endpoint, $uri) {
  26.         $user = $this->getParameter('app.sparql_user');
  27.         $pass = $this->getParameter('app.sparql_pass');
  28.         $name = "Données sur le créateur inconnues dans cette base";
  29.         $auth = $user . ":" . $pass; // le dataset dmsites devrait être en libre accès
  30.         $queryTemplate = "select ?creatorName where { graph ?g { <__uri__> <http://www.w3.org/2004/02/skos/core#prefLabel> ?creatorName  }}";
  31.         $query = str_replace( "__uri__" , $uri , $queryTemplate);
  32.         $requestURL = $endpoint.'?'
  33.             .'query='.urlencode($query)
  34.             .'&format=json';
  35.         $jsonres = self::request($requestURL, $auth);
  36.         $description = json_decode($jsonres, true);
  37.         // echo "description".print_r($description, true)."<br/>";
  38.         if (array_key_exists("results", $description)) {
  39.             if (array_key_exists("bindings", $description["results"])) {
  40.                 if (count($description["results"]["bindings"]))  {
  41.                     if (array_key_exists("creatorName",  $description["results"]["bindings"][0])) {
  42.                         $name = $description["results"]["bindings"][0]["creatorName"]["value"];
  43.                     } else {
  44.                         $name = "Données sur le créateur non accessible"; // le recuperer sur le concept associé
  45.                     }
  46.                 }
  47.             }
  48.         }
  49.         return $name;
  50.     }
  51.     function getTitle($endpoint, $uri) {
  52.         $user = $this->getParameter('app.sparql_user');
  53.         $pass = $this->getParameter('app.sparql_pass');
  54.         $title = "Titre inconnu dans cette base";
  55.         $auth = $user . ":" . $pass; // le dataset dmsites devrait être en libre accès
  56.         $queryTemplate = "select ?title where { graph ?g { <__uri__> <http://www.cidoc-crm.org/cidoc-crm/P149_is_identified_by> ?title  }}";
  57.         $query = str_replace( "__uri__" , $uri , $queryTemplate);
  58.         $requestURL = $endpoint.'?'
  59.             .'query='.urlencode($query)
  60.             .'&format=json';
  61.         $jsonres = self::request($requestURL, $auth);
  62.         //echo "jsonres: ". print_r($jsonres, true)."<br/>";
  63.         $description = json_decode($jsonres, true);
  64.         // echo "description".print_r($description, true)."<br/>";
  65.         if (array_key_exists("results", $description)) {
  66.             if (array_key_exists("bindings", $description["results"])) {
  67.                 if (count($description["results"]["bindings"]))  {
  68.                     if (array_key_exists("title",  $description["results"]["bindings"][0])) {
  69.                         $title = $description["results"]["bindings"][0]["title"]["value"];
  70.                     } else {
  71.                         $title = "Non accessible"; // le recuperer sur le concept associé
  72.                     }
  73.                 }
  74.             }
  75.         }
  76.         return $title;
  77.     }
  78.     function eventStructurer($description) {
  79.         $descstruct = array();
  80.         $descstruct["types"] = array();
  81.         $descstruct["phys"] = $descstruct["concept"]  ="";
  82.         $descstruct["creatoruri"] = array();
  83.         // echo "description: ".print_r($description, true)."\n"; a permis de détecter que certains événements n'ont pas de P108 et P94 associé!
  84.         if ($description) {
  85.             if (array_key_exists("http://www.cidoc-crm.org/cidoc-crm/P108_has_produced", $description)) $descstruct["phys"] = $description["http://www.cidoc-crm.org/cidoc-crm/P108_has_produced"]["@id"];
  86.             if (array_key_exists("http://www.cidoc-crm.org/cidoc-crm/P94_has_created", $description)) $descstruct["concept"] = $description["http://www.cidoc-crm.org/cidoc-crm/P94_has_created"]["@id"];
  87.             if (array_key_exists("cur:P108_has_produced", $description)) $descstruct["phys"] = str_replace("ex:",$description["@context"]["ex"],$description["cur:P108_has_produced"]["@id"]);
  88.             if (array_key_exists("cur:P94_has_created", $description)) $descstruct["concept"] = str_replace("ex:",$description["@context"]["ex"],$description["cur:P94_has_created"]["@id"]);
  89.             if (array_key_exists("http://www.cidoc-crm.org/cidoc-crm/P14_carried_out_by", $description)) {
  90.                 if (array_key_exists("@id",$description["http://www.cidoc-crm.org/cidoc-crm/P14_carried_out_by"])) {
  91.                     array_push($descstruct["creatoruri"], $description["http://www.cidoc-crm.org/cidoc-crm/P14_carried_out_by"]["@id"]);
  92.                 } else {
  93.                     foreach ($description["http://www.cidoc-crm.org/cidoc-crm/P14_carried_out_by"] as $crea) {
  94.                         array_push($descstruct["creatoruri"], $crea["@id"]);
  95.                     }
  96.                 }
  97.             }
  98.             if (array_key_exists("http://www.cidoc-crm.org/cidoc-crm/P4_has_time_span", $description)) $descstruct["timespan"] = $description["http://www.cidoc-crm.org/cidoc-crm/P4_has_time_span"]["@id"];
  99.             #if (array_key_exists("@type", $description)) $descstruct["types"] = $description["@type"];
  100.         }
  101.         return $descstruct;
  102.     }
  103.     function eventDescription($desc, $format)
  104.     {
  105.         $uri = $desc["uri"];
  106.         $user = $this->getParameter('app.sparql_user');
  107.         $pass = $this->getParameter('app.sparql_pass');
  108.         // $auth = "student:igr2018%"; // le dataset dmsites devrait être en libre accès
  109.         $auth = $user . ":" . $pass; // le dataset dmsites devrait être en libre accès
  110.         //$format = "json";
  111.         $query = self::getElementaryQuery($uri);
  112.         $requestURL = $desc["eventendpoint"].'?'
  113.             .'query='.urlencode($query)
  114.             .'&format=json';
  115.         // echo "eventendpoint: ". print_r($desc["eventendpoint"], true)."<br/>";
  116.         // echo "uri: ". print_r($uri, true)."<br/>";
  117.         // echo "query: ". print_r($query, true)."<br/>";
  118.         $jsonres = self::request($requestURL, $auth);
  119.         // echo "jsonres: ". print_r($jsonres, true)."<br/>";
  120.         $description = json_decode($jsonres, true);
  121.         $descstruct = array();
  122.         $descstruct["class"] = array();
  123.         $descstruct = self::eventStructurer($description);
  124.         // aller chercher le titre
  125.         $descstruct["title"] = $this->getTitle($desc["eventendpoint"], $descstruct["concept"]);
  126.         $descstruct["altLabel"] = array();
  127.         $descstruct["dataset"] = "dmexpo ou SemJoconde";
  128.         // $descstruct["triplestore"] = "https://kg.grains-de-culture.fr/";
  129.         $descstruct["triplestore"] = "https://graphpat.telecom-paris.fr/";
  130.         $descstruct["query"] = $query;
  131.         $descstruct["jsonarray"] = $description;
  132.         $descstruct["url"] = $requestURL;
  133.         $descstruct["uri"] = $uri;
  134.         $descstruct["entitytype"] = "Evènement (exposition, acte de création...)";
  135.         $descstruct["entityid"] = $desc["id"];
  136.         if (count($descstruct["creatoruri"])) {
  137.             $descstruct["creatorLink"] = $descstruct["creatoruri"][0];
  138.             $descstruct["creatorName"] = $this->getCreatorName($desc["eventendpoint"], $descstruct["creatoruri"][0]);
  139.         } else {
  140.             $descstruct["creatorLink"] = "";
  141.             $descstruct["creatorName"] = "Créateur inconnu dans cette base";
  142.         }
  143.         if (!array_key_exists("timespan", $descstruct))
  144.             $descstruct["timespan"] = "<inconnue>";
  145.         $descstruct["jsonld"] = "";
  146.         $descstruct["altLabel"] = "";
  147.         $descstruct["uriville"] = "";
  148.         $descstruct["urljson"] = $descstruct["uri"].".json";
  149.         $yasguilink = "https://grains-de-culture.fr/fuseki/ui/#"
  150.             .'query='.urlencode(
  151.                 str_replace("construct { ?s ?p ?o }", "select ?s ?p ?o", $query))
  152.             .'&contentTypeConstruct='.urlencode("text/turtle")
  153.             .'&contentTypeSelect='.urlencode("application/sparql-results+json")
  154.             .'&endpoint='.urlencode($desc["eventendpoint"])
  155.             .'&requestMethod=POST'
  156.             .'&tabTitle='.urlencode("Propriétés")
  157.             .'&headers=%7B%7D'
  158.             .'&outputFormat=table';
  159.         $descstruct["yasguilink"] = $yasguilink;
  160.         switch($format) {
  161.             case 'json':
  162.                 $mime = $this->mimetype($format);
  163.                 $response = new Response($jsonres,
  164.                     Response::HTTP_OK,
  165.                     array('content-type' => $mime)
  166.                 );
  167.                 break;
  168.             case 'xml':
  169.                 $call = $desc["eventendpoint"].'?'
  170.                     .'query='.urlencode($query)
  171.                     .'&format='.$this->mimetype($format)
  172.                     .'&output='.$format;
  173.                 $mime = $this->mimetype($format);
  174.                 $result =self::request($call, $auth);
  175.                 $response = new Response($result,
  176.                     Response::HTTP_OK,
  177.                     array('content-type' => $mime)
  178.                 );
  179.                 break;
  180.             default:
  181.                 $response = $this->render('event/dmcreationevent.html.twig', [
  182.                 # $response = $this->render('work/dmdebugevent.html.twig', [
  183.                     'desc' => $desc,
  184.                     'descstruct' => $descstruct,
  185.                     'entitytype' => $descstruct["entitytype"],
  186.                     'description' => $description
  187.                 ]);
  188.                 break;
  189.         }
  190.         $response->headers->addCacheControlDirective('must-revalidate', true);
  191.         $response->setSharedMaxAge(3600);
  192.         //$response->headers->set('Content-Type', 'application/json');
  193.         return $response;
  194.     }
  195.     /**
  196.     @Route("onto/event/creation/{id}.{_format}", defaults={"_format": "html"}, requirements={
  197.      *         "_format": "html|json|xml|ttl"
  198.      *     })
  199.      */
  200.     public function dmcreationevent(Request $request, $id)
  201.     {
  202.         // exemple: http://datamusee.givingsense.eu/onto/event/creation/AE037477
  203.         $format = $this->getFormat($request);
  204.         $desc = array();
  205.         // 26/6/2024 changement de point car le report sur TPT ne marche pas actuellement
  206.         //$desc["eventendpoint"] = "https://kg.grains-de-culture.fr/SemJoconde/sparql";
  207.         $desc["eventendpoint"] = "https://graphpat.telecom-paris.fr/SemJoconde/sparql";
  208.         $desc["eventdataset"] = "SemJoconde";
  209.         $desc["eventgraph"] = "";
  210.         $desc["comment"] = "";
  211.         $desc["id"] = $id;
  212.         $desc["uri"] = "http://datamusee.givingsense.eu/onto/event/creation/".$desc["id"];
  213.         return self::eventDescription($desc, $format);
  214.     }
  215. }