code = "liste_regions()"; return $p; } function liste_regions(){ $tab_regions=array( '3'=>"Auvergne-Rhône-Alpes", '5'=>"Bourgogne-Franche-Comté", '6'=>"Bretagne", '7'=>"Centre-Val de Loire", '9'=>"Corse", '1'=>"Grand Est", '23'=>"Guadeloupe", '24'=>"Guyane", '17'=>"Hauts-de-France", '12'=>"Île-de-France", '26'=>"La Réunion", '25'=>"Martinique", '28'=>"Mayotte", '4'=>"Normandie", '2'=>"Nouvelle-Aquitaine", '13'=>"Occitanie", '18'=>"Pays de la Loire", '21'=>"Provence-Alpes-Côte d'Azur", '27'=>"Autre pays" ); return $tab_regions; } /********************************** * Le préfixe MES identifie les éléments * défini dans ce fichier mes_fonctions.php ***********************************/ define("MES", "MES"); $GLOBALS[MES] = array("repartition" => false, "repartition2" => false); /************************************ * Balise récupérant les évènements répartis par région *************************************/ function balise_MES_REPARTITION($p) { $tag = ""; if (($v = interprete_argument_balise(1,$p))!==NULL){ $tag = $v; } $p->code = "mes_balise_Repartition($tag)"; return $p; } /************************************ * Balise récupérant les évènements répartis par pays et par région *************************************/ function balise_MES_REPARTITION2($p) { $tag = ""; if (($v = interprete_argument_balise(1,$p))!==NULL){ $tag = $v; } $p->code = "mes_balise_Repartition2($tag)"; return $p; } /************************************ * Récupération du JSON et traitement pour regrouper par région * Renvoie le tableau associatif repartition avec deux clés : * - total : le nombre total d'évènements * - regions : tableau associatif avec comme clé le nom de la région et comme valeur * le tableau des évènements *************************************/ function mes_balise_Repartition($tag) { if ($GLOBALS[MES]["repartition"] != false) { return $GLOBALS[MES]["repartition"]; } $url = 'http://www.agendadulibre.org/maps.json?future=false&tag='.$tag; $json = json_decode(file_get_contents($url), true); $evenementCount = count($json); $regionMap = array(); for($i = 0; $i < $evenementCount; $i++) { $evenement = $json[$i]; $region = "Autre"; if (array_key_exists("region", $evenement["properties"])) { $region = $evenement["properties"]["region"]; } if (array_key_exists($region, $regionMap)) { $regionMap[$region][] = $evenement; } else { $regionMap[$region] = array($evenement); } } uksort($regionMap, "mes_compare"); $repartition = array( "total" => $evenementCount, "regions" => $regionMap ); $GLOBALS[MES]["repartition"] = $repartition; return $repartition; } /************************************ * Travaille en deux étapes : * - 1) Récupère les évènements et les classe par région * - 2) Récupère la liste des pays et des régions et les affecte par pays * * Renvoie le tableau associatif $repartition avec deux clés : * - total : le nombre total d'évènements * - pays : tableau des pays * - ailleurs : tableau des évènements qui n'ont pas été classé dans un pays * * Un pays est un tableau associatif avec comme clés : * - name : le nom du pays * - code : son code (à noter que dans le JSON envoyé par l'agenda du libre les pays se distinguent des régions par la présence d'un code) * - sousregions : le tableau des sous-régions * - evenementsnationaux : évènements codés au niveau du pays *************************************/ function mes_balise_Repartition2($tag) { if ($GLOBALS[MES]["repartition2"] != false) { return $GLOBALS[MES]["repartition2"]; } $url_evenements = 'http://www.agendadulibre.org/events.json?future=false&tag='.$tag; $evenementArray = json_decode(file_get_contents($url_evenements), true); $evenementCount = count($evenementArray); $evenementParRegionMap = array(); for($i = 0; $i < $evenementCount; $i++) { $evenement = $evenementArray[$i]; $region_id = 0; if (array_key_exists("region_id", $evenement)) { $region_id = $evenement["region_id"]; } if (array_key_exists("id_".$region_id, $evenementParRegionMap)) { $evenementParRegionMap["id_".$region_id][] = $evenement; } else { $evenementParRegionMap["id_".$region_id] = array($evenement); } } $url_regions = "http://www.agendadulibre.org/regions.json"; $total = 0; $json_regions = json_decode(file_get_contents($url_regions), true); $regionCount = count($json_regions); $paysArray = array(); $regionTraiteeMap = array(); for($i = 0; $i < $regionCount; $i++) { $region = $json_regions[$i]; if (strlen($region['code']) > 0) { $pays_id = $region['id']; $pays = array("name" => $region['name'], "code" => $region['code'], "sousregions" => array()); $total_pays = 0; for($j = 0; $j < $regionCount; $j++) { $sousregion = $json_regions[$j]; if ($sousregion["region_id"] == $pays_id) { $region_id = $sousregion["id"]; if (array_key_exists("id_".$region_id, $evenementParRegionMap)) { $evenementParRegionArray = $evenementParRegionMap["id_".$region_id]; $total_region = count($evenementParRegionArray); $sousregion["evenements"] = $evenementParRegionArray; $total_pays += $total_region; $total += $total_region; $pays["sousregions"][] = $sousregion; $regionTraiteeMap["id_".$region_id] = 1; } } } if (array_key_exists("id_".$pays_id, $evenementParRegionMap)) { $evenementNationalArray = $evenementParRegionMap["id_".$pays_id]; $total_national = count($evenementNationalArray); $total_pays += $total_national; $total += $total_national; $pays["evenementsnationaux"] = $evenementNationalArray; $regionTraiteeMap["id_".$pays_id] = 1; } if ($total_pays > 0) { $paysArray[] = $pays; } } } // Vérification que toutes les régions ont été traitées, les évènements non traités sont placés « ailleurs » $ailleursArray = array(); foreach ($evenementParRegionMap as $key => $array) { if (!(array_key_exists($key, $regionTraiteeMap))) { $ailleursArray = array_merge($ailleursArray, $array); } } // Objet final $repartition = array( "total" => $total, "pays" => $paysArray, "ailleurs" => $ailleursArray ); $GLOBALS[MES]["repartition2"] = $repartition; return $repartition; } /************************************ * Fonction de comparaison tenant compte des accents *************************************/ function mes_compare($a, $b) { $coll = collator_create( 'fr_FR' ); return collator_compare($coll, $a, $b); } /************************************ * Spécial filtre liste des évènements * Le chemin du répertoire IMG est codé en dur ! *************************************/ function filtre_lef_liste_evenements($annee) { $IMG_ROOT = "/var/lib/spip/sites/www.libre-en-fete.net/"; if (!is_numeric($annee)) { return "Paramètre année incorrect"; } $tag = "libre-en-fete-".$annee; $jsonString = file_get_contents("https://www.agendadulibre.org/events.json?future=false&tag=".$tag); $json = json_decode($jsonString, TRUE); $evenementCount = count($json); if ($evenementCount == 0) { return "Aucun évènement"; } $currentTime = date(DATE_ATOM); $dirPath = $IMG_ROOT."IMG/agendadulibre/".$annee; if (!file_exists($dirPath)) { mkdir($dirPath, 0777, TRUE); } $evenementArray = array(); for($i = 0; $i < $evenementCount; $i++) { $evenement = $json[$i]; $id = $evenement["id"]; $path = $dirPath."/".$id; if (file_exists($path)) { $time = file_get_contents($path); } else { $time = $currentTime; $fp = fopen($path, 'w'); fwrite($fp, $time); fclose($fp); } $evenement["time"] = $time; $evenementArray[] = $evenement; } usort($evenementArray, "lef_comparaison"); $result = ""; for($i = 0; $i < $evenementCount; $i++) { $evenement = $evenementArray[$i]; $increment = ($evenementCount - $i); $date = date_create($evenement["start_time"]); $result .= ""; $result .= "".$increment.""; $result .= ''.$evenement["id"].""; $result .= "".date_format($date, 'd/m').""; $result .= "".$evenement["title"].""; $result .= "".$evenement["city"].""; $result .= "".$evenement["time"].""; $result .= "".$evenement["contact"].""; $result .= ""; } return $result; } function lef_comparaison($evt1, $evt2) { $time1 = $evt1["time"]; $time2 = $evt2["time"]; if ($time1 > $time2) { return -1; } if ($time1 < $time2) { return 1; } $id1 = $evt1["id"]; $id2 = $evt2["id"]; if ($id1 > $id2) { return -1; } if ($id1 < $id2) { return 1; } return 0; }