libreenfete-squelettes/mes_fonctions.php

385 lines
13 KiB
PHP

<?php
require('lef_fonctions.php');
function balise_LISTE_REGIONS ($p) {
$p->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);
/************************************
* Balise récupérant les évènements répartis par pays et 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;
}
/************************************
* 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_Repartition($tag) {
if ($GLOBALS[MES]["repartition"] != false) {
return $GLOBALS[MES]["repartition"];
}
$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]["repartition"] = $repartition;
return $repartition;
}*/
function mes_balise_Repartition($tag) {
if ($GLOBALS[MES]["repartition"] != false) {
return $GLOBALS[MES]["repartition"];
}
//Étape 1 : récupération de la liste des évènements
$url_evenements = 'http://www.agendadulibre.org/events.json?future=false&tag='.$tag;
$evenementArray = json_decode(file_get_contents($url_evenements), true);
$evenementCount = count($evenementArray);
//Étape 2 : balayage des évènements et ventilation par région (champ « region_id »)
$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);
}
}
//Étape 3 : récupération de la liste des régions
$url_regions = "http://www.agendadulibre.org/regions.json";
$total = 0;
$json_regions = json_decode(file_get_contents($url_regions), true);
$paysArray = array();
$regionTraiteeMap = array();
$internet = array("evenements" => array(), "total" => 0);
//Étape 4 : création d'une instance LefPays pour chaque région qui correspond à un pays (présence du champ code), création des sous-régions de ce pays et affectation des évènements liés à ce pays
foreach($json_regions as $json_region) {
$pays_code = $json_region['code'];
if ($pays_code == "internet") {
$pays_internet = new LefInternet($json_region);
$pays_internet->populate($evenementParRegionMap);
$internet = $pays_internet->toArray();
$total += $internet["total"];
} else if (strlen($pays_code) > 0) {
$pays = new LefPays($json_region);
$pays->populate($json_regions, $evenementParRegionMap);
foreach($pays->getKeyArray() as $key) {
$regionTraiteeMap[$key] = 1;
}
$total_pays = $pays->getTotal();
if ($total_pays > 0) {
if ($pays->getCode() == "internet") {
$internet = $pays->toArray();
} else {
$paysArray[] = $pays->toArray();
}
$total += $total_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,
"internet" => $internet,
"ailleurs" => $ailleursArray
);
$GLOBALS[MES]["repartition"] = $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);
}
/************************************
* Vérifie que le paramètre est bien numérique
*************************************/
function filtre_lef_test_num($annee) {
if (!is_numeric($annee)) {
return "";
} else {
return $annee;
}
}
/************************************
* Vérifie que le paramètre est un mot-clé correct
*************************************/
function filtre_lef_test_tag($tag) {
if (preg_match('/^[-a-z0-9]+$/', $tag)) {
return $tag;
} else {
return "";
}
}
/************************************
* Spécial filtre liste des évènements
*************************************/
function filtre_lef_liste_evenements($annee) {
if (strlen($annee) == 0) {
return "";
}
if (!is_numeric($annee)) {
return "Paramètre année incorrect";
}
$evenementArray = lef_getEvenementArrayParAnnee($annee);
return lef_getEvenementRows($evenementArray);
}
function filtre_lef_liste_evenements_tag($tag) {
if (strlen($tag) == 0) {
return "";
}
if (!preg_match('/^[-a-z0-9]+$/', $tag)) {
return "Paramètre tag incorrect";
} else {
$evenementArray = lef_getEvenementArrayParTag($tag);
return lef_getEvenementRows($evenementArray);
}
}
function filtre_lef_evenement_array($annee) {
if (!is_numeric($annee)) {
return array();
}
return lef_getEvenementArrayParAnnee($annee);
}
function filtre_lef_evenement_array_tag($tag) {
return lef_getEvenementArrayParTag($tag);
}
function filtre_lef_date($time) {
$date = date_create($time);
return date_format($date, 'd/m');
}
/************************************
* Enregistrement local des évènements pour repérer les nouveaux
* Le chemin du répertoire IMG est codé en dur !
*************************************/
function lef_getEvenementArrayParAnnee($annee) {
return lef_getEvenementArray("libre-en-fete-".$annee, $annee);
}
function lef_getEvenementArrayParTag($tag) {
return lef_getEvenementArray($tag, "tags/".$tag);
}
function lef_getEvenementArray($tag, $storeDir) {
$IMG_ROOT = "/var/lib/spip/sites/www.libre-en-fete.net/";
$jsonString = file_get_contents("https://www.agendadulibre.org/events.json?future=false&tag=".$tag);
$json = json_decode($jsonString, TRUE);
$evenementCount = count($json);
$currentTime = date(DATE_ATOM);
$dirPath = $IMG_ROOT."IMG/agendadulibre/".$storeDir;
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");
return $evenementArray;
}
function lef_getEvenementRows($evenementArray) {
$evenementCount = count( $evenementArray);
if ($evenementCount == 0) {
return "Aucun évènement";
}
$result = "";
for($i = 0; $i < $evenementCount; $i++) {
$evenement = $evenementArray[$i];
$increment = ($evenementCount - $i);
$date = date_create($evenement["start_time"]);
$result .= "<tr>";
$result .= "<td>".$increment."</td>";
$result .= '<td><a href="http://www.agendadulibre.org/events/'.$evenement["id"].'">'.$evenement["id"]."</a></td>";
$result .= "<td>".date_format($date, 'd/m')."</td>";
$result .= "<td>".$evenement["title"]."</td>";
$result .= "<td>".$evenement["city"]."</td>";
$result .= "<td>".$evenement["time"]."</td>";
$result .= "<td>".$evenement["contact"]."</td>";
$result .= "</tr>";
}
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;
}