hellofacteurV1/modele/FclFlux_rubrique.php

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