hellofacteurV1/modele/FclFlux_hub.php

1483 lines
51 KiB
PHP
Executable File

<?php
/**
* Enregistrement, modification, administration et suppression des hubs.
* Besoin de FclFlux_utilisateur pour désigner le créateur de chaque hub et ses administrateurs.
* + de la classe FclFlux_rubrique pour le classement
*
* @author Fabrice PENHOËT
**/
require_once("FclFlux_utilisateur.php");
require_once("FclFlux_rubrique.php");
require_once("FclFlux_flux.php");
class FclFlux_hub
{
public $id_hub;
private $nom;
private $auteur;// objet de type FclFlux_utilisateur ou null (si utilisateur supprimé) désignant son auteur.
private $publication_ok;// booléen : les abonnés sont-ils autorisés à publier dans ce hub ?
private $description;
private $illustration;// nom du fichier image servant à illustrer la page de présentation du hub.
private $langue;// langue principale du hub.
private $mots_cles;// mots-clés associés aux hub. Utiles pour recherches.
private $memo;// mémo interne, non destiné à être publié.
private $time_crea;// timestamp d'enregistrement du hub.
private $time_maj;// timestamp de la dernière mise à jour des infos du hub.
private $time_validation;// timestamp de la validation du hub pour un adminstrateur du site.
private $administrateurs;// tableau d'objets de type FclFlux_utilisateur désignant les administrateurs du hub.
public $limites=array(); // tailles limites des attributs
public $erreurs=array(); // erreurs rencontrées dans les méthodes.
/**
* Constructeur qui initialise certains attributs en testant les valeurs fournies
*
* @param infos tableau contenant les différentes données correspondant aux attributs (supposés 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 testant la validité du nom fourni pour le hub
* et l'attribuant à l'objet si ok
*
* @param le nom à contrôler
* @return booléen suivant succès
* @author Fabrice PENHOËT
**/
public function set_nom($nom)
{
$long_min=(!empty($this->limites["nom_long_min"]))?$this->limites["nom_long_min"]:0;
if(empty($this->limites["nom_long_max"]))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT));
return false;
}
$long_max=$this->limites["nom_long_max"];
if((($long_min!=0)&&(!is_int($long_min)))||(!is_int($long_max))||($long_max<$long_min))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_FORMAT));
return false;
}
$nom=strip_tags(strval(trim($nom)));
$longueur=strlen($nom);
if(($longueur<$long_min)||($longueur>$long_max))
{
$this->erreurs=array_merge($this->erreurs,(array) (str_replace(array("__MIN__","__MAX__"),array($long_min,$long_max),ERREUR_HUB_NOM_LONG)));
return false;
}
else
{
$this->nom=$nom;
return true;
}
}
/**
* Méthode vérifiant que le paramètre fourni est bien un utilisateur existant
* et lui attribuant l'origine du hub 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","id_utilisateur");
if(empty($existe))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_ENREG_ABSENT." >> ".intval($auteur->id_utilisateur)));
return false;
}
$this->auteur=$auteur;
return true;
}
/* Méthode testant la validité de la description du hub
* et l'attribuant à l'objet si ok
*
* @param la description à contôler
* @return booléen suivant succès
* @author Fabrice PENHOËT
**/
public function set_description($description)
{
if(empty($this->limites["description_long_max"]))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT));
return false;
}
$long_max=$this->limites["description_long_max"];
if(!is_int($long_max))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_FORMAT));
return false;
}
$description=strip_tags(strval(trim($description)));
if(empty($description))
$this->description=null;
else
$this->description=get_chaine_debut($description,$long_max," (...)");
return true;
}
/**
* Méthode testant la validité d'un fichier image (nom, format, taille...) illustrant le hub.
* Si ok, une miniature est créée localement et son adresse affectée à l'objet
* ! le nom du hub doit être attribué à l'objet avant car il sert à nommer le fichier image
*
* @param $fichier : les infos du fichier qui vient d'être téléchargé
* @return booléen suivant succès
* @author Fabrice PENHOËT
**/
public function set_illustration($fichier)
{
if(!empty($fichier))
{
$adresse_temp=$fichier["tmp_name"];
if(!file_exists($adresse_temp))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_FICHIER_EXISTE." >> ".htmlentities($adresse_temp,ENT_QUOTES)));
return false;
}
if(empty($this->nom))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT));
return false;
}
$extension=strtolower(strrchr($fichier["name"],"."));
if (strpos(HUB_ILLUS_EXTENSIONS,$extension)===false)
$messages[]=ERREUR_IMAGE_FORMAT;
$taille_max=min(intval(str_replace("M","000000",ini_get("upload_max_filesize"))),HUB_ILLUS_MAX_TAILLE);
$taille_fichier=filesize($adresse_temp);
if($taille_fichier>$taille_max)
$messages[]=ERREUR_FICHIER_POIDS." (maximum : ".($taille_max/1000)." ko)";
if(empty($messages))
{
$nom=nettoye_chaine(strtolower($this->nom));
$adresse_illustration=HUB_ILLUS_REP."/".$nom[0]."/".$nom.$extension;
$i=1;
while(file_exists($adresse_illustration))
{
$i++;
$adresse_illustration=HUB_ILLUS_REP."/".$nom[0]."/".$nom.$i.$extension;
}
if(!file_exists(HUB_ILLUS_REP."/".$nom[0]."/"))
{
if(!mkdir(HUB_ILLUS_REP."/".$nom[0]."/",HUB_ILLUS_REP_CHMOD,true))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_REP_CREA." >> ".HUB_ILLUS_REP."/".$nom[0]."/"));
return false;
}
}
if(import_image($adresse_temp,$adresse_illustration,0,HUB_ILLUS_MAX_LARGEUR))
{
$this->illustration=substr(strrchr($adresse_illustration,"/"),1);
return true;
}
else
return false;
}
else
{
$this->erreurs=array_merge($this->erreurs,$messages);
return false;
}
}
else
$this->illustration="";
}
/**
* Méthode vérifiant que le paramètre fourni fait partie des valeurs possibles
* et lui attribuant la langue principale du hub 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_langue($langue)
{
$valeurs_ok=explode("|",HUB_LANGUES);
if(empty($valeurs_ok))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT));
return false;
}
if (!in_array($langue,$valeurs_ok))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_AUTORISES." >> ".htmlentities($langue,ENT_QUOTES)));
return false;
}
$this->langue=$langue;
return true;
}
/**
* Méthode testant la validité du mémo saisi pour un hub
* et l'attribuant à l'objet si ok
*
* @param le texte à contôler
* @return booléen suivant succès
* @author Fabrice PENHOËT
**/
public function set_memo($memo)
{
$long_min=(!empty($this->limites["memo_long_min"]))?$this->limites["memo_long_min"]:0;
if(empty($this->limites["memo_long_max"]))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT));
return false;
}
$long_max=$this->limites["memo_long_max"];
if((($long_min!=0)&&(!is_int($long_min)))||(!is_int($long_max))||($long_max<$long_min))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_FORMAT));
return false;
}
$memo=strip_tags(strval(trim($memo)));
$longueur=strlen($memo);
if(($longueur<$long_min)||($longueur>$long_max))
{
$this->erreurs=array_merge($this->erreurs,(array) (str_replace("__MAX__",$long_max,ERREUR_HUB_MEMO_LONG)));
return false;
}
else
{
$this->memo=$memo;
return true;
}
}
/**
* Méthode supprimant le fichier image illustrant un hub
*
* @param null
* @return booléen suivant succès
* @author Fabrice PENHOËT
**/
public function suppr_illustration()
{
if(!empty($this->illustration))
{
$fichier=$this->illustration;
$adresse_illustration=HUB_ILLUS_REP."/".$fichier[0]."/".$fichier;
if(!file_exists($adresse_illustration))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_FICHIER_EXISTE." >> ".htmlentities($adresse_illustration,ENT_QUOTES)));
return false;
}
if(!unlink($adresse_illustration))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_FICHIER_SUPPR." >> ".htmlentities($adresse_illustration,ENT_QUOTES)));
return false;
}
$this->illustration="";
return true;
}
}
/**
* Méthode testant l'existence d'un hub dans le bd via son id_hub ou son nom (seuls champs identifiant)
*
* @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($valeur,$champ_recherche="id_hub",$champ_sortie="*")
{
global $Bd;
if((isset_connexion(__FILE__,__LINE__)===false)) return false;
if(strpos("id_hub,nom",$champ_recherche)===false)
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_CHAMP_RECHERCHE." >> ".htmlentities($champ_recherche,ENT_QUOTES)));
return false;
}
$prepare=$Bd->prepare("SELECT $champ_sortie FROM hub WHERE $champ_recherche=:valeur");
$recherche=$prepare->execute(array(":valeur"=>$valeur));
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 recherche les hubs dans le bd pour un (ou +sieurs) mots-clés.
*
* @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=strip_tags(strval(trim($recherche)));
$recherche_like="%".str_replace(" ","%",$recherche)."%";//qd espaces, cherchez plusieurs mots plutôt qu'une seule expression ???
$prepare=$Bd->prepare("SELECT $champ_sortie FROM hub WHERE id_hub=:cherche_id OR nom LIKE :recherche OR description LIKE :recherche OR mots_cles LIKE :recherche ORDER BY nom ASC;");
$recherche=$prepare->execute(array(":cherche_id"=>$recherche,":recherche"=>$recherche_like));
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;
}
/**
* Test si une valeur donnée pour un champ est déjà utilisée pour un autre hub
*
* @return true si valeur non trouvée
* @author Fabrice PENHOËT
**/
public function est_libre($champ="nom")
{
global $Bd;
if((isset_connexion(__FILE__,__LINE__)===false)) return false;
if(empty($this->id_hub))//nouveau hub non encore enregistré
{
$prepare=$Bd->prepare("SELECT id_hub FROM hub WHERE $champ=:$champ");
$recherche=$prepare->execute(array(":$champ"=>$this->$champ));
}
else
{
$prepare=$Bd->prepare("SELECT id_hub FROM hub WHERE ($champ=:$champ and id_hub!=:id)");
$recherche=$prepare->execute(array(":$champ"=>$this->$champ,":id"=>$this->id_hub));
}
if((test_requete(__FILE__,__LINE__,$recherche,$prepare)===false)) return false;
$resultat=$prepare->fetch();
$prepare=null;
if(empty($resultat))//pas de doublon
return true;
else
return false;
}
/**
* Méthode enregistrant un nouveau hub
*
* @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;
}
//le nom du hub doit être unique
$nom_depart=$this->nom;
$i=2;$trouve=false;
while((strlen($this->nom)<=HUB_MAX_NOM)&&(!$trouve))
{
if(!($this->est_libre()))
{//pour ne pas bloquer, on cherche un nom libre en incrémentant
$this->nom=$nom_depart.$i;
$i++;
}
else
$trouve=true;
}
if(empty($this->langue))
$this->langue="fr";
if(empty($this->publication_ok))
$this->publication_ok=0;
if(empty($this->index_ok))
$this->index_ok=0;
$this->time_crea=time();
$this->time_maj=$this->time_crea;
//le hub est-il à valider par un administrateur ?
$est_admin=$this->auteur->est_admin();
if($est_admin)
$this->time_validation=$this->time_crea;
else
$this->time_validation=0;//reste à valider
if(empty($this->description))
$this->description=null;
if(empty($this->mots_cles))
$this->mots_cles=null;
if(empty($this->memo))
$this->memo=null;
if(empty($this->illustration))
$this->illustration=null;
$prepare=$Bd->prepare("INSERT INTO hub (nom,auteur_id,publication_ok,index_ok,description,illustration,langue,mots_cles,memo,time_crea,time_maj,time_validation) VALUES (:nom,:auteur_id,:publication_ok,:index_ok,:description,:illustration,:langue,:mots_cles,:memo,:time_crea,:time_maj,:time_validation)");
$ajout=$prepare->execute(array(':nom'=>$this->nom,':auteur_id'=>$this->auteur->id_utilisateur,':publication_ok'=>$this->publication_ok,':index_ok'=>$this->index_ok,':description'=>$this->description,':illustration'=>$this->illustration,':langue'=>$this->langue,':mots_cles'=>$this->mots_cles,':memo'=>$this->memo,':time_crea'=>$this->time_crea,':time_maj'=>$this->time_maj,':time_validation'=>$this->time_validation));
if((test_requete(__FILE__,__LINE__,$ajout,$prepare)===false)) return false;
$this->id_hub=$Bd->lastInsertId();
$prepare=null;
/*// l'auteur du hub devient automatiquement son administrateur (sauf si administrateur général)
if(!$est_admin)
$this->ajout_admin($this->auteur);//créé aussi le cache du hub
else*/
$this->crea_cache();
return true;
}
/**
* Méthode enregistrant une mise à jour des infos principales d'un hub
* @param $validation_ok si un administrateur valide le hub
*
* @return booléen suivant succès
* @author Fabrice PENHOËT
**/
public function actualise($validation_ok=false)
{
global $Bd;
if((isset_connexion(__FILE__,__LINE__)===false)) return false;
if((empty($this->nom))||(empty($this->id_hub)))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT));
return false;
}
if(!($this->est_libre()))
{
$this->erreurs=array_merge($this->erreurs,(array) ERREUR_HUB_DOUBLON);
return false;
}
$a_hub=self::recherche($this->id_hub,"id_hub","time_validation");
if(empty($a_hub))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_ENREG_ABSENT.">>".intval($this->id_hub)));
return false;
}
if(($validation_ok===false)||($a_hub["time_validation"]!=0))
$this->time_validation=$a_hub["time_validation"];
else
$this->time_validation=time();
$prepare=$Bd->prepare("UPDATE hub SET nom=:nom,publication_ok=:publication_ok,index_ok=:index_ok,description=:description,langue=:langue,mots_cles=:mots_cles,memo=:memo,time_maj=:date_actuelle,time_validation=:time_validation WHERE id_hub=:id_hub;");
$maj=$prepare->execute(array(':nom'=>$this->nom,':publication_ok'=>$this->publication_ok,':index_ok'=>$this->index_ok,':description'=>$this->description,':langue'=>$this->langue,':mots_cles'=>$this->mots_cles,':memo'=>$this->memo,':date_actuelle'=>time(),':time_validation'=>$this->time_validation,':id_hub'=>$this->id_hub));
if((test_requete(__FILE__,__LINE__,$maj,$prepare)===false)) return false;
$prepare=null;
$this->crea_cache();
return true;
}
/**
* Méthode enregistrant la mise à jour ou suppression de l'illustration d'un hub.
* @param @suppr_illustration pour les demandes de suppression de l'image,
*
* @return booléen suivant succès
* @author Fabrice PENHOËT
**/
public function actualise_illustration($suppr_illustration=false)
{
global $Bd;
if((isset_connexion(__FILE__,__LINE__)===false)) return false;
if((empty($this->nom))||(empty($this->id_hub)))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT));
return false;
}
if(($suppr_illustration===false)&&(empty($this->illustration)))
return true;//rien demandé !
$a_hub=self::recherche($this->id_hub,"id_hub","illustration");
if(empty($a_hub))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_ENREG_ABSENT.">>".intval($this->id_hub)));
$this->suppr_illustration();
return false;
}
$ancienne_illustration=$a_hub["illustration"];
// demande de suppression ou mise à jour, il faut de toute façon supprimer l'ancienne image.
if(!empty($ancienne_illustration))
unlink(HUB_ILLUS_REP."/".$ancienne_illustration[0]."/".$ancienne_illustration);
if($suppr_illustration)
$this->illustration=null;
$prepare=$Bd->prepare("UPDATE hub SET illustration=:illustration,time_maj=:date_actuelle WHERE id_hub=:id_hub;");
$maj=$prepare->execute(array(':illustration'=>$this->illustration,':date_actuelle'=>time(),':id_hub'=>$this->id_hub));
if((test_requete(__FILE__,__LINE__,$maj,$prepare)===false)) return false;
$prepare=null;
$this->crea_cache();
return true;
}
/**
* Méthode testant le classement d'un hub dans une rubrique donnée
*
* @param la rubrique recherchée
* @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
**/
public function est_dans_rubrique($rubrique)
{
global $Bd;
if((isset_connexion(__FILE__,__LINE__)===false)) return false;
if(empty($this->id_hub))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT));
return false;
}
if(!($rubrique instanceof FclFlux_rubrique))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_FORMAT));
return false;
}
if(empty($rubrique->id_rubrique))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_FORMAT));
return false;
}
$prepare=$Bd->prepare("SELECT * FROM hub_classement_rubriques WHERE (id_rubrique=:id_rubrique AND id_hub=:id_hub)");
$recherche=$prepare->execute(array(":id_rubrique"=>$rubrique->id_rubrique,":id_hub"=>$this->id_hub));
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 enregistrant le classement d'un hub dans une rubrique
* on peut préciser si le hub est enregistré comme référence ou non dans cette rubrique
*
* @param $rubrique : objet de la classe rubrique, $reference_ok : booléeen
* @return booléen suivant succès
* @author Fabrice PENHOËT
**/
public function ajout_rubrique($rubrique=null,$reference_ok=0)
{
global $Bd;
if((isset_connexion(__FILE__,__LINE__)===false)) return false;
$classement=$this->est_dans_rubrique($rubrique);
if($classement)
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_DOUBLON));
return false;
}
$existe=FclFlux_rubrique::recherche($rubrique->id_rubrique,"id_rubrique");
if(empty($existe))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_ENREG_ABSENT));
return false;
}
if($reference_ok!==1)
$reference_ok=0;
$prepare=$Bd->prepare("INSERT INTO hub_classement_rubriques (id_hub,id_rubrique,reference_ok) VALUES (:id_hub,:id_rubrique,:reference_ok)");
$classement=$prepare->execute(array(':id_hub'=>$this->id_hub,':id_rubrique'=>$rubrique->id_rubrique,':reference_ok'=>$reference_ok));
if((test_requete(__FILE__,__LINE__,$classement,$prepare)===false)) return false;
$prepare=null;
$this->crea_cache();
$rubrique->get_liste_hubs(true);
if($reference_ok==1)
FclFlux_rubrique::get_rubriques_reference(true);
return true;
}
/**
* Méthode enregistrant la mise à jour du statut de "référence" d'un hub dans une rubrique
*
* @param $rubrique : objet de la classe rubrique, $reference_ok : nouvelle valeur (0/1)
* @return booléen suivant succès
* @author Fabrice PENHOËT
**/
public function actualise_rubrique_ref_ok($rubrique=null,$reference_ok=0)
{
global $Bd;
if((isset_connexion(__FILE__,__LINE__)===false)) return false;
$classement=$this->est_dans_rubrique($rubrique);
if(!$classement)
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_ENREG_ABSENT));
return false;
}
if($classement["reference_ok"]==$reference_ok)
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_FORMAT));
return false;
}
$prepare=$Bd->prepare("UPDATE hub_classement_rubriques SET reference_ok=:ref WHERE (id_rubrique=:id_rubrique AND id_hub=:id_hub) LIMIT 1;");
$classement=$prepare->execute(array(':ref'=>$reference_ok,':id_hub'=>$this->id_hub,':id_rubrique'=>$rubrique->id_rubrique));
if((test_requete(__FILE__,__LINE__,$classement,$prepare)===false)) return false;
$prepare=null;
$this->crea_cache();
$rubrique->get_liste_hubs(true);
FclFlux_rubrique::get_rubriques_reference();
return true;
}
/**
* Méthode enregistrant le déclassement d'un hub dans une rubrique
*
* @param $rubrique : objet de la classe rubrique
* @return booléen suivant succès
* @author Fabrice PENHOËT
**/
public function suppr_rubrique($rubrique=null)
{
global $Bd;
if((isset_connexion(__FILE__,__LINE__)===false)) return false;
$classement=$this->est_dans_rubrique($rubrique);
if(!$classement)
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_ENREG_ABSENT));
return false;
}
$prepare=$Bd->prepare("DELETE FROM hub_classement_rubriques WHERE (id_rubrique=:id_rubrique AND id_hub=:id_hub) LIMIT 1;");
$classement=$prepare->execute(array(':id_hub'=>$this->id_hub,':id_rubrique'=>$rubrique->id_rubrique));
if((test_requete(__FILE__,__LINE__,$classement,$prepare)===false)) return false;
$prepare=null;
$this->crea_cache();
$rubrique->get_liste_hubs(true);
if($classement["reference_ok"]==1)
FclFlux_rubrique::get_rubriques_reference();
return true;
}
/**
* Méthode listant les rubriques dans lesquelles est classé un hub
*
* @return liste des id des rubriques dans un tableau si trouvé (peut être vide), false en cas d'erreur
* @author Fabrice PENHOËT
**/
public function get_rubriques()
{
global $Bd;
if((isset_connexion(__FILE__,__LINE__)===false)) return false;
if(empty($this->id_hub))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT));
return false;
}
$prepare=$Bd->prepare("SELECT id_rubrique FROM hub_classement_rubriques WHERE id_hub=:valeur");
$recherche=$prepare->execute(array(":valeur"=>$this->id_hub));
if((test_requete(__FILE__,__LINE__,$recherche,$prepare)===false)) return false;
$resultat=$prepare->fetchAll(PDO::FETCH_ASSOC);
$prepare=null;
return $resultat;
}
/**
* Méthode listant les données connues concernant les rubriques dans lesquelles est classé un hub
*
* @param null
* @return liste des des rubriques dans un tableau si trouvé (peut être vide), false en cas d'erreur
* @author Fabrice PENHOËT
**/
public function get_rubriques_infos()
{
global $Bd;
if((isset_connexion(__FILE__,__LINE__)===false)) return false;
if(empty($this->id_hub))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT));
return false;
}
$prepare=$Bd->prepare("SELECT distinct R.id_rubrique,R.nom,C.reference_ok FROM hub_classement_rubriques AS C,hub_rubriques AS R WHERE ((R.id_rubrique=C.id_rubrique) AND (C.id_hub=:valeur)) ORDER BY R.nom ASC");
$recherche=$prepare->execute(array(":valeur"=>$this->id_hub));
if((test_requete(__FILE__,__LINE__,$recherche,$prepare)===false)) return false;
$resultat=$prepare->fetchAll(PDO::FETCH_ASSOC);
$prepare=null;
return $resultat;
}
/**
* Méthode cherchant si il y a de nouveaux hubs qu'un administrateur doit valider.
*
* @param null
* @return les données de la table dans un tableau si trouvé, false si pas trouvé ou en cas d'erreur
* @author Fabrice PENHOËT
**/
static function get_a_valider()
{
global $Bd;
if((isset_connexion(__FILE__,__LINE__)===false)) return false;
$get_hubs=$Bd->query("SELECT id_hub,nom FROM hub WHERE time_validation=0");
if((test_requete(__FILE__,__LINE__,$get_hubs)===false)) return false;
$resultat=$get_hubs->fetchAll(PDO::FETCH_ASSOC);
if(empty($resultat))
return false;
else
return $resultat;
}
/**
* Méthode vérifiant si un utilisateur est administrateur ou non d'un hub
*
* @param l'utilisateur a tester
* @return booléen suivant résultat
* @author Fabrice PENHOËT
**/
public function est_admin($user)
{
global $Bd;
if((isset_connexion(__FILE__,__LINE__)===false)) return false;
if(empty($this->id_hub))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT));
return false;
}
if(!($user instanceof FclFlux_utilisateur))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_FORMAT));
return false;
}
if(empty($user->id_utilisateur))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_FORMAT));
return false;
}
$test_admin=$Bd->query("SELECT time_admin FROM hub_admin WHERE id_hub=".intval($this->id_hub)." AND id_utilisateur=".intval($user->id_utilisateur));
if((test_requete(__FILE__,__LINE__,$test_admin)===false)) return false;
$resultat=$test_admin->fetchAll(PDO::FETCH_ASSOC);
if(empty($resultat))
return false;
else
return true;
}
/**
* Méthode enregistrant un nouvel administrateur pour un hub.
*
* @param $user : l'utilisateur
* @return booléen suivant succès
* @author Fabrice PENHOËT
**/
public function ajout_admin($user)
{
global $Bd;
if((isset_connexion(__FILE__,__LINE__)===false)) return false;
if(empty($this->id_hub))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT));
return false;
}
if(!($user instanceof FclFlux_utilisateur))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_FORMAT));
return false;
}
if(empty($user->id_utilisateur))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_FORMAT));
return false;
}
$test_doublon=$this->est_admin($user);
if($test_doublon)
{
$this->erreurs=array_merge($this->erreurs,(array) (ERREUR_SQL_DOUBLON." >> hub : ".$this->id_hub.", utilisateur : ".$user->id_utilisateur));
return false;
}
$existe=FclFlux_utilisateur::recherche($user->id_utilisateur,"id_utilisateur","id_utilisateur");
if(empty($existe))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_ENREG_ABSENT));
return false;
}
$prepare=$Bd->prepare("INSERT INTO hub_admin (id_hub,id_utilisateur,time_admin) VALUES (:id_hub,:id_utilisateur,:time)");
$set_admin=$prepare->execute(array(':id_hub'=>$this->id_hub,':id_utilisateur'=>$user->id_utilisateur,':time'=>time()));
if((test_requete(__FILE__,__LINE__,$set_admin,$prepare)===false)) return false;
$prepare=null;
$this->crea_cache();
return true;
}
/**
* Méthode supprimant son rôle à l'administrateur d'un hub.
*
* @param $user : l'utilisateur
* @return booléen suivant succès
* @author Fabrice PENHOËT
**/
public function suppr_admin($user)
{
global $Bd;
if((isset_connexion(__FILE__,__LINE__)===false)) return false;
if(empty($this->id_hub))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT));
return false;
}
if(!($user instanceof FclFlux_utilisateur))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_FORMAT));
return false;
}
if(empty($user->id_utilisateur))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_FORMAT));
return false;
}
$test_role=$this->est_admin($user);
if(!$test_role)
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_ENREG_ABSENT." >> ".intval($user->id_utilisateur)));
return false;
}
$suppr=$Bd->query("DELETE FROM hub_admin WHERE id_hub=".intval($this->id_hub)." AND id_utilisateur=".intval($user->id_utilisateur).";");
if((test_requete(__FILE__,__LINE__,$suppr)===false)) return false;
$this->crea_cache();
return true;
}
/**
* Méthode retournant la liste des administrateurs d'un hub
*
* @param null
* @return les données de la table dans un tableau si trouvé, false si pas trouvé ou en cas d'erreur
* @author Fabrice PENHOËT
**/
public function get_admins()
{
global $Bd;
if((isset_connexion(__FILE__,__LINE__)===false)) return false;
if(empty($this->id_hub))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT));
return false;
}
$get_admins=$Bd->query("SELECT H.id_utilisateur,H.time_admin,U.pseudo,U.email FROM hub_admin AS H,utilisateurs AS U WHERE ((U.id_utilisateur=H.id_utilisateur) AND (H.id_hub=".intval($this->id_hub)."));");
if((test_requete(__FILE__,__LINE__,$get_admins)===false)) return false;
$resultat=$get_admins->fetchAll(PDO::FETCH_ASSOC);
if(empty($resultat))
return false;
else
return $resultat;
}
/**
* Méthode créant le fichier cache contenant les infos utiles d'un hub
* id_hub doit être connu
*
* @return booléen suivant succès
* @author Fabrice PENHOËT
**/
public function crea_cache()
{
if(empty($this->id_hub))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT));
return false;
}
$infos=self::recherche($this->id_hub,"id_hub","nom,auteur_id,publication_ok,index_ok,description,illustration,langue,time_crea,time_maj,time_validation");
if($infos===false)
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_ENREG_ABSENT.">>".intval($this->id_hub)));
return false;
}
$rub=$this->get_rubriques();
if(!empty($rub))
$infos["rubriques"]=$rub;
$admins=$this->get_admins();
if(!empty($admins))
$infos["admins"]=$admins;
$id=strval($this->id_hub);
return crea_cache(CACHE_REP_HUB."/".$id[0]."/$id.txt",$infos);
}
/**
* Méthode ouvrant le fichier cache contenant les infos d'un hub
*
* @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 du hub 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_hub))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT));
return false;
}
$id=strval(intval($this->id_hub));
$fichier=CACHE_REP."/".CACHE_REP_HUB."/".$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))
$infos[$key]=stripslashes($value);
}
}
if(empty($infos))
return false;
else
return $infos;
}
/**
* Méthode ouvrant le fichier cache du hub pour en extraire les rubriques dans lesquelles il est classé
*
* @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 telles que fournies par leurs fichiers (si trouvés), false en cas d'erreur
* @author Fabrice PENHOËT
**/
public function get_liste_rubriques_cache($crea_cache=false)
{
global $Bd;
if(empty($this->id_hub))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT));
return false;
}
$id=strval($this->id_hub);
$fichier=CACHE_REP."/".CACHE_REP_HUB."/".$id[0]."/$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->crea_cache())
return false;
}
else
return false;
}
include($fichier);
if(empty($t["rubriques"]))
return false;
else
{
$rubs=$t["rubriques"];
$i=0;
foreach($rubs as $key => $value)
{
if(!empty($value["id_rubrique"]))
{
$rubrique=new FclFlux_rubrique();
$rubrique->id_rubrique=$value["id_rubrique"];
$rubrique_infos=$rubrique->get_infos_cache($crea_cache);
if(!empty($rubrique_infos))
{
$rubrique_infos["id_rubrique"]=$value["id_rubrique"];
$liste[$i]=$rubrique_infos;
$i++;
}
unset($rubrique);
}
}
}
if(empty($liste))
return false;
else
return $liste;
}
/**
* Méthode ouvrant le fichier cache du hub pour en extraire ses éventuels administrateurs.
*
* @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 administrateurs telles que fournies par leurs fichiers (si trouvés), false en cas d'erreur
* @author Fabrice PENHOËT
**/
public function get_liste_admins_cache($crea_cache=false)
{
global $Bd;
if(empty($this->id_hub))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT));
return false;
}
$id=strval($this->id_hub);
$fichier=CACHE_REP."/".CACHE_REP_HUB."/".$id[0]."/$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->crea_cache())
return false;
}
else
return false;
}
include($fichier);
if(empty($t["admins"]))
return false;
else
{
$admins=$t["admins"];
$i=0;$j=0;
while(isset($admins["id_utilisateur"]))
{
$admin=new FclFlux_utilisateur();
$admin->id_utilisateur=$admins["id_utilisateur"];
$admin_infos=$admin->get_infos_cache($crea_cache);
if(!empty($admin_infos))
{
$admin_infos["id_utilisateur"]=$admins["id_utilisateur"];
$admin_infos["time_admin"]=$admins["time_admin"];
$liste[$j]=$rubrique_infos;
$j++;
}
unset($admin);
$i++;
}
}
if(empty($liste))
return false;
else
return $liste;
}
/**
* Méthode listant les flux dans le contenu est importé dans ce hub.
*
* @param
* @return liste des id_flux dans un tableau si trouvé (peut être vide), false en cas d'erreur
* @author Fabrice PENHOËT
**/
public function get_flux()
{
global $Bd;
if((isset_connexion(__FILE__,__LINE__)===false)) return false;
if(empty($this->id_hub))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT));
return false;
}
$prepare=$Bd->prepare("SELECT id_flux FROM hub_flux WHERE id_hub=:valeur");
$recherche=$prepare->execute(array(":valeur"=>$this->id_hub));
if((test_requete(__FILE__,__LINE__,$recherche,$prepare)===false)) return false;
$resultat=$prepare->fetchAll(PDO::FETCH_ASSOC);
$prepare=null;
return $resultat;
}
/**
* Méthode supprimant l'enregistrement d'un hub
* Le cache listant les hubs de ses rubriques sera impacté.
*
* @param si sauve_abo vaut true, je ne peux supprimer un hub ayant des abonnés
* sinon je supprime également l'abonnement + j'actualise le cache des abonnements des utilisateurs concernés
* @return booléen suivant succès
* @author Fabrice PENHOËT
**/
public function supprime($sauve_abo=true)
{
global $Bd;
if((isset_connexion(__FILE__,__LINE__)===false)) return false;
if(empty($this->id_hub))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT));
return false;
}
$prepare=$Bd->prepare("SELECT id_abonnement FROM abonnements_hub WHERE id_hub=:id;");
$recherche=$prepare->execute(array(':id'=>$this->id_hub));
if((test_requete(__FILE__,__LINE__,$recherche,$prepare)===false)) return false;
$abonnements=$prepare->fetchAll(PDO::FETCH_ASSOC);
$prepare=null;
if((!empty($abonnements))&&($sauve_abo))
{
$this->erreurs=array_merge($this->erreurs,(array) ERREUR_FLUX_SUPPR_ABO);
unset($abonnements);
return false;
}
$a_hub=self::recherche($this->id_hub,"id_hub","illustration");
if(empty($a_hub))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_ENREG_ABSENT.">>".intval($this->id_hub)));
return false;
}
$this->illustration=$a_hub["illustration"];
$this->suppr_illustration();
$rubriques=$this->get_rubriques();
$prepare=$Bd->prepare("DELETE FROM hub WHERE id_hub=:id LIMIT 1;");
$suppr=$prepare->execute(array(':id'=>$this->id_hub));
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_hub)));
return false;
}
$this->suppr_cache();
foreach($rubriques as $rubrique_infos)
{
$rubrique=new FclFlux_rubrique();
$rubrique->id_rubrique=$rubrique_infos["id_rubrique"];
$rubrique->get_liste_hubs(true);
unset($rubrique);
}
foreach($abonnements as $abo)
{
$abo_maj=new FclFlux_abonnement();
$abo_maj->id_abonnement=$abo["id_abonnement"];
$abo_maj->get_infos(true,"designation,auteur_id,jours_alerte,heure_alerte,time_envoi");
unset($abo_maj);
}
//des fois que le hub supprimé était une référence dans une de ses rubriques...
FclFlux_rubrique::get_rubriques_reference(true);
return true;
}
/**
* Méthode de suppression des fichiers cache liés à un hub
* id_hub doit être connu
*
* @return booléen suivant succès
* @author Fabrice PENHOËT
**/
public function suppr_cache()
{
if(empty($this->id_hub))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT));
return false;
}
$id=strval($this->id_hub);
$chemin=CACHE_REP."/".CACHE_REP_HUB."/".$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_HUB."/".$id[0]."/posts-jour-$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_HUB."/".$id[0]."/posts-semaine-$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_HUB."/"."posts-mois-$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 listant les dernières annonces validées pour un hub.
* On sort les annonces des 30 derniers jours.
* Les annonces à date de diffusion postérieure à la date actuelle ne sont pas listées.
* Si demandé, 3 fichiers cache sont créés : 1 pour les dernières 24h, 1 pour les 7 derniers jours, le dernier pour les 30 jours.
*
* @param crea_cache : booléen pour savoir si il faut enregistrer le résultat dans des fichiers,
* $nb_limite d'annonces à retourner et $champs que l'on souhaite sortir, $limite_mois = true si je ne souhaite pas sortir de posts + anciens
* @return liste des annonces dans un tableau si trouvé (peut être vide), false en cas d'erreur.
* @author Fabrice PENHOËT
**/
public function get_liste_posts($crea_cache=false,$nb_limite=200,$champs="id_post,flux_id,auteur_id,ancre,url,time_validation,time_diffusion",$limite_mois=true)
{
global $Bd;
if((isset_connexion(__FILE__,__LINE__)===false)) return false;
if((empty($this->id_hub))||(!is_int($nb_limite)))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT));
return false;
}
$id=strval($this->id_hub);
if($limite_mois)
$time_limite_min=time()-3600*24*30;
else
$time_limite_min=0;
$time_limite_max=time();
if(empty($champs))
$champs="*";
$prepare=$Bd->prepare("SELECT $champs FROM hub_post WHERE ((hub_id=:valeur) AND ((time_diffusion=0 AND time_validation>=:limite_min) OR (time_diffusion!=0 AND time_diffusion>=:limite_min AND time_diffusion<=:limite_max))) ORDER BY time_diffusion DESC,time_validation DESC LIMIT 0,$nb_limite");
$recherche=$prepare->execute(array(":valeur"=>$id,":limite_min"=>$time_limite_min,":limite_max"=>$time_limite_max));
if((test_requete(__FILE__,__LINE__,$recherche,$prepare)===false)) return false;
$posts_mois=$prepare->fetchAll(PDO::FETCH_ASSOC);
$prepare=null;
if($crea_cache)
{
$cache_mois=crea_cache(CACHE_REP_HUB."/".$id[0]."/posts-mois-$id.txt",$posts_mois);
if($cache_mois)
{
if(empty($posts_mois))
{
$posts_semaine=array();
$posts_jour=array();
}
else
{
$i=0;
$posts_jour=array();$limite_jour=time()-3600*24;
$posts_semaine=array();$limite_semaine=time()-3600*24*7;
while(isset($posts_mois[$i]))
{
if(empty($posts_mois[$i]["time_diffusion"]))
$time_compare=$posts_mois[$i]["time_validation"];
else
$time_compare=$posts_mois[$i]["time_diffusion"];
if($time_compare>$limite_semaine)
{
$posts_semaine[$i]=$posts_mois[$i];
if($time_compare>$limite_jour)
$posts_jour[$i]=$posts_mois[$i];
}
$i++;
}
}
//on créé tous les fichiers même si les tableaux sont vides.
$cache_jour=crea_cache(CACHE_REP_HUB."/".$id[0]."/posts-jour-$id.txt",$posts_jour);
$cache_semaine=crea_cache(CACHE_REP_HUB."/".$id[0]."/posts-semaine-$id.txt",$posts_semaine);
if(($cache_jour===false)||($cache_semaine===false))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_CACHE_ECRITURE));
return false;
}
else
return true;
}
else
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_CACHE_ECRITURE));
return false;
}
}
else
return $posts_mois;
}
/**
* Méthode lançant l'actualisation des listes d'annonce pour les hubs concernés par des annonces dont la diffusion a été programmée pour ce jour.
*
* @return nombre de hubs actualisés.
* @author Fabrice PENHOËT
**/
static function actualise_liste_posts_date_diffusion()
{
global $Bd;
if((isset_connexion(__FILE__,__LINE__)===false)) return false;
$time_limite_max=time();
$time_limite_min=time()-3600*24;
$prepare=$Bd->prepare("SELECT DISTINCT hub_id FROM hub_post WHERE (time_diffusion!=0 AND time_diffusion>:limite_min AND time_diffusion<=:limite_max)");
$recherche=$prepare->execute(array(":limite_min"=>$time_limite_min,":limite_max"=>$time_limite_max));
if((test_requete(__FILE__,__LINE__,$recherche,$prepare)===false)) return false;
$hubs_maj=$prepare->fetchAll(PDO::FETCH_ASSOC);
$prepare=null;$nb_hub=0;
if(!empty($hubs_maj))
{
foreach($hubs_maj as $hub_infos)
{
$hub_maj=new FclFlux_hub();
$hub_maj->id_hub=$hub_infos["hub_id"];
$hub_maj->get_liste_posts(true);
$nb_hub++;
}
}
return $nb_hub;
}
/**
* Méthode ouvrant le fichier cache des posts actuels d'un hub
*
* @param crea_cache : un booléen pour savoir si il faut tester la création du fichier en cas d'absence,
* $periode de sortie des posts
* @return tableau contenant les infos des posts telles que fournies par le fichier (si trouvés), false en cas d'erreur
* @author Fabrice PENHOËT
* */
public function get_liste_posts_cache($crea_cache=false,$periode="jour")
{
global $Bd;
if(empty($this->id_hub))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT));
return false;
}
$id=strval($this->id_hub);
$fichier=CACHE_REP."/".CACHE_REP_HUB."/".$id[0]."/posts-$periode-$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;
// si il y a des flux liés à ce hub, je tente d'importer leur contenu
$flux_hub=$this->get_flux();
if(!empty($flux_hub))
{
foreach($flux_hub as $flux_id)
{
$flux_import=new FclFlux_flux();
$flux_import->id_flux=$flux_id["id_flux"];
$flux_import->import_liens();
unset($flux_import);
}
}
if($this->get_liste_posts(true)===false)
return false;
}
else
return false;
}
//j'ai aussi besoin des infos du hub
$hub_infos=$this->get_infos_cache($crea_cache);
if(empty($hub_infos))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT." >> ".intval($this->id_hub)));
return false;
}
//si j'ai demandé à forcer la création du cache et que le fichier à + de 24H,
//je lance une importation des flux mais sans bloquer en cas d'erreur
if((filemtime($fichier)<(time()-24*3600))&&($crea_cache))
{
if(empty($GLOBALS['Bd']))
require("connexion-bd.php");
if(empty($GLOBALS['Bd'])) return false;
$flux_hub=$this->get_flux();
if(!empty($flux_hub))
{
foreach($flux_hub as $flux_id)
{
$flux_import=new FclFlux_flux();
$flux_import->id_flux=$flux_id["id_flux"];
$flux_import->import_liens();
unset($flux_import);
}
}
$this->get_liste_posts(true);
}
if(!file_exists($fichier))//ne devrait pas être possible mais...
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_FICHIER_EXISTE." >> ".$fichier));
return false;
}
include($fichier);
if(empty($t))//le fichier peut être vide si aucun post récents dans le hub
return false;
else
{
$i=0;
foreach($t as $key => $value)
{
if(is_array($value))
{
$liste[$i]=$value;
$liste[$i]["hub"]=$hub_infos;
if(!empty($value["flux_id"]))
{
$flux_cache=new FclFlux_flux();
$flux_cache->id_flux=$value["flux_id"];
$flux_infos=$flux_cache->get_infos_cache($crea_cache);
if(!empty($flux_infos))
$liste[$i]["flux"]=$flux_infos;
unset($flux_cache);unset($flux_infos);
}
elseif(!empty($value["auteur_id"]))
{
$auteur_cache=new FclFlux_utilisateur();
$auteur_cache->id_utilisateur=$value["auteur_id"];
$auteur_infos=$auteur_cache->get_infos_cache($crea_cache);
if(!empty($auteur_infos))
$liste[$i]["auteur"]=$auteur_infos;
unset($auteur_cache);unset($auteur_infos);
}
// si un fichier cache existe, il doit y avoir un texte pour le post.
$post_cache=new FclFlux_post();
$post_cache->id_post=$liste[$i]["id_post"];
$get_cache=$post_cache->get_infos_cache(false);
if(!empty($get_cache))
$liste[$i]["annonce"]=$get_cache["annonce"];
unset($get_cache);unset($post_cache);
$i++;
}
}
}
if(empty($liste))
return false;
else
return $liste;
}
/**
* Méthode retournant la liste des abonnés actifs d'un hub (et donc leur nombre)
*
* @return les données dans un tableau php, false en cas d'erreur
* @author Fabrice PENHOËT
**/
public function get_liste_abonnes()
{
global $Bd;
if((isset_connexion(__FILE__,__LINE__)===false)) return false;
if(empty($this->id_hub))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT));
return false;
}
$stats=array();
$get_actifs=$Bd->query("SELECT DISTINCT auteur_id FROM abonnements as A,abonnements_hub as H WHERE ((H.id_abonnement=A.id_abonnement) AND (H.id_hub=".$this->id_hub.") AND (A.jours_alerte!='') AND (A.actif_ok=1));");
if((test_requete(__FILE__,__LINE__,$get_actifs)===false)) return false;
$stats["actifs"]=$get_actifs->fetchAll();
unset($get_actifs);
$get_inactifs=$Bd->query("SELECT DISTINCT auteur_id FROM abonnements as A,abonnements_hub as H WHERE ((H.id_abonnement=A.id_abonnement) AND (H.id_hub=".$this->id_hub.") AND (A.jours_alerte=''));");
if((test_requete(__FILE__,__LINE__,$get_inactifs)===false)) return false;
$stats["inactifs"]=$get_inactifs->fetchAll();
unset($get_inactifs);
$get_en_pause=$Bd->query("SELECT DISTINCT auteur_id FROM abonnements as A,abonnements_hub as H WHERE ((H.id_abonnement=A.id_abonnement) AND (H.id_hub=".$this->id_hub.") AND (A.jours_alerte!='') AND (A.actif_ok=0));");
if((test_requete(__FILE__,__LINE__,$get_en_pause)===false)) return false;
$stats["en_pause"]=$get_en_pause->fetchAll();
unset($get_en_pause);
return $stats;
}
/**
* Méthode retournant le nombre de clics cumulés des flux de ce hub
*
* @return nombre entier, false en cas d'erreur
* @author Fabrice PENHOËT
**/
public function get_nb_clics()
{
global $Bd;
if((isset_connexion(__FILE__,__LINE__)===false)) return false;
if(empty($this->id_hub))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT));
return false;
}
$get_clics=$Bd->query("SELECT SUM(F.nb_clics) as Total FROM flux as F,hub_flux as H WHERE ((H.id_flux=F.id_flux) AND (H.id_hub=".$this->id_hub.")) GROUP BY H.id_hub;");
if((test_requete(__FILE__,__LINE__,$get_clics)===false)) return false;
$res=$get_clics->fetch();
unset($get_clics);
return $res["Total"];
}
/**
* Affichage par défaut d'un objet
* il semble que la méthode héritée ne prenne pas en compte les nouveaux attributs ?
*
* @return chaîne de caractères listant la valeur de chaque attribut
* @author Fabrice PENHOËT
**/
public function __toString()
{
$texte="<h3>".__CLASS__."</h3>";
foreach($this as $key => $value)
{
if(is_array($value))
$value=affiche_tableau($value,"<li>#valeur</li>","<ul>","</ul>");
$texte.="$key : $value\n";
}
return $texte;
}
}//fin de la classe