900 lines
31 KiB
PHP
Executable File
900 lines
31 KiB
PHP
Executable File
<?php
|
|
/**
|
|
* classe dérivée de la classe Rubrique qui décrit les rubriques servant à classer les hubs
|
|
* un hub peut être classé dans plusieurs rubriques quelques soient leurs niveaux
|
|
* une rubrique peut elle-même être classée dans une autre rubrique (arborescence)
|
|
* certaines rubriques de "référence" seront proposées aux utilisateurs de l'application pour créer des abonnements de manière simplifiée
|
|
* on a besoin de la classe FclFlux_utilisateur pour désigner l'utiliseur ayant créé la rubrique
|
|
*
|
|
* @author Fabrice PENHOËT
|
|
**/
|
|
require_once("rubrique.php");
|
|
require_once("FclFlux_utilisateur.php");
|
|
require_once("FclFlux_hub.php");
|
|
class FclFlux_rubrique extends Rubrique
|
|
{
|
|
public $id_rubrique;
|
|
protected $auteur;// l'utilisateur ayant saisi la rubrique (qui a pu être modidiée par un autre depuis)
|
|
protected $reference_ok;// booléen signalant si une rubrique est proposée pour les abonnements simplifiés.
|
|
protected $insee;//le code insee de la ville de l'utilisateur si connue
|
|
/**
|
|
* Constructeur qui initialise certains attributs en testant les valeurs fournies
|
|
* Recopier de la classe héritée car attribut supplémentaire
|
|
*
|
|
* @param infos_utilisateur tableau contenant les différentes données correspondant aux attributs homonymes.
|
|
* @return null
|
|
* @author Fabrice PENHOËT
|
|
**/
|
|
public function __construct($infos=null)
|
|
{
|
|
if((!empty($infos))&&(is_array($infos)))
|
|
{
|
|
//les limites doivent être connues avant le reste
|
|
if(!empty($infos["limites"]))
|
|
$this->limites=$infos["limites"];
|
|
unset($infos["limites"]);
|
|
$erreur_ok=false;
|
|
foreach ($infos as $attribut => $valeur)
|
|
{
|
|
$methode="set_$attribut";
|
|
if(method_exists(__CLASS__,$methode))
|
|
{
|
|
if(!$this->$methode($valeur))
|
|
$erreur_ok=true;
|
|
}
|
|
else
|
|
$this->$attribut=$valeur;
|
|
}
|
|
if(($erreur_ok)&&(empty($this->erreurs)))
|
|
$this->erreurs=(array) ERREUR_IMPREVUE;
|
|
}
|
|
}
|
|
/**
|
|
* Méthode vérifiant que le paramètre fourni est bien un utilisateur existant
|
|
* et ayant la statut d'administrateur et lui attribuant la rubrique si c'est le cas
|
|
* cet attribut ne peut être vide
|
|
*
|
|
* @param la valeur à contrôler
|
|
* @return booléen suivant succès
|
|
* @author Fabrice PENHOËT
|
|
**/
|
|
public function set_auteur($auteur)
|
|
{
|
|
if(!($auteur instanceof FclFlux_utilisateur))
|
|
{
|
|
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_FORMAT));
|
|
return false;
|
|
}
|
|
if(empty($auteur->id_utilisateur))
|
|
{
|
|
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_FORMAT));
|
|
return false;
|
|
}
|
|
$existe=FclFlux_utilisateur::recherche($auteur->id_utilisateur,"id_utilisateur","statut");
|
|
if(empty($existe))
|
|
{
|
|
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_ENREG_ABSENT));
|
|
return false;
|
|
}
|
|
if($existe["statut"]!=="administrateur")
|
|
{
|
|
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_ACTION_NON_AUTORISEE));
|
|
return false;
|
|
}
|
|
else
|
|
$this->auteur=$auteur;
|
|
return true;
|
|
}
|
|
/**
|
|
* Méthode testant le code insee associée à la rubrique
|
|
* sa valeur peut être nulle si non fournie
|
|
*
|
|
* @param la valeur à contrôler
|
|
* @return booléen suivant succès
|
|
* @author Fabrice PENHOËT
|
|
**/
|
|
public function set_insee($insee=null)
|
|
{
|
|
if(empty($insee))
|
|
$this->insee="";
|
|
else
|
|
{
|
|
global $Bd;
|
|
if((isset_connexion(__FILE__,__LINE__)===false)) return false;
|
|
$prepare=$Bd->prepare("SELECT insee FROM villes WHERE insee=:insee");
|
|
$recherche=$prepare->execute(array(":insee"=>$insee));
|
|
if((test_requete(__FILE__,__LINE__,$recherche,$prepare)===false)) return false;
|
|
$ville_info=$prepare->fetch();
|
|
$prepare=null;
|
|
if(!empty($ville_info))
|
|
$this->insee=$insee;
|
|
else
|
|
{
|
|
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_ENREG_ABSENT." >> ".htmlentities($insee,ENT_QUOTES)));
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
/**
|
|
* Méthode surchargeant celle de la classe héritée
|
|
* en vérifiant que la rubrique supérieure existe vraiment.
|
|
* et en attribuant son id si c'est le cas
|
|
* Si il s'agit d'une rubrique déjà enregistrée, je vérifie également que je ne la classe pas dans une de ses sous-rubriques...
|
|
*
|
|
* @param la valeur à contrôler
|
|
* @return booléen suivant succès
|
|
* @author Fabrice PENHOËT
|
|
**/
|
|
public function set_rubrique_sup($rubrique_sup=null)
|
|
{
|
|
if((!empty($rubrique_sup))&&(!($rubrique_sup instanceof FclFlux_rubrique)))
|
|
{
|
|
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_FORMAT));
|
|
return false;
|
|
}
|
|
if(!empty($rubrique_sup))
|
|
{
|
|
$cherche_sup=self::recherche($rubrique_sup->id_rubrique,"id_rubrique");
|
|
if($cherche_sup===false)
|
|
{
|
|
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_ENREG_ABSENT." >> ".intval($rubrique_sup->id_rubrique)));
|
|
return false;
|
|
}
|
|
if(!empty($this->id_rubrique))
|
|
{
|
|
if($rubrique_sup->id_rubrique==$this->id_rubrique)
|
|
{
|
|
$this->erreurs=array_merge($this->erreurs,(array) ERREUR_RUBRIQUE_MERE);
|
|
return false;
|
|
}
|
|
else
|
|
{
|
|
$ss_rubriques=$this->get_sous_arborescence();
|
|
if(!empty($ss_rubriques))
|
|
{
|
|
foreach($ss_rubriques as $rubrique_id)
|
|
{
|
|
if($rubrique_sup->id_rubrique==$rubrique_id["id_rubrique"])
|
|
{
|
|
$this->erreurs=array_merge($this->erreurs,(array) ERREUR_RUBRIQUE_MERE);
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
$this->rubrique_sup=$rubrique_sup;
|
|
}
|
|
else
|
|
$this->rubrique_sup=null;
|
|
return true;
|
|
}
|
|
/**
|
|
* Méthode enregistrant une nouvelle rubrique.
|
|
*
|
|
* @return booléen suivant succès
|
|
* @author Fabrice PENHOËT
|
|
**/
|
|
public function ajout()
|
|
{
|
|
global $Bd;
|
|
if((isset_connexion(__FILE__,__LINE__)===false)) return false;
|
|
if((empty($this->nom))||(empty($this->auteur)))
|
|
{
|
|
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT));
|
|
return false;
|
|
}
|
|
if(!($this->auteur instanceof FclFlux_utilisateur))
|
|
{
|
|
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_FORMAT));
|
|
return false;
|
|
}
|
|
$mere_id=null;$reference_ok=0;$insee=null;
|
|
if(!empty($this->rubrique_sup))
|
|
$mere_id=$this->rubrique_sup->id_rubrique;
|
|
if(!empty($this->reference_ok))
|
|
$reference_ok=$this->reference_ok;
|
|
if(!empty($this->insee))
|
|
$insee=$this->insee;
|
|
$prepare=$Bd->prepare("INSERT INTO hub_rubriques (nom,description,auteur_id,mere_id,reference_ok,insee,time_crea,time_maj) VALUES (:nom,:description,:auteur_id,:mere_id,:reference_ok,:insee,:date_actuelle,:date_actuelle)");
|
|
$ajout=$prepare->execute(array(':nom'=>$this->nom,':description'=>$this->description,':auteur_id'=>$this->auteur->id_utilisateur,':mere_id'=>$mere_id,':reference_ok'=>$reference_ok,':insee'=>$insee,':date_actuelle'=>time()));
|
|
if((test_requete(__FILE__,__LINE__,$ajout,$prepare)===false)) return false;
|
|
$this->id_rubrique=$Bd->lastInsertId();
|
|
$prepare=null;
|
|
$this->crea_cache();
|
|
if(!empty($mere_id))
|
|
$this->rubrique_sup->crea_cache();
|
|
else
|
|
$this->crea_cache(true);//liste des rubriques racine
|
|
if(!empty($reference_ok))
|
|
self::get_rubriques_reference(true);
|
|
return true;
|
|
}
|
|
/**
|
|
* Méthode modifiant les informations d'une rubrique de hubs
|
|
*
|
|
* @param null
|
|
* @return booléen suivant succès
|
|
* @author Fabrice PENHOËT
|
|
**/
|
|
public function actualise()
|
|
{
|
|
global $Bd;
|
|
if((isset_connexion(__FILE__,__LINE__)===false)) return false;
|
|
if((empty($this->nom))||(empty($this->id_rubrique)))
|
|
{
|
|
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT));
|
|
return false;
|
|
}
|
|
$a_rubrique=self::recherche($this->id_rubrique,"mere_id,reference_ok,insee");
|
|
if(empty($a_rubrique))
|
|
{
|
|
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_ENREG_ABSENT.">>".intval($this->id_rubrique)));
|
|
return false;
|
|
}
|
|
$mere_id=$a_rubrique["mere_id"];
|
|
$reference_ok=$a_rubrique["reference_ok"];
|
|
$insee=$a_rubrique["insee"];
|
|
if(isset($this->rubrique_sup))
|
|
$mere_id=$this->rubrique_sup->id_rubrique;
|
|
if(isset($this->reference_ok))
|
|
$reference_ok=$this->reference_ok;
|
|
if(isset($this->insee))
|
|
$insee=$this->insee;
|
|
$prepare=$Bd->prepare("UPDATE hub_rubriques SET nom=:nom,description=:description,mere_id=:mere_id,reference_ok=:reference_ok,insee=:insee,time_maj=:date_actuelle WHERE id_rubrique=:id_rubrique;");
|
|
$maj=$prepare->execute(array(':nom'=>$this->nom,':description'=>$this->description,':mere_id'=>$mere_id,':reference_ok'=>$reference_ok,':insee'=>$insee,':date_actuelle'=>time(),'id_rubrique'=>$this->id_rubrique));
|
|
if((test_requete(__FILE__,__LINE__,$maj,$prepare)===false)) return false;
|
|
$prepare=null;
|
|
$this->crea_cache();
|
|
if($mere_id!=$a_rubrique["mere_id"])
|
|
{
|
|
if(!empty($mere_id))
|
|
$this->rubrique_sup->crea_cache();
|
|
else
|
|
$this->crea_cache(true);
|
|
if(!empty($a_rubrique["mere_id"]))
|
|
{
|
|
$a_mere=new FclFlux_rubrique();
|
|
$a_mere->id_rubrique=$a_rubrique["mere_id"];
|
|
$a_mere->crea_cache();
|
|
unset($a_mere);
|
|
}
|
|
else
|
|
$this->crea_cache(true);
|
|
}
|
|
if($reference_ok!=$a_rubrique["reference_ok"])
|
|
self::get_rubriques_reference(true);
|
|
return true;
|
|
}
|
|
/**
|
|
* Méthode supprimant l'enregistrement d'une rubrique
|
|
* Le cache de la rubrique supérieure sera aussi impacté + éventuellement la liste des rubriques de référence
|
|
*
|
|
* @param si sauve_sub vaut true, je ne peux supprimer une rubrique utilisée par un hub ou une autre rubrique
|
|
* sinon je supprime la rubrique et ses sous-rubriques mais sans toucher aux hubs qui perdent juste leur classement
|
|
* @return booléen suivant succès
|
|
* @author Fabrice PENHOËT
|
|
**/
|
|
public function supprime($sauve_sub=true)
|
|
{
|
|
global $Bd;
|
|
if((isset_connexion(__FILE__,__LINE__)===false)) return false;
|
|
if(empty($this->id_rubrique))
|
|
{
|
|
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT));
|
|
return false;
|
|
}
|
|
$a_rubrique=self::recherche($this->id_rubrique,"mere_id,reference_ok");
|
|
if(empty($a_rubrique))
|
|
{
|
|
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_ENREG_ABSENT.">>".intval($this->id_rubrique)));
|
|
return false;
|
|
}
|
|
$mere_id=$a_rubrique["mere_id"];
|
|
$reference_ok=$a_rubrique["reference_ok"];
|
|
// hubs classés dans la rubrique à supprimer ???
|
|
$prepare=$Bd->prepare("SELECT id_hub FROM hub_classement_rubriques WHERE id_rubrique=:id_rubrique;");
|
|
$recherche=$prepare->execute(array(':id_rubrique'=>$this->id_rubrique));
|
|
if((test_requete(__FILE__,__LINE__,$recherche,$prepare)===false)) return false;
|
|
$resultat=$prepare->fetchAll(PDO::FETCH_ASSOC);
|
|
$prepare=null;
|
|
if((!empty($resultat))&&($sauve_sub))
|
|
{
|
|
$this->erreurs=array_merge($this->erreurs,(array) ERREUR_RUBRIQUE_SUPPR_HUB);
|
|
return false;
|
|
}
|
|
elseif(!empty($resultat))
|
|
$hub_actualise=$resultat;//servira + bas pour actualiser le cache des hubs
|
|
//les sous-rubriques de la rubrique à supprimer
|
|
$prepare=$Bd->prepare("SELECT id_rubrique FROM hub_rubriques WHERE mere_id=:id_rubrique;");
|
|
$recherche=$prepare->execute(array(':id_rubrique'=>$this->id_rubrique));
|
|
if((test_requete(__FILE__,__LINE__,$recherche,$prepare)===false)) return false;
|
|
$resultat=$prepare->fetchAll(PDO::FETCH_ASSOC);
|
|
$prepare=null;
|
|
if((!empty($resultat))&&($sauve_sub))
|
|
{
|
|
$this->erreurs=array_merge($this->erreurs,(array) ERREUR_RUBRIQUE_SUPPR_SUB);
|
|
return false;
|
|
}
|
|
elseif(!empty($resultat))
|
|
{
|
|
foreach ($resultat as $sous_rub)
|
|
{
|
|
$sousrub=new FclFlux_rubrique;
|
|
$sousrub->id_rubrique=$sous_rub["id_rubrique"];
|
|
$supp=$sousrub->supprime(false);//suppression en cascade des sous-rubriques
|
|
if($supp===false)
|
|
return false;
|
|
unset($sousrub);
|
|
}
|
|
}
|
|
$prepare=$Bd->prepare("DELETE FROM hub_rubriques WHERE id_rubrique=:id_rubrique LIMIT 1;");
|
|
$suppr=$prepare->execute(array(':id_rubrique'=>$this->id_rubrique));
|
|
if((test_requete(__FILE__,__LINE__,$suppr,$prepare)===false)) return false;
|
|
$nb_enreg=$prepare->rowCount();
|
|
$prepare=null;
|
|
if($nb_enreg==0)
|
|
{
|
|
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_SUPPR." >> ".intval($this->id_rubrique)));
|
|
return false;
|
|
}
|
|
$this->suppr_cache();
|
|
//des hubs ont peut-être perdu leur classement
|
|
if(isset($hub_actualise))
|
|
{
|
|
foreach ($hub_actualise as $hub_id)
|
|
{
|
|
$hub_maj=new FclFlux_hub;
|
|
$hub_maj->id_hub=$hub_id["id_hub"];
|
|
$hub_maj->crea_cache();
|
|
unset($hub_maj);
|
|
}
|
|
}
|
|
if(!empty($mere_id))
|
|
{
|
|
$rub_mere=new FclFlux_rubrique();
|
|
$rub_mere->id_rubrique=$mere_id;
|
|
$rub_mere->crea_cache();
|
|
unset($rub_mere);
|
|
}
|
|
else
|
|
$this->crea_cache(true);
|
|
if($reference_ok)
|
|
self::get_rubriques_reference(true);
|
|
return true;
|
|
}
|
|
/**
|
|
* Méthode de suppression du fichier cache contenant les infos d'une rubrique
|
|
* id_rubrique doit être connu
|
|
*
|
|
* @return booléen suivant succès
|
|
* @author Fabrice PENHOËT
|
|
**/
|
|
public function suppr_cache()
|
|
{
|
|
if(empty($this->id_rubrique))
|
|
{
|
|
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT));
|
|
return false;
|
|
}
|
|
$id=strval($this->id_rubrique);
|
|
$chemin=CACHE_REP."/".CACHE_REP_RUBRIQUES."/".$id[0]."/$id.txt";
|
|
if((file_exists($chemin))&&(!unlink($chemin)))
|
|
{
|
|
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_FICHIER_SUPPR." >> ".htmlentities($chemin,ENT_QUOTES)));
|
|
return false;
|
|
}
|
|
$chemin=CACHE_REP."/".CACHE_REP_RUBRIQUES."/".$id[0]."/hubs-$id.txt";
|
|
if((file_exists($chemin))&&(!unlink($chemin)))
|
|
{
|
|
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_FICHIER_SUPPR." >> ".htmlentities($chemin,ENT_QUOTES)));
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
/**
|
|
* Méthode testant l'existence d'une rubrique dans le bd via son id_rubrique (seul champ identifiant)
|
|
*
|
|
* @param la valeur recherchée + les champs souhaités en sortie
|
|
* @return les données de la table dans un tableau php si trouvé. false si pas trouvé ou en cas d'erreur.
|
|
* @author Fabrice PENHOËT
|
|
**/
|
|
static function recherche($id_rubrique,$champ_sortie="*")
|
|
{
|
|
global $Bd;
|
|
if((isset_connexion(__FILE__,__LINE__)===false)) return false;
|
|
$prepare=$Bd->prepare("SELECT $champ_sortie FROM hub_rubriques WHERE id_rubrique=:valeur");
|
|
$recherche=$prepare->execute(array(":valeur"=>$id_rubrique));
|
|
if((test_requete(__FILE__,__LINE__,$recherche,$prepare)===false)) return false;
|
|
$resultat=$prepare->fetch(PDO::FETCH_ASSOC);
|
|
$prepare=null;
|
|
if(empty($resultat))
|
|
return false;
|
|
else
|
|
return $resultat;
|
|
}
|
|
/**
|
|
* Méthode de recherche parmi toutes les rubriques pour un mots-clés donné
|
|
*
|
|
* @param les champs souhaités en sortie
|
|
* @return les données de la table dans un tableau php si trouvé. false si pas trouvé ou en cas d'erreur.
|
|
* @author Fabrice PENHOËT
|
|
**/
|
|
static function recherche_globale($recherche,$champ_sortie="*")
|
|
{
|
|
global $Bd;
|
|
if((isset_connexion(__FILE__,__LINE__)===false)) return false;
|
|
$recherche_str=strip_tags(strval(trim($recherche)));
|
|
$recherche_str="%".str_replace(" ","%",$recherche)."%";
|
|
$prepare=$Bd->prepare("SELECT $champ_sortie FROM hub_rubriques WHERE (nom LIKE :recherche_str OR description LIKE :recherche_str OR id_rubrique=:recherche) ORDER BY nom ASC;");
|
|
$recherche=$prepare->execute(array(":recherche_str"=>$recherche_str,":recherche"=>$recherche));
|
|
if((test_requete(__FILE__,__LINE__,$recherche,$prepare)===false)) return false;
|
|
$resultat=$prepare->fetchAll(PDO::FETCH_ASSOC);
|
|
$prepare=null;
|
|
if(empty($resultat))
|
|
return false;
|
|
else
|
|
return $resultat;
|
|
}
|
|
/**
|
|
* Méthode listant les sous-rubriques éventuelles de la rubrique en cours
|
|
*
|
|
* @param $racine vaut true si on liste des rubriques racine
|
|
* @return liste des id des sous-rubriques dans un tableau si trouvé (peut être vide), false en cas d'erreur
|
|
* @author Fabrice PENHOËT
|
|
**/
|
|
public function get_sous_rubriques($racine=false)
|
|
{
|
|
global $Bd;
|
|
if((isset_connexion(__FILE__,__LINE__)===false)) return false;
|
|
if((!$racine)&&(empty($this->id_rubrique)))
|
|
{
|
|
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT));
|
|
return false;
|
|
}
|
|
if(!$racine)
|
|
{
|
|
$prepare=$Bd->prepare("SELECT id_rubrique FROM hub_rubriques WHERE mere_id=:valeur ORDER BY nom");
|
|
$recherche=$prepare->execute(array(":valeur"=>$this->id_rubrique));
|
|
}
|
|
else
|
|
{
|
|
$prepare=$Bd->prepare("SELECT id_rubrique FROM hub_rubriques WHERE mere_id IS NULL ORDER BY nom");
|
|
$recherche=$prepare->execute();
|
|
}
|
|
if((test_requete(__FILE__,__LINE__,$recherche,$prepare)===false)) return false;
|
|
$resultat=$prepare->fetchAll(PDO::FETCH_ASSOC);
|
|
$prepare=null;
|
|
return $resultat;
|
|
}
|
|
/**
|
|
* Méthode listant toutes les sous-rubriques de la rubrique en cours en descendant l'arborescence
|
|
*
|
|
* @param $racine vaut true si on liste des rubriques racine
|
|
* @return liste des id des sous-rubriques dans un tableau si trouvé (peut être vide), false en cas d'erreur
|
|
* @author Fabrice PENHOËT
|
|
**/
|
|
public function get_sous_arborescence($racine=false)
|
|
{
|
|
global $Bd;
|
|
if((isset_connexion(__FILE__,__LINE__)===false)) return false;
|
|
if((!$racine)&&(empty($this->id_rubrique)))
|
|
{
|
|
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT));
|
|
return false;
|
|
}
|
|
$filles=$this->get_sous_rubriques($racine);
|
|
$ss_arborescence=$filles;
|
|
if(!empty($filles))
|
|
{
|
|
foreach($filles as $fille)
|
|
{
|
|
$ss_rubrique=new FclFlux_rubrique();
|
|
$ss_rubrique->id_rubrique=$fille["id_rubrique"];
|
|
$ss_filles=$ss_rubrique->get_sous_arborescence();
|
|
if(!empty($ss_filles))
|
|
$ss_arborescence=array_merge($ss_arborescence,$ss_filles);
|
|
unset($ss_rubrique);
|
|
}
|
|
}
|
|
return $ss_arborescence;
|
|
}
|
|
/**
|
|
* Méthode cherchant le nombre d'abonnés actifs (directs ou indirects) des hubs d'une rubrique
|
|
*
|
|
* @return les données dans un tableau php, false en cas d'erreur
|
|
* @author Fabrice PENHOËT
|
|
**/
|
|
public function get_stats()
|
|
{
|
|
global $Bd;
|
|
if((isset_connexion(__FILE__,__LINE__)===false)) return false;
|
|
if(empty($this->id_rubrique))
|
|
{
|
|
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT));
|
|
return false;
|
|
}
|
|
$stats=array();
|
|
//nbre d'abonnés à des hubs classés directement dans cette rubrique
|
|
$get_actifs=$Bd->query("SELECT DISTINCT auteur_id FROM abonnements as A,abonnements_hub as H,hub_classement_rubriques as R WHERE ((R.id_hub=H.id_hub) AND (H.id_abonnement=A.id_abonnement) AND (R.id_rubrique=".$this->id_rubrique.") AND (A.jours_alerte!='') AND (A.actif_ok=1));");
|
|
if((test_requete(__FILE__,__LINE__,$get_actifs)===false)) return false;
|
|
$resultats=$get_actifs->fetchAll();
|
|
$stats["nb_abo_actifs_directs"]=count($resultats);
|
|
$get_inactifs=$Bd->query("SELECT DISTINCT auteur_id FROM abonnements as A,abonnements_hub as H,hub_classement_rubriques as R WHERE ((R.id_hub=H.id_hub) AND (H.id_abonnement=A.id_abonnement) AND (R.id_rubrique=".$this->id_rubrique.") AND (A.jours_alerte=''));");
|
|
if((test_requete(__FILE__,__LINE__,$get_inactifs)===false)) return false;
|
|
$resultats=$get_inactifs->fetchAll();
|
|
$stats["nb_abo_inactifs_directs"]=count($resultats);
|
|
$get_en_pause=$Bd->query("SELECT DISTINCT auteur_id FROM abonnements as A,abonnements_hub as H,hub_classement_rubriques as R WHERE ((R.id_hub=H.id_hub) AND (H.id_abonnement=A.id_abonnement) AND (R.id_rubrique=".$this->id_rubrique.") AND (A.jours_alerte!='') AND (A.actif_ok=0));");
|
|
if((test_requete(__FILE__,__LINE__,$get_en_pause)===false)) return false;
|
|
$resultats=$get_en_pause->fetchAll();
|
|
$stats["nb_abo_en_pause_directs"]=count($resultats);
|
|
//nbre d'abonnés acfifs à des hubs classés de cette rubrique ou de ses filles
|
|
$filles=$this->get_sous_arborescence();
|
|
if(empty($filles))
|
|
{
|
|
$stats["nb_abo_actifs_indirects"]=$stats["nb_abo_actifs_directs"];
|
|
$stats["nb_abo_inactifs_indirects"]=$stats["nb_abo_inactifs_directs"];
|
|
$stats["nb_abo_pause_indirects"]=$stats["nb_abo_en_pause_directs"];
|
|
}
|
|
$id_rubriques[]=$this->id_rubrique;
|
|
foreach($filles as $rubrique_info)
|
|
$id_rubriques[]=$rubrique_info["id_rubrique"];
|
|
$sql_in=implode(",",$id_rubriques);
|
|
$get_actifs=$Bd->query("SELECT DISTINCT auteur_id FROM abonnements as A,abonnements_hub as H,hub_classement_rubriques as R WHERE ((R.id_hub=H.id_hub) AND (H.id_abonnement=A.id_abonnement) AND (R.id_rubrique IN ($sql_in)) AND (A.jours_alerte!='') AND (A.actif_ok=1));");
|
|
if((test_requete(__FILE__,__LINE__,$get_actifs)===false)) return false;
|
|
$resultats=$get_actifs->fetchAll();
|
|
$stats["nb_abo_actifs_indirects"]=count($resultats);
|
|
$get_inactifs=$Bd->query("SELECT DISTINCT auteur_id FROM abonnements as A,abonnements_hub as H,hub_classement_rubriques as R WHERE ((R.id_hub=H.id_hub) AND (H.id_abonnement=A.id_abonnement) AND (R.id_rubrique IN ($sql_in)) AND (A.jours_alerte=''));");
|
|
if((test_requete(__FILE__,__LINE__,$get_inactifs)===false)) return false;
|
|
$resultats=$get_inactifs->fetchAll();
|
|
$stats["nb_abo_inactifs_indirects"]=count($resultats);
|
|
$get_en_pause=$Bd->query("SELECT DISTINCT auteur_id FROM abonnements as A,abonnements_hub as H,hub_classement_rubriques as R WHERE ((R.id_hub=H.id_hub) AND (H.id_abonnement=A.id_abonnement) AND (R.id_rubrique IN ($sql_in)) AND (A.jours_alerte!='') AND (A.actif_ok=0));");
|
|
if((test_requete(__FILE__,__LINE__,$get_en_pause)===false)) return false;
|
|
$resultats=$get_en_pause->fetchAll();
|
|
$stats["nb_abo_en_pause_indirects"]=count($resultats);
|
|
unset($get_actifs);unset($get_inactifs);unset($get_en_pause);unset($resultats);
|
|
return $stats;
|
|
}
|
|
/**
|
|
* Méthode créant le fichier cache contenant les infos utiles d'une rubrique
|
|
* id_rubrique doit être connu
|
|
*
|
|
* @param si $racine vaut true, on créé juste le cache de la liste des rubriques racine
|
|
* @return booléen suivant succès
|
|
* @author Fabrice PENHOËT
|
|
**/
|
|
public function crea_cache($racine=false)
|
|
{
|
|
if((!$racine)&&(empty($this->id_rubrique)))
|
|
{
|
|
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT));
|
|
return false;
|
|
}
|
|
if(!$racine)
|
|
{
|
|
$infos=self::recherche($this->id_rubrique,"nom,description,mere_id,reference_ok,insee");
|
|
if($infos===false)
|
|
{
|
|
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_ENREG_ABSENT." >> ".intval($this->id_rubrique)));
|
|
return false;
|
|
}
|
|
$sousrub=$this->get_sous_rubriques();
|
|
if(!empty($sousrub))
|
|
$infos=array_merge($infos,$sousrub);
|
|
$id=strval($this->id_rubrique);
|
|
}
|
|
else
|
|
{
|
|
$infos=$this->get_sous_rubriques(true);
|
|
if($infos===false)
|
|
return false;
|
|
$id="0";
|
|
}
|
|
return crea_cache(CACHE_REP_RUBRIQUES."/".$id[0]."/$id.txt",$infos);
|
|
}
|
|
/**
|
|
* Méthode listant les rubriques de référence, utiles aux abonnements rapides
|
|
* il doit y avoir au moins un hub de référence classé dans la rubrique
|
|
*
|
|
* @param $crea_cache : un booléen pour savoir si il faut enregistrer le résultat dans un fichier
|
|
* @return liste des id des rubriques concernées dans un tableau si trouvé (peut être vide), false en cas d'erreur
|
|
* @author Fabrice PENHOËT
|
|
**/
|
|
static function get_rubriques_reference($crea_cache=false)
|
|
{
|
|
global $Bd;
|
|
if((isset_connexion(__FILE__,__LINE__)===false)) return false;
|
|
$prepare=$Bd->prepare("SELECT id_rubrique FROM hub_rubriques WHERE ((reference_ok=1) AND (id_rubrique IN (SELECT DISTINCT id_rubrique FROM hub_classement_rubriques WHERE reference_ok='1'))) ORDER BY nom");
|
|
$recherche=$prepare->execute();
|
|
if((test_requete(__FILE__,__LINE__,$recherche,$prepare)===false)) return false;
|
|
$resultat=$prepare->fetchAll(PDO::FETCH_ASSOC);
|
|
$prepare=null;
|
|
if($crea_cache)
|
|
return crea_cache(CACHE_REP_RUBRIQUES."/ref.txt",$resultat);
|
|
else
|
|
return $resultat;
|
|
}
|
|
/**
|
|
* Méthode listant les hubs classés dans une rubrique
|
|
* en préçisant ceux de référence qui sont en début de liste
|
|
*
|
|
* @param crea_cache : un booléen pour savoir si il faut enregistrer le résultat dans un fichier, $reference_ok=true si je ne veux que les hubs de réference
|
|
* @return liste des des hubs dans un tableau si trouvé (peut être vide), false en cas d'erreur
|
|
* @author Fabrice PENHOËT
|
|
**/
|
|
public function get_liste_hubs($crea_cache=false,$reference_ok=false)
|
|
{
|
|
global $Bd;
|
|
if((isset_connexion(__FILE__,__LINE__)===false)) return false;
|
|
if(empty($this->id_rubrique))
|
|
{
|
|
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT));
|
|
return false;
|
|
}
|
|
if(!$reference_ok)
|
|
$prepare=$Bd->prepare("SELECT id_hub,reference_ok FROM hub_classement_rubriques WHERE id_rubrique=:valeur ORDER BY reference_ok DESC");
|
|
else
|
|
$prepare=$Bd->prepare("SELECT id_hub FROM hub_classement_rubriques WHERE id_rubrique=:valeur AND reference_ok=1");
|
|
$recherche=$prepare->execute(array(":valeur"=>$this->id_rubrique));
|
|
if((test_requete(__FILE__,__LINE__,$recherche,$prepare)===false)) return false;
|
|
$resultat=$prepare->fetchAll(PDO::FETCH_ASSOC);
|
|
$prepare=null;
|
|
$id=strval($this->id_rubrique);
|
|
if($crea_cache)
|
|
return crea_cache(CACHE_REP_RUBRIQUES."/".$id[0]."/hubs-$id.txt",$resultat);
|
|
else
|
|
return $resultat;
|
|
}
|
|
/**
|
|
* Méthode ouvrant le fichier cache contenant les infos d'une rubrique
|
|
*
|
|
* @param crea_cache : un booléen pour savoir si il faut tester la création du fichier en cas d'absence
|
|
* @return tableau contenant les infos de la rubrique fournies par le fichier (si trouvé), false en cas d'erreur
|
|
* @author Fabrice PENHOËT
|
|
**/
|
|
public function get_infos_cache($crea_cache=false)
|
|
{
|
|
global $Bd;
|
|
if(empty($this->id_rubrique))
|
|
{
|
|
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT));
|
|
return false;
|
|
}
|
|
$id=strval($this->id_rubrique);
|
|
$fichier=CACHE_REP."/".CACHE_REP_RUBRIQUES."/".$id[0]."/$id.txt";
|
|
$infos=array();
|
|
if(!file_exists($fichier))
|
|
{
|
|
if($crea_cache)
|
|
{
|
|
if(empty($GLOBALS['Bd']))
|
|
require("connexion-bd.php");
|
|
if(empty($GLOBALS['Bd'])) return false;
|
|
if(!$this->crea_cache())
|
|
return false;
|
|
}
|
|
else
|
|
return false;
|
|
}
|
|
include($fichier);
|
|
if(empty($t))
|
|
return false;
|
|
else
|
|
{
|
|
foreach($t as $key => $value)
|
|
{
|
|
if(!is_array($value)) //cela doit être l'id d'une des rubriques filles...
|
|
$infos[$key]=stripslashes($value);
|
|
}
|
|
}
|
|
if(empty($infos))
|
|
return false;
|
|
else
|
|
return $infos;
|
|
}
|
|
/**
|
|
* Méthode ouvrant le fichier cache contenant une liste de rubriques
|
|
* il faut donner id_rubrique=0 pour avoir la liste des rubriques racine
|
|
*
|
|
* @param crea_cache : un booléen pour savoir si il faut tester la création du fichier en cas d'absence,
|
|
* $reference_ok si on souhaite la liste des rubriques de référence.
|
|
* @return tableau contenant les infos des rubriques fournies par le fichier (si trouvé), false en cas d'erreur
|
|
* @author Fabrice PENHOËT
|
|
**/
|
|
public function get_liste_cache($crea_cache=false,$reference_ok=false)
|
|
{
|
|
global $Bd;
|
|
if((!isset($this->id_rubrique))&&(!$reference_ok))
|
|
{
|
|
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT));
|
|
return false;
|
|
}
|
|
if(!$reference_ok)
|
|
{
|
|
$id=strval($this->id_rubrique);
|
|
$fichier=CACHE_REP."/".CACHE_REP_RUBRIQUES."/".$id[0]."/$id.txt";
|
|
}
|
|
else
|
|
{
|
|
$id="";
|
|
$fichier=CACHE_REP."/".CACHE_REP_RUBRIQUES."/ref.txt";
|
|
}
|
|
$liste_rubriques=array();
|
|
if(!file_exists($fichier))
|
|
{
|
|
if($crea_cache)
|
|
{
|
|
if(empty($GLOBALS['Bd']))
|
|
require("connexion-bd.php");
|
|
if(empty($GLOBALS['Bd'])) return false;
|
|
}
|
|
if(($crea_cache)&&(!empty($id)))
|
|
{
|
|
if(!$this->crea_cache())
|
|
return false;
|
|
}
|
|
elseif(($crea_cache)&&($reference_ok))
|
|
{
|
|
if(!$this->get_rubriques_reference(true))
|
|
return false;
|
|
}
|
|
elseif(($crea_cache)&&($id==0))
|
|
{
|
|
if(!$this->crea_cache(true))
|
|
return false;
|
|
}
|
|
else
|
|
return false;
|
|
}
|
|
include($fichier);
|
|
if(empty($t))
|
|
return false;
|
|
else
|
|
{
|
|
$i=0;
|
|
foreach($t as $key => $value)
|
|
{
|
|
if((is_array($value))&&(!empty($value["id_rubrique"]))) //cela doit être l'id d'une des rubriques filles...
|
|
{
|
|
$fille=new FclFlux_rubrique();
|
|
$fille->id_rubrique=$value["id_rubrique"];
|
|
$fille_infos=$fille->get_infos_cache($crea_cache);
|
|
if(!empty($fille_infos))
|
|
{
|
|
$fille_infos["id_rubrique"]=$value["id_rubrique"];
|
|
$liste_rubriques[$i]=$fille_infos;
|
|
$i++;
|
|
}
|
|
unset($fille);
|
|
}
|
|
}
|
|
}
|
|
if(empty($liste_rubriques))
|
|
return false;
|
|
else
|
|
return $liste_rubriques;
|
|
}
|
|
/**
|
|
* Méthode ouvrant le fichier cache contenant la liste des hubs classés dans une rubrique
|
|
*
|
|
* @param crea_cache : un booléen pour savoir si il faut tester la création du fichier en cas d'absence,
|
|
* @return tableau contenant les infos des flux fournies par le fichier (si trouvé), false en cas d'erreur
|
|
* @author Fabrice PENHOËT
|
|
**/
|
|
public function get_liste_hubs_cache($crea_cache=false)
|
|
{
|
|
global $Bd;
|
|
if(empty($this->id_rubrique))
|
|
{
|
|
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT));
|
|
return false;
|
|
}
|
|
$id=strval($this->id_rubrique);
|
|
$fichier=CACHE_REP."/".CACHE_REP_RUBRIQUES."/".$id[0]."/hubs-$id.txt";
|
|
$liste=array();
|
|
if(!file_exists($fichier))
|
|
{
|
|
if($crea_cache)
|
|
{
|
|
if(empty($GLOBALS['Bd']))
|
|
require("connexion-bd.php");
|
|
if(empty($GLOBALS['Bd'])) return false;
|
|
if(!$this->get_liste_hubs(true))
|
|
return false;
|
|
}
|
|
else
|
|
return false;
|
|
}
|
|
include($fichier);
|
|
if(empty($t))
|
|
return false;
|
|
else
|
|
{
|
|
$i=0;
|
|
foreach($t as $key => $value)
|
|
{
|
|
if((is_array($value))&&(!empty($value["id_hub"]))&&(isset($value["reference_ok"])))
|
|
{
|
|
$hub=new FclFlux_hub();
|
|
$hub->id_hub=$value["id_hub"];
|
|
$hub_infos=$hub->get_infos_cache($crea_cache);
|
|
if(!empty($hub_infos))
|
|
{
|
|
$hub_infos["id_hub"]=$value["id_hub"];
|
|
$hub_infos["reference_ok"]=$value["reference_ok"];
|
|
$liste[$i]=$hub_infos;
|
|
$i++;
|
|
}
|
|
unset($hub);
|
|
}
|
|
}
|
|
}
|
|
if(empty($liste))
|
|
return false;
|
|
else
|
|
return $liste;
|
|
}
|
|
/**
|
|
* Méthode ouvrant le fichier cache d'une rubrique pour en sortir les rubriques supérieures
|
|
*
|
|
* @param crea_cache : un booléen pour savoir si il faut tester la création du fichier en cas d'absence,
|
|
* @return tableau contenant les infos des rubriques supérieures fournies par le fichier (si trouvé), false en cas d'erreur
|
|
* @author Fabrice PENHOËT
|
|
**/
|
|
public function get_meres_cache($crea_cache=false)
|
|
{
|
|
global $Bd;
|
|
if(empty($this->id_rubrique))
|
|
{
|
|
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT));
|
|
return false;
|
|
}
|
|
$id=strval($this->id_rubrique);
|
|
$fichier=CACHE_REP."/".CACHE_REP_RUBRIQUES."/".$id[0]."/$id.txt";
|
|
$infos=array();
|
|
if(!file_exists($fichier))
|
|
{
|
|
if($crea_cache)
|
|
{
|
|
if(empty($GLOBALS['Bd']))
|
|
require("connexion-bd.php");
|
|
if(empty($GLOBALS['Bd'])) return false;
|
|
if(!$this->crea_cache())
|
|
return false;
|
|
}
|
|
else
|
|
return false;
|
|
}
|
|
include($fichier);
|
|
if(empty($t))
|
|
return false;
|
|
else
|
|
{
|
|
$meres=array();
|
|
$i=0;
|
|
$mere_id=$t["mere_id"];
|
|
while(!empty($mere_id))
|
|
{
|
|
$mere=new FclFlux_rubrique();
|
|
$mere->id_rubrique=$mere_id;
|
|
$mere_info=$mere->get_infos_cache($crea_cache);
|
|
if(!empty($mere_info))
|
|
{
|
|
$mere_info["id_rubrique"]=$mere_id;
|
|
$meres[$i]=$mere_info;
|
|
$mere_id=$mere_info["mere_id"];
|
|
unset($mere_info);
|
|
$i++;
|
|
}
|
|
else
|
|
$mere_id=0;
|
|
}
|
|
}
|
|
if(empty($meres))
|
|
return false;
|
|
else
|
|
return array_reverse($meres);
|
|
}
|
|
|
|
}//fin de la classe
|