hellofacteurV1/modele/FclFlux_abonnement.php

1870 lines
78 KiB
PHP
Executable File

<?php
/**
* classe décrivant les abonnements des utilisateurs
* chaque abonnement peut concerner un ou +sieurs hubs
* chaque abonnement a ses jours, son heure d'envoi et un nombre maximum de liens à prendre en compte pour les mailings
* l'utilisateur a la haute main pour les actualiser/supprimer ses abonnements comme souhaité
* il faut fournir une version aggrégée et sans doublon des différents hubs concernés par un abonnement, que cela soit pour l'affichage en ligne ou l'envoi d'un email
* on a besoin de la classes FclFlux_hub pour désigner les hubs inclus dans chaque abonnement.
* + la classe FclFlux_utilisateur pour désigner l'abonné
*
* @author Fabrice PENHOËT
**/
require_once("FclFlux_utilisateur.php");
require_once("FclFlux_hub.php");
class FclFlux_abonnement
{
public $id_abonnement;
protected $designation;// désignation de l'abonnement.
protected $jours_alerte;// les jours de la semaine où l'utilisateur souhaite recevoir son abonnement. Peut être vide.
public $heure_alerte;// heure de départ souhaitée pour l'envoi de l'abonnement
protected $decalage_horaire;// décalage horaire entre l'heure locale du fuseau horaire de l'utilisateur et celui par défaut de l'application.
protected $time_crea;// timestamp de l'enregistrement de l'abonnement.
protected $time_maj;// timestamp de la dernière mise à jour de l'abonnement.
protected $time_envoi;// timestamp du dernier envoi.
public $proprietaire;// objet de type FclFlux_utilisateur désignant le propriétaire de l'abonnement.
protected $max_liens;// définit le nombre de liens maximum pouvant être envoyés / message.
protected $ville_insee;// le code insee de la ville centrale de l'abonnement si il s'agit d'actualités locales.
public $erreurs=array();//collecte les erreurs / utilisateur générées par 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)))
{
$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é de la désignation de l'abonnement
* et l'attribuant à l'objet si ok
*
* @param la désignation à contrôler
* @return booléen suivant succès
* @author Fabrice PENHOËT
**/
public function set_designation($designation)
{
$designation=strip_tags(strval(trim($designation)));
$longueur=strlen($designation);
if(($longueur<ABO_MIN_DESIGNATION)||($longueur>ABO_MAX_DESIGNATION))
{
$this->erreurs=array_merge($this->erreurs,(array) (str_replace(array("__MIN__","__MAX__"),array(ABO_MIN_DESIGNATION,ABO_MAX_DESIGNATION),ERREUR_ABO_DESIGNATION_LONG)));
return false;
}
else
{
$this->designation=$designation;
return true;
}
}
/**
* Méthode testant la validité des jours de la semaine (JDS) attribués à un abonnement
* ils doivent correspondre aux valeurs numériques des JDS de la fonction date()-> 0,1,2,3,4,5,6
* il ne peut y avoir que 7 jours, tous différents
* si ok, on les attribue à l'objet avec mise en forme, exemple : [0][6] pour envoi le week-end
* cet attribut peut être vide (=abonnement inactif)
*
* @param valeur fournie sous forme d'une chaîne de caractères séparés par des virgules
* @return booléen suivant succès
* @author Fabrice PENHOËT
**/
public function set_jours_alerte($jours=NULL)
{
if($jours==NULL)
$jours_alerte="";
else
{
$jours_alerte=null;
$jours=explode(",",$jours);
$valeurs_ok=explode("|",ABO_JOURS);
foreach($jours as $valeur_test)
{
if (!in_array($valeur_test,$valeurs_ok))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_AUTORISES." >> ".htmlentities($valeur_test,ENT_QUOTES)));
return false;
}
elseif(strpos($jours_alerte,"[$valeur_test]")===false)//pas un doublon
$jours_alerte.="[$valeur_test]";
}
}
$this->jours_alerte=$jours_alerte;
return true;
}
/**
* Méthode testant la validité de l'heure de départ d'envoi des emails
*
* @return booléen suivant succès
* @author Fabrice PENHOËT
**/
public function set_heure_alerte($heure)
{
if(empty($heure))
{
$this->heure_alerte="07";
return true;
}
$valeurs_ok="[00][01][02][03][04][05][06][07][08][09][10][11][12][13][14][15][16][17][18][19][20][21][22][23]";
if (strpos($valeurs_ok,"[$heure]")===false)
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_AUTORISES." >> ".htmlentities($heure,ENT_QUOTES)));
return false;
}
$this->heure_alerte=$heure;
return true;
}
/**
* Méthode testant la validité du propriétaire fourni
*
* @param user : une instance de l'objet FclFlux_utilisateur
* @return booléen suivant succès
* @author Fabrice PENHOËT
**/
public function set_proprietaire($user)
{
if(!($user instanceof FclFlux_utilisateur))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_FORMAT));
return false;
}
if(!isset($user->id_utilisateur))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT));
return false;
}
if(!(FclFlux_utilisateur::recherche($user->id_utilisateur,"id_utilisateur","id_utilisateur")))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_ENREG_ABSENT." >> ".intval($user->id_utilisateur)));
return false;
}
$this->proprietaire=$user;
return true;
}
/**
* Méthode testant la valeur saisie pour le nombre maximum de liens / envoi pour cet abonnement.
*
* @param la valeur à contrôler
* @return booléen suivant succès
* @author Fabrice PENHOËT
*/
public function set_max_liens($valeur)
{
if(empty($valeur))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT));
return false;
}
elseif(!is_int($valeur))
{
$this->erreurs=array_merge($this->erreurs,(array) ERREUR_ABO_NB_MAX_LIENS_ENTIER);
return false;
}
else
{
global $Abo_max_liens;
if(($valeur<$Abo_max_liens["min"])||($valeur>$Abo_max_liens["max"]))
{
$this->erreurs=array_merge($this->erreurs,(array) (str_replace(array("__MIN__","__MAX__"),array($Abo_max_liens["min"],$Abo_max_liens["max"]),ERREUR_ABO_NB_MAX_LIENS_VALEUR)));
return false;
}
else
$this->max_liens=$valeur;
}
return true;
}
/**
* Méthode testant le code insee de la ville centrale d'un abonnement aux actualités locales.
* sa valeur peut être nulle, si il s'agit d'un autre type d'abonnement.
*
* @param la valeur à contrôler
* @return booléen suivant succès
* @author Fabrice PENHOËT
*/
public function set_ville_insee($insee=null)
{
global $Bd;
if((isset_connexion(__FILE__,__LINE__)===false)) return false;
if(empty($insee))
$this->ville_insee=null;
else
{
global $Bd;
if((isset_connexion(__FILE__,__LINE__)===false)) return false;
$prepare=$Bd->prepare("SELECT id_rubrique FROM hub_rubriques WHERE insee=:insee;");
$recherche=$prepare->execute(array(":insee"=>$insee));
if((test_requete(__FILE__,__LINE__,$recherche,$prepare)===false)) return false;
$rub_infos=$prepare->fetch();
$prepare=null;
if(!empty($rub_infos))
$this->ville_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 cherchant un abonnement dans le bd via son id_abonnement, seul identifiant unique
*
* @param l'id de l'abonnement recherché, son propriétaire + les champs souhaités en sortie
* @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 recherche($valeur,$proprietaire,$champ_sortie="*")
{
global $Bd;
if((isset_connexion(__FILE__,__LINE__)===false)) return false;
if(!empty($proprietaire))
{
if(!($proprietaire instanceof FclFlux_utilisateur))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_FORMAT));
return false;
}
if(!isset($proprietaire->id_utilisateur))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT));
return false;
}
$prepare=$Bd->prepare("SELECT $champ_sortie FROM abonnements WHERE id_abonnement=:valeur AND auteur_id=:id");
$recherche=$prepare->execute(array(":valeur"=>$valeur,":id"=>$proprietaire->id_utilisateur));
}
else
{
$prepare=$Bd->prepare("SELECT $champ_sortie FROM abonnements WHERE id_abonnement=: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 listant les abonnements d'un utilisateur.
*
* @param $crea_cache vaut true si on souhaite stocker le résultat dans un fichier, $champ_sortie les champs souhaités.
* @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 get_liste($crea_cache=false,$champ_sortie="*")
{
global $Bd;
if((isset_connexion(__FILE__,__LINE__)===false)) return false;
if(empty($this->proprietaire))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT));
return false;
}
$id=strval($this->proprietaire->id_utilisateur);
$prepare=$Bd->prepare("SELECT $champ_sortie FROM abonnements WHERE auteur_id=:id;");
$recherche=$prepare->execute(array(":id"=>$id));
if((test_requete(__FILE__,__LINE__,$recherche,$prepare)===false)) return false;
$resultat=$prepare->fetchAll(PDO::FETCH_ASSOC);
$prepare=null;
if(empty($resultat))
return false;
elseif($crea_cache)
return crea_cache(CACHE_REP_UTILISATEURS."/".$id[0]."/abo-$id.txt",$resultat);
else
return $resultat;
}
/**
* Méthode listant les hubs concernés par un abonnement
*
* @return les identifiants des hubs dans un tableau php si trouvé. false si pas trouvé ou en cas d'erreur.
* @author Fabrice PENHOËT
**/
public function get_liste_hubs()
{
global $Bd;
if((isset_connexion(__FILE__,__LINE__)===false)) return false;
if(empty($this->id_abonnement))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT));
return false;
}
$id=intval($this->id_abonnement);
$prepare=$Bd->prepare("SELECT id_hub FROM abonnements_hub WHERE id_abonnement=:id;");
$recherche=$prepare->execute(array(":id"=>$id));
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 hubs proposés à l'utilisateur pour son abonnement.
* Ce sont les hubs classés dans les mêmes rubriques que ceux déjà concernés par l'abonnement.
*
* @param $hubs_existants tableau contenant les id des hubs concernés par cet abonnement.
* @return les identifiants des hubs dans un tableau php si trouvé. false si pas trouvé ou en cas d'erreur.
* @author Fabrice PENHOËT
**/
public function get_propose_hubs($hubs_existants="")
{
global $Bd;
if((isset_connexion(__FILE__,__LINE__)===false)) return false;
if(empty($this->id_abonnement))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT));
return false;
}
if(empty($hubs_existants))
$hubs_existants=$this->get_liste_hubs();
if(empty($hubs_existants))
return false;
$hubs_sql="";
foreach($hubs_existants as $hub_id)
$hubs_sql.=$hub_id["id_hub"].",";
$hubs_sql=substr($hubs_sql,0,-1);
$prepare=$Bd->prepare("SELECT DISTINCT Propose.id_hub FROM hub_classement_rubriques AS Propose,hub_classement_rubriques AS Existants WHERE ( (Propose.id_rubrique=Existants.id_rubrique) AND Existants.id_hub IN ($hubs_sql) AND Propose.id_hub NOT IN ($hubs_sql));");
$recherche=$prepare->execute();
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 sortant les principales infos d'un abonnement + liste des hubs concernés.
*
* @param $crea_cache vaut true si on souhaite stocker le résultat dans un fichier, $champ_sortie les champs souhaités
* @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 get_infos($crea_cache=false,$champ_sortie="designation,auteur_id,jours_alerte,heure_alerte,time_envoi,ville_insee,max_liens")
{
global $Bd;
if((isset_connexion(__FILE__,__LINE__)===false)) return false;
if(empty($this->id_abonnement))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT));
return false;
}
$prepare=$Bd->prepare("SELECT $champ_sortie FROM abonnements WHERE id_abonnement=:id LIMIT 1;");
$recherche=$prepare->execute(array(":id"=>$this->id_abonnement));
if((test_requete(__FILE__,__LINE__,$recherche,$prepare)===false)) return false;
$infos=$prepare->fetch(PDO::FETCH_ASSOC);
$prepare=null;
if(empty($infos))
return false;
$hubs=$this->get_liste_hubs();
if(!empty($hubs))
$infos=array_merge($infos,$hubs);
//infos complémentaires liées à la ville si connue...
if(!empty($infos["ville_insee"]))
{
$prepare=$Bd->prepare("SELECT r.id_rubrique,v.cp,v.nom,v.dep_num,v.dep_nom,v.region_nom FROM hub_rubriques AS r,villes AS v WHERE ((v.insee=r.insee) AND (r.insee=:insee))");
$recherche=$prepare->execute(array(":insee"=>$infos["ville_insee"]));
if((test_requete(__FILE__,__LINE__,$recherche,$prepare)===false)) return false;
$ville_infos=$prepare->fetch(PDO::FETCH_ASSOC);
$prepare=null;
if(!empty($ville_infos))
$infos=array_merge($infos,$ville_infos);
}
$id=strval($this->id_abonnement);
if($crea_cache)
return crea_cache(CACHE_REP_ABO."/".$id[0]."/$id.txt",$infos);
else
return $resultat;
}
/**
* Méthode enregistrant un nouvel abonnement
*
* @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->designation))||(empty($this->proprietaire)))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT));
return false;
}
if(!isset($this->jours_alerte))
$this->jours_alerte="[0][1][2][3][4][5][6]";
if(empty($this->heure_alerte))
{
$heures=array("08","09","10","12");//remette 07 et 11 quand mieux lissé...
$heure=array_rand($heures,1);
$this->heure_alerte=$heures[$heure];
}
global $Abo_max_liens;
if(empty($this->max_liens))
$this->max_liens=$Abo_max_liens["medium"];
if(!isset($this->ville_insee))
$this->ville_insee=null;
$prepare=$Bd->prepare("INSERT INTO abonnements (designation,auteur_id,jours_alerte,heure_alerte,ville_insee,max_liens,time_crea,time_maj) VALUES (:designation,:auteur_id,:jours,:heure,:insee,:max_liens,:date_actuelle,:date_actuelle)");
$ajout=$prepare->execute(array(':designation'=>$this->designation,':auteur_id'=>$this->proprietaire->id_utilisateur,':jours'=>$this->jours_alerte,':heure'=>$this->heure_alerte,':insee'=>$this->ville_insee,':max_liens'=>$this->max_liens,':date_actuelle'=>time()));
if((test_requete(__FILE__,__LINE__,$ajout,$prepare)===false)) return false;
$prepare=null;
$this->id_abonnement=$Bd->lastInsertId();
$this->get_infos(true);
$this->get_liste(true,"id_abonnement");
return true;
}
/**
* Méthode modifiant les informations d'un abonnement
* seul son propriétaire doit pouvoir faire cette opération
* la ville de base d'un abonnement local ne peut pas changer, pas plus que le propriétaire.
*
* @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->designation))||(empty($this->id_abonnement))||(empty($this->proprietaire)))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT." >> ".intval($this->id_abonnement)));
return false;
}
//recherche de l'enregistrement
$abo_infos=self::recherche($this->id_abonnement,$this->proprietaire,"jours_alerte,heure_alerte,max_liens,ville_insee");
if(empty($abo_infos))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_ENREG_ABSENT." >> ".intval($this->id_abonnement).",".intval($this->proprietaire->id_utilisateur)));
return false;
}
if(!isset($this->jours_alerte))
$this->jours_alerte=$abo_infos["jours_alerte"];
if(empty($this->heure_alerte))
$this->heure_alerte=$abo_infos["heure_alerte"];
if(empty($this->max_liens))
$this->max_liens=$abo_infos["max_liens"];
if(empty($this->ville_insee))
$this->ville_insee=$abo_infos["ville_insee"];
$prepare=$Bd->prepare("UPDATE abonnements SET designation=:designation,jours_alerte=:jours,heure_alerte=:heure,max_liens=:max_liens,ville_insee=:ville,time_maj=:time WHERE id_abonnement=:id and auteur_id=:auteur_id;");
$maj=$prepare->execute(array(':designation'=>$this->designation,':jours'=>$this->jours_alerte,':heure'=>$this->heure_alerte,':max_liens'=>$this->max_liens,':ville'=>$this->ville_insee,':time'=>time(),':id'=>$this->id_abonnement,':auteur_id'=>$this->proprietaire->id_utilisateur));
if((test_requete(__FILE__,__LINE__,$maj,$prepare)===false)) return false;
$prepare=null;
$this->get_infos(true);
return true;
}
/**
* Méthode ajoutant un ou +sieurs hubs à un abonnement
*
* @param tableau contenant ou +sieurs objets FclFlux_hub à ajouter à un abonnement
* @return booléen suivant succès
* @author Fabrice PENHOËT
**/
public function ajout_hubs($hubs)
{
global $Bd;
if((isset_connexion(__FILE__,__LINE__)===false)) return false;
if((empty($this->id_abonnement))||(empty($hubs)))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT));
return false;
}
if((self::recherche($this->id_abonnement,false,"id_abonnement"))===false)
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_ENREG_ABSENT.">>".intval($this->id_abonnement)));
return false;
}
if(!is_array($hubs))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_FORMAT));
return false;
}
foreach($hubs as $hub_info)
{
if(!($hub_info instanceof FclFlux_hub))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_FORMAT));
return false;
}
if(empty($hub_info->id_hub))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_FORMAT));
return false;
}
if((FclFlux_hub::recherche($hub_info->id_hub,"id_hub","id_hub"))===false)
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_ENREG_ABSENT.">>".intval($hub_info->id_hub)));
return false;
}
}
$prepare_doublon=$Bd->prepare("SELECT * FROM abonnements_hub WHERE id_hub=:id_hub and id_abonnement=:id_abonnement LIMIT 1;");
$prepare_ajout=$Bd->prepare("INSERT INTO abonnements_hub (id_hub,id_abonnement) VALUES (:id_hub,:id_abonnement);");
$hier=time()-3600*24;
foreach($hubs as $hub_info)
{
$test_doublon=$prepare_doublon->execute(array(':id_hub'=>$hub_info->id_hub,':id_abonnement'=>$this->id_abonnement));
if((test_requete(__FILE__,__LINE__,$test_doublon,$prepare_doublon)===false)) return false;
$doublon=$prepare_doublon->fetch();
if(empty($doublon))
{
$ajout=$prepare_ajout->execute(array(':id_hub'=>$hub_info->id_hub,':id_abonnement'=>$this->id_abonnement));
if((test_requete(__FILE__,__LINE__,$ajout,$prepare_ajout)===false)) return false;
// si certains flux importés dans ce hub n'ont jamais été lus (ou depuis + de 24H), je lance leur importation
$flux_hub=$hub_info->get_flux();
if(!empty($flux_hub))
{
foreach($flux_hub as $flux_id)
{
$flux_test=FclFlux_flux::recherche($flux_id["id_flux"],"id_flux","id_flux,time_lecture,url");
if(!empty($flux_test))
{
if($flux_test["time_lecture"]<$hier)
{
$flux_test["limites"]["url_long_max"]=FLUX_MAX_URL;
$flux_lecture=new FclFlux_flux($flux_test);
$flux_lecture->import_liens();
unset($flux_lecture);
}
}
unset($flux_test);
}
$hub_info->get_liste_posts(true);
}
unset($flux_hub);
}
}
$prepare_doublon=null;
$prepare_ajout=null;
$this->get_infos(true);
return true;
}
/**
* Méthode supprimant un ou +sieurs hubs à un abonnement
*
* @param tableau contenant ou +sieurs objets FclFlux_hub à supprimer à un abonnement
* @return booléen suivant succès
* @author Fabrice PENHOËT
**/
public function supprime_hubs($hubs)
{
global $Bd;
if((isset_connexion(__FILE__,__LINE__)===false)) return false;
if((empty($this->id_abonnement))||(empty($hubs)))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT));
return false;
}
if(!is_array($hubs))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_FORMAT));
return false;
}
$hubs_suppr="";$i=0;
foreach($hubs as $hub_info)
{
if(!($hub_info instanceof FclFlux_hub))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_FORMAT));
return false;
}
if(empty($hub_info->id_hub))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_FORMAT));
return false;
}
if($i==0)
$hubs_suppr=intval($hub_info->id_hub);
else
$hubs_suppr.=",".intval($hub_info->id_hub);
$i++;
}
$prepare_suppr=$Bd->prepare("DELETE FROM abonnements_hub WHERE id_hub in ($hubs_suppr) AND id_abonnement=:id_abonnement;");
$suppr=$prepare_suppr->execute(array(':id_abonnement'=>$this->id_abonnement));
if((test_requete(__FILE__,__LINE__,$suppr,$prepare_suppr)===false)) return false;
$nb_enreg=$prepare_suppr->rowCount();
$prepare_suppr=null;
if($nb_enreg==0)
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_SUPPR." >> ".intval($this->id_abonnement).",".htmlentities($hubs_suppr,ENT_QUOTES)));
return false;
}
$this->get_infos(true);
return true;
}
/**
* Méthode supprimant l'enregistrement d'un abonnement
* seul son propriétaire doit pouvoir faire cette opération
*
* @param null
* @return booléen suivant succès
* @author Fabrice PENHOËT
**/
public function supprime()
{
global $Bd;
if((isset_connexion(__FILE__,__LINE__)===false)) return false;
if((empty($this->id_abonnement))||(empty($this->proprietaire)))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT." >> ".intval($this->id_abonnement)));
return false;
}
$prepare=$Bd->prepare("DELETE FROM abonnements WHERE id_abonnement=:id AND auteur_id=:id_utilisateur LIMIT 1;");
$suppr=$prepare->execute(array(':id'=>$this->id_abonnement,':id_utilisateur'=>$this->proprietaire->id_utilisateur));
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_abonnement).",".intval($this->proprietaire->id_utilisateur)));
return false;
}
$this->get_liste(true,"id_abonnement");//regénère la liste des abos de l'utilisateur.
$fichier=$this->id_abonnement.".txt";
$chemin=CACHE_REP."/".CACHE_REP_ABO."/".$fichier[0]."/".$fichier;
if((file_exists($chemin))&&(!unlink($chemin)))
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_FICHIER_SUPPR." >> ".htmlentities($chemin,ENT_QUOTES)));
return true;
}
/**
* Méthode créant un nouvel abonnement pour un utilisateur connecté
* avec les hubs de référence d'une rubrique
*
* @param la rubrique et l'utilisateur concernés
* @return booléen suivant succès
* @author Fabrice PENHOËT
**/
public function abo_rapide_rubrique($user,$rubrique)
{
global $Bd;
if((isset_connexion(__FILE__,__LINE__)===false)) return false;
if((!($user instanceof FclFlux_utilisateur))||(!($rubrique instanceof FclFlux_rubrique)))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_FORMAT));
return false;
}
if((empty($user->id_utilisateur))||(empty($rubrique->id_rubrique)))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_FORMAT));
return false;
}
$user_info=FclFlux_utilisateur::recherche($user->id_utilisateur,"id_utilisateur","id_utilisateur");
if(empty($user_info))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_ENREG_ABSENT." >> ".intval($user->id_utilisateur)));
return false;
}
$rubrique_info=FclFlux_rubrique::recherche($rubrique->id_rubrique,"nom");
if(empty($rubrique_info["nom"]))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_ENREG_ABSENT." >> ".intval($rubrique->id_rubrique)));
return false;
}
//hubs de référence pour cette rubrique ???
$hubs_reference=$rubrique->get_liste_hubs(false,true);
if(empty($hubs_reference))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_ENREG_ABSENT." >> ".intval($rubrique->id_rubrique)));
return false;
}
//variation du créneau d'envoi par défaut
$heures=array("08","09","10","12");//remette 07 et 11 quand mieux lissé...
$heure=array_rand($heures,1);
global $Abo_max_liens;
$prepare=$Bd->prepare("INSERT INTO abonnements (designation,auteur_id,heure_alerte,max_liens,time_crea,time_maj) VALUES (:designation,:auteur_id,:creneau,:max_liens,:date_actuelle,:date_actuelle)");
$ajout=$prepare->execute(array(':designation'=>$rubrique_info["nom"],':creneau'=>$heures[$heure],':auteur_id'=>$user->id_utilisateur,':max_liens'=>$Abo_max_liens["medium"],':date_actuelle'=>time()));
if((test_requete(__FILE__,__LINE__,$ajout,$prepare)===false)) return false;
$prepare=null;
$id=$Bd->lastInsertId();
if(empty($id))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_AJOUT));
return false;
}
$prepare_ajout=$Bd->prepare("INSERT INTO abonnements_hub (id_hub,id_abonnement) VALUES (:id_hub,:id_abonnement);");
$hier=time()-24*3600;
foreach($hubs_reference as $hub_info)
{
$ajout=$prepare_ajout->execute(array(':id_hub'=>$hub_info["id_hub"],':id_abonnement'=>$id));
if((test_requete(__FILE__,__LINE__,$ajout,$prepare_ajout)===false)) return false;
}
$prepare_ajout=null;
$this->id_abonnement=$id;
$this->proprietaire=$user;
$this->get_infos(true);
$this->get_liste(true,"id_abonnement");
return true;
}
/**
* Méthode créant un nouvel abonnement aux actualités locales.
*
* @param l'utilisateur concerné et l'insee de la ville centrale de l'abonnement.
* @return booléen suivant succès
* @author Fabrice PENHOËT
**/
public function abo_rapide_ville($user,$insee)
{
global $Bd;
if((isset_connexion(__FILE__,__LINE__)===false)) return false;
if(empty($insee))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT." >> ".intval($user->id_utilisateur)));
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;
}
$user_info=FclFlux_utilisateur::recherche($user->id_utilisateur,"id_utilisateur","id_utilisateur");
if(empty($user_info))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_ENREG_ABSENT." >> ".intval($user->id_utilisateur)));
return false;
}
//il me faut maintenant connaître la rubrique correspondant au code insee + les 2 rubriques supérieures (département + pays sauf si il y a un regroupement de communes).
$prepare=$Bd->prepare("SELECT ville.id_rubrique as id_ville,ville.nom as nom,dep.id_rubrique as id_dep,region.id_rubrique as id_region FROM hub_rubriques as ville,hub_rubriques as dep,hub_rubriques as region WHERE ((region.id_rubrique=dep.mere_id) AND (dep.id_rubrique=ville.mere_id) AND (ville.insee=:insee)) LIMIT 1;");
$recherche=$prepare->execute(array(":insee"=>$insee));
if((test_requete(__FILE__,__LINE__,$recherche,$prepare)===false)) return false;
$id_rubriques=$prepare->fetch(PDO::FETCH_ASSOC);
if(empty($id_rubriques))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_ENREG_ABSENT." >> ".intval($insee)));
return false;
}
// hubs de référence pour ces rubriques ???
$hubs_reference=array();
$cherche_rub=new FclFlux_rubrique();
$cherche_rub->id_rubrique=$id_rubriques["id_ville"];
$hubs_reference=$cherche_rub->get_liste_hubs(false,true);
$cherche_rub->id_rubrique=$id_rubriques["id_dep"];
$hubs_reference=array_merge($hubs_reference,$cherche_rub->get_liste_hubs(false,true));
$cherche_rub->id_rubrique=$id_rubriques["id_region"];
$hubs_reference=array_merge($hubs_reference,$cherche_rub->get_liste_hubs(false,true));
unset($cherche_rub);
if(empty($hubs_reference))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_ENREG_ABSENT." >> ".intval($insee)));
return false;
}
//variation du créneau d'envoi par défaut
$heures=array("08","09","10","12");//remette 07 et 11 quand mieux lissé...
$heure=array_rand($heures,1);
global $Abo_max_liens;
if(empty($this->max_liens))
$this->max_liens=$Abo_max_liens["medium"];
$prepare=$Bd->prepare("INSERT INTO abonnements (designation,auteur_id,heure_alerte,ville_insee,max_liens,time_crea,time_maj) VALUES ('Actualités locales.',:auteur_id,:creneau,:insee,:max_liens,:date_actuelle,:date_actuelle)");
$ajout=$prepare->execute(array(':creneau'=>$heures[$heure],':insee'=>$insee,':max_liens'=>$this->max_liens,':auteur_id'=>$user->id_utilisateur,':date_actuelle'=>time()));
if((test_requete(__FILE__,__LINE__,$ajout,$prepare)===false)) return false;
$prepare=null;
$id=$Bd->lastInsertId();
if(empty($id))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_AJOUT));
return false;
}
$prepare_ajout=$Bd->prepare("INSERT INTO abonnements_hub (id_hub,id_abonnement) VALUES (:id_hub,:id_abonnement);");
$hier=time()-3600*24;
$sauve_hubs_ajout="";// le même hub peut être classé dans une ville et son département par exemple.
foreach($hubs_reference as $hub_info)
{
if(strpos($sauve_hubs_ajout,"[".$hub_info["id_hub"]."]")===false)
{
$ajout=$prepare_ajout->execute(array(':id_hub'=>$hub_info["id_hub"],':id_abonnement'=>$id));
if((test_requete(__FILE__,__LINE__,$ajout,$prepare_ajout)===false)) return false;
$sauve_hubs_ajout.="[".$hub_info["id_hub"]."]";
}
}
$prepare_ajout=null;
$this->id_abonnement=$id;
$this->get_infos(true);
$this->proprietaire=$user;
$this->get_liste(true,"id_abonnement");
return true;
}
/**
* Méthode répercutant le changement de ville principal d'un abonnement local sur les hubs auxquels il est associé.
*
* @param l'insee de la nouvelle ville et l'utilisateur abonné.
* @return booléen suivant succès
* @author Fabrice PENHOËT
**/
public function abo_rapide_nouvelle_ville($nouv_insee,$user)
{
global $Bd;
if((isset_connexion(__FILE__,__LINE__)===false)) return false;
if((empty($this->id_abonnement))||(empty($user)))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT));
return false;
}
$abonnement_infos=self::recherche($this->id_abonnement,$user,"auteur_id,ville_insee");
if(empty($abonnement_infos))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_ENREG_ABSENT." >> ".$this->id_abonnement));
return false;
}
// l'abonnement existe et appartient à cet utilisateur.
// je commence par supprimer tous les hubs concernés actuellement par cet abonnement (ancienne ville).
$prepa_suppr_hubs_abo=$Bd->prepare("DELETE FROM abonnements_hub WHERE id_abonnement=:id_abo;");
$suppr_hubs_abo=$prepa_suppr_hubs_abo->execute(array(":id_abo"=>$this->id_abonnement));
if((test_requete(__FILE__,__LINE__,$suppr_hubs_abo,$prepa_suppr_hubs_abo)===false)) return false;
// puis je vais chercher les hubs correspondant à la nouvelle ville, comme dans la méthode abo_rapide_ville().
$prepare=$Bd->prepare("SELECT ville.id_rubrique as id_ville,ville.nom as nom,dep.id_rubrique as id_dep,region.id_rubrique as id_region FROM hub_rubriques as ville,hub_rubriques as dep,hub_rubriques as region WHERE ((region.id_rubrique=dep.mere_id) AND (dep.id_rubrique=ville.mere_id) AND (ville.insee=:insee)) LIMIT 1;");
$recherche=$prepare->execute(array(":insee"=>$nouv_insee));
if((test_requete(__FILE__,__LINE__,$recherche,$prepare)===false)) return false;
$id_rubriques=$prepare->fetch(PDO::FETCH_ASSOC);
if(empty($id_rubriques))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_ENREG_ABSENT." >> ".intval($nouv_insee)));
return false;
}
// hubs de référence pour ces rubriques ???
$hubs_reference=array();
$cherche_rub=new FclFlux_rubrique();
$cherche_rub->id_rubrique=$id_rubriques["id_ville"];
$hubs_reference=$cherche_rub->get_liste_hubs(false,true);
$cherche_rub->id_rubrique=$id_rubriques["id_dep"];
$hubs_reference=array_merge($hubs_reference,$cherche_rub->get_liste_hubs(false,true));
$cherche_rub->id_rubrique=$id_rubriques["id_region"];
$hubs_reference=array_merge($hubs_reference,$cherche_rub->get_liste_hubs(false,true));
unset($cherche_rub);
if(empty($hubs_reference))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_ENREG_ABSENT." >> ".intval($nouv_insee)));
return false;
}
$prepare_ajout=$Bd->prepare("INSERT INTO abonnements_hub (id_hub,id_abonnement) VALUES (:id_hub,:id_abonnement);");
$hier=time()-3600*24;
$sauve_hubs_ajout="";// le même hub peut être classé dans une ville et son département par exemple.
foreach($hubs_reference as $hub_info)
{
if(strpos($sauve_hubs_ajout,"[".$hub_info["id_hub"]."]")===false)
{
$ajout=$prepare_ajout->execute(array(':id_hub'=>$hub_info["id_hub"],':id_abonnement'=>$this->id_abonnement));
if((test_requete(__FILE__,__LINE__,$ajout,$prepare_ajout)===false)) return false;
$sauve_hubs_ajout.="[".$hub_info["id_hub"]."]";
}
}
$prepare_ajout=null;
$this->get_infos(true);
$this->get_liste(true,"id_abonnement");
return true;
}
/**
* Méthode ouvrant le fichier cache contenant les infos d'un abonnement.
*
* @param crea_cache : un booléen pour savoir si il faut tenter la création du fichier en cas d'absence
* @return tableau contenant les infos fournies par le fichier (si trouvé), false en cas d'erreur
* @author Fabrice PENHOËT
**/
public function get_infos_cache($crea_cache=false)
{
if(empty($this->id_abonnement))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT));
return false;
}
$id=strval($this->id_abonnement);
$fichier=CACHE_REP."/".CACHE_REP_ABO."/".$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;
$this->get_infos(true);
}
else
return false;
}
if(file_exists($fichier))//la création a pu foirer
include($fichier);
else
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_FICHIER_EXISTE." >> ".$fichier));
return false;
}
if(empty($t))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_CACHE_CONTENU_ABSENT." >> ".$fichier));
return false;
}
else
{
foreach($t as $key => $value)
{
if(!is_array($value)) //cela doit être l'id d'une des hubs de l'abonnement
$infos[$key]=stripslashes($value);
else
$infos[$key]=$value;
}
}
if(empty($infos))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_CACHE_CONTENU_ABSENT." >> ".$fichier));
return false;
}
else
return $infos;
}
/**
* Méthode ouvrant le fichier cache contenant la liste des hubs d'un abonnement
*
* @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)
{
if(empty($this->id_abonnement))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT));
return false;
}
$id=strval($this->id_abonnement);
$fichier=CACHE_REP."/".CACHE_REP_ABO."/".$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->get_infos(true))
return false;
}
else
return false;
}
if(file_exists($fichier))//la création a pu foirer
include($fichier);
else
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_FICHIER_EXISTE." >> ".$fichier));
return false;
}
if(empty($t))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_CACHE_CONTENU_ABSENT." >> ".$fichier));
return false;
}
else
{
$i=0;
foreach($t as $key => $value)
{
if((is_array($value))&&(!empty($value["id_hub"])))
{
$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"];
$liste[$i]=$hub_infos;
$i++;
}
unset($hub);
}
}
}
if(empty($liste))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_CACHE_CONTENU_ABSENT." >> ".$fichier));
return false;
}
else
return $liste;
}
/**
* Méthode ouvrant le fichier cache contenant la liste des hubs d'un abonnement
* et en sortant les derniers posts pour chacun des hubs.
*
* @param crea_cache : un booléen pour savoir si il faut tester la création du fichier en cas d'absence,
* $periode de lecture des posts.
* @return tableau contenant les infos des hubs fournies par le fichier (si trouvé), false en cas d'erreur
* @author Fabrice PENHOËT
**/
public function get_liste_posts_cache($crea_cache=false,$periode="jour")
{
if(empty($this->id_abonnement))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT));
return false;
}
$id=strval($this->id_abonnement);
$fichier=CACHE_REP."/".CACHE_REP_ABO."/".$id[0]."/$id.txt";
$time_fichier=filemtime($fichier);
$infos=array();
if(!file_exists($fichier))
{
if($crea_cache)
{
if(empty($GLOBALS['Bd']))
require("connexion-bd.php");
if(empty($GLOBALS['Bd'])) return false;
$this->get_infos(true);
}
else
return false;
}
if(file_exists($fichier))
include($fichier);
else
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_FICHIER_EXISTE." >> ".$fichier));
return false;
}
if(empty($t))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_CACHE_CONTENU_ABSENT." >> ".$fichier));
return false;
}
else
{
$i=0;$max_posts=0;
foreach($t as $key => $value)
{
if((is_array($value))&&(!empty($value["id_hub"])))
{
$hub=new FclFlux_hub();
$hub->id_hub=$value["id_hub"];
$posts=$hub->get_liste_posts_cache($crea_cache,$periode);
if(!empty($posts))
{
$posts_hub[$i]=$posts;
$max_posts=max($max_posts,count($posts_hub[$i]));
$i++;
$posts=null;
}
unset($hub);
}
}
// à l'affichage je souhaite alterner des différents hubs concernés par cet abonnement.
// il faut aussi contrôler les doublons, un même lien pouvant apparaître dans +sieurs hubs d'un même abonnement.
$posts_abo=array();$cpt=0;$url_doublons=array();$url_ancres=array();
for($j=0;$j<=$max_posts;$j++)
{
for($k=0;$k<=$i;$k++)
{
if((!empty($posts_hub[$k][$j]))&&(!(in_array($posts_hub[$k][$j]["url"],$url_doublons)))&&(!(in_array($posts_hub[$k][$j]["ancre"],$url_ancres))))
{
$posts_abo[$cpt]=$posts_hub[$k][$j];
$url_doublons[]=$posts_hub[$k][$j]["url"];
$url_ancres[]=$posts_hub[$k][$j]["ancre"];
$cpt++;
}
}
}
}
if(empty($posts_abo))
return false;
else
return $posts_abo;
}
/**
* Méthode ouvrant le fichier cache contenant la liste des abonnements pour un utilisateur
*
* @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 abonnements fournies par les fichiers (si trouvés), false en cas d'erreur
* @author Fabrice PENHOËT
**/
static function get_liste_abo_cache($user,$crea_cache=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;
}
$id=strval($user->id_utilisateur);
$fichier=CACHE_REP."/".CACHE_REP_UTILISATEURS."/".$id[0]."/abo-$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;
$abo=new FclFlux_abonnement();
$abo->proprietaire=$user;
$abo->get_liste(true,"id_abonnement");
unset($abo);
}
else
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_FICHIER_EXISTE." >> ".$fichier));
return false;
}
}
if(file_exists($fichier))//il ne devait pas avoir été créé si aucun abonnement pour cet utilisateur
include($fichier);
else
return false;
if(empty($t))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_CACHE_CONTENU_ABSENT." >> ".$fichier));
// comme il ne devrait pas exister, je le supprime :
if(!unlink($fichier))
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_FICHIER_SUPPR." >> ".htmlentities($fichier,ENT_QUOTES)));
return false;
}
else
{
$i=0;
foreach($t as $key => $value)
{
if((is_array($value))&&(!empty($value["id_abonnement"])))
{
$abo=new FclFlux_abonnement();
$abo->id_abonnement=$value["id_abonnement"];
$abo_infos=$abo->get_infos_cache($crea_cache);
if(!empty($abo_infos))
{
$abo_infos["id_abonnement"]=$value["id_abonnement"];
$liste[$i]=$abo_infos;
$i++;
}
unset($abo);
}
}
}
if(empty($liste))
{
//$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_FICHIER_EXISTE." >> ".$fichier));--> normal si je n'ai aucun abonnement.
return false;
}
else
return $liste;
}
/**
* Méthode basé sur la méthode précédante mais ne retourner que les éventuels abonnements aux actualités locales en ajoutant le nom de la ville.
*
* @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 abonnements fournies par les fichiers (si trouvés), false en cas d'erreur
* @author Fabrice PENHOËT
**/
static function get_liste_abo_ville_cache($user,$crea_cache=false)
{
$abos=self::get_liste_abo_cache($user,$crea_cache);
if(empty($abos))
return false;
if(empty($GLOBALS['Bd']))
require("connexion-bd.php");
if(empty($GLOBALS['Bd'])) return false;
foreach($abos as $abo_infos)
{
if(!empty($abo_infos["ville_insee"]))
{
$ville_infos=get_villes($abo_infos["ville_insee"],"insee");
if(!empty($ville_infos))
{
$abo_infos["ville_infos"]=$ville_infos;
$abos_ville[]=$abo_infos;
}
}
}
if(!empty($abos_ville))
return $abos_ville;
else
return null;
}
/**
* Méthode cherchant les stats globales concernant les abonnements
*
* @return les données dans un tableau php, false en cas d'erreur
* @author Fabrice PENHOËT
**/
static function get_stats_globales()
{
global $Bd;
if((isset_connexion(__FILE__,__LINE__)===false)) return false;
$stats=array();
//nbre d'abonnements total
$recherche=$Bd->query("SELECT id_abonnement FROM abonnements;");
if((test_requete(__FILE__,__LINE__,$recherche)===false)) return false;
$resultats=$recherche->fetchAll();
$stats["nb_abo_total"]=count($resultats);
//nbre d'abonnements par mail
$recherche=$Bd->query("SELECT id_abonnement FROM abonnements WHERE jours_alerte!='';");
if((test_requete(__FILE__,__LINE__,$recherche)===false)) return false;
$resultats=$recherche->fetchAll();
$stats["nb_abo_email"]=count($resultats);
//nbre d'abonnés total
$recherche=$Bd->query("SELECT DISTINCT auteur_id FROM abonnements;");
if((test_requete(__FILE__,__LINE__,$recherche)===false)) return false;
$resultats=$recherche->fetchAll();
$stats["nb_abonnes"]=count($resultats);
//nbre d'abonnés par email
$recherche=$Bd->query("SELECT DISTINCT auteur_id FROM abonnements WHERE jours_alerte!='';");
if((test_requete(__FILE__,__LINE__,$recherche)===false)) return false;
$resultats=$recherche->fetchAll();
$stats["nb_abonnes_email"]=count($resultats);
unset($recherche);unset($resultats);
return $stats;
}
/**
* Méthode statique envoyant les emails relatifs aux abonnements
*
* @param $email_max nbre maximum d'emails générés par appel.
* @return booléen suivant succès
* @author Fabrice PENHOËT
**/
static function envoi_mailing($email_max="200")
{
global $Bd;
if((isset_connexion(__FILE__,__LINE__)===false)) return false;
global $Abo_max_liens;
if((empty($email_max))||(empty($Abo_max_liens["medium"])))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT));
return false;
}
$fuseau_defaut=date_default_timezone_get();
$date_reference=new DateTime('now',new DateTimeZone($fuseau_defaut));
$jour_S=$date_reference->format("w");
$heure=$date_reference->format("H");
$hier=time()-12*3600;// une marge de 12 heures doit suffir car l'abonnement n'est envoyé au + qu'une fois par jour.
// transformation de l'heure serveur en heure locale de l'utilisateur
$heure_locale="(IF((($heure+decalage_horaire)<0),($heure+decalage_horaire+24),IF((($heure+decalage_horaire)>23),($heure+decalage_horaire-24),($heure+decalage_horaire))))";
// on peut aussi être un "autre jour" suivant le décalage et l'heure d'alerte souhaitée
$jour_local1="(IF((($heure+decalage_horaire)<0),($jour_S-1),IF((($heure+decalage_horaire)>24),($jour_S+1),$jour_S)))";
// les jours en version numérique vont de 0 (dimanche) à 6 (samedi)
$jour_local="(IF($jour_local1>6,0,IF($jour_local1<0,6,$jour_local1)))";
// y'a pu qu'à envoyer le bouzin...
$get_mailing=$Bd->query("SELECT id_abonnement,time_envoi,$heure_locale as heure_locale,heure_alerte,$jour_local as jour_local,jours_alerte,decalage_horaire,max_liens FROM abonnements WHERE ((time_envoi<$hier) AND (actif_ok=1)) HAVING ((LOCATE(jour_local,jours_alerte)!=0) AND (heure_locale>=heure_alerte) AND (heure_locale<(heure_alerte+1))) LIMIT 0,$email_max");
//$get_mailing=$Bd->query("SELECT id_abonnement,time_envoi,$heure_locale as heure_locale,heure_alerte,$jour_local as jour_local,jours_alerte,decalage_horaire,max_liens FROM abonnements WHERE actif_ok=1 HAVING ((LOCATE(jour_local,jours_alerte)!=0)) LIMIT 0,3");
if((test_requete(__FILE__,__LINE__,$get_mailing)===false))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_RECHERCHE));
return false;
}
$resultats=$get_mailing->fetchAll(PDO::FETCH_ASSOC);
$get_mailing=null;
$nb_envoi=0;
if(!empty($resultats))
{
// echo count($resultats)." abonnements à traiter.";
/* annonces promotionnelles en cours de diffusion ?
require_once("FclFlux_annonces.php");
$annonces=FclFlux_annonce::get_liste_annonces_encours();
if(!empty($annonces))
$prepare_diffusion_annonce=$Bd->prepare("INSERT INTO annonces_diffusions (annonce_id,utilisateur_id,time_envoi) VALUES (:id,:utilisateur,:time);");*/
$prepare_maj_abo=$Bd->prepare("UPDATE abonnements SET time_envoi=:time WHERE id_abonnement=:id;");
$prepare_ajout_mailing=$Bd->prepare("INSERT INTO abonnements_mail (abonnement_id,utilisateur_id,time_envoi,succes,cle) VALUES (:id,:utilisateur,:time,:succes,:cle);");
$prepare_dernier_affichage=$Bd->prepare("SELECT time_affichage FROM utilisateurs_affichages WHERE page=:page ORDER BY time_affichage DESC LIMIT 0,1;");
global $Jours_semaine;
foreach($resultats as $abo_id)
{
$abo=new FclFlux_abonnement();
$abo->id_abonnement=$abo_id["id_abonnement"];
$abo->max_liens=$abo_id["max_liens"];
//je souhaite envoyer à l'utilisateur les liens importés depuis la date du dernier envoi ou du dernier affichage de cet abonnement
$abo->time_envoi=$abo_id["time_envoi"];
$page_abo_affiche=str_replace(SITE_URL,"",PAGE_ABO_AFFICHE).$abo_id["id_abonnement"];
$dernier_affichage=$prepare_dernier_affichage->execute(array(':page'=>$page_abo_affiche));
if((test_requete(__FILE__,__LINE__,$dernier_affichage,$prepare_dernier_affichage)===false))
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_RECHERCHE." >> ".intval($abo_id["id_abonnement"])));
else
{
$page=$prepare_dernier_affichage->fetchAll(PDO::FETCH_ASSOC);
if((!empty($page))&&($page[0]["time_affichage"]>$abo->time_envoi))
$abo->time_envoi=$page[0]["time_affichage"];
}
// le jour de la semaine et la date peuvent être différents si il y a un décalage horaire important
$date_actuelle=date("d/m/Y");
$jour_num=date("w");
if($abo_id["jour_local"]!=$jour_num)
{
$jour_num=$abo_id["jour_local"];
if($abo_id["decalage_horaire"]>0)//on est demain :-)
$date_actuelle=date("d/m/Y",(time()+86400));
else//et là on est hier...
$date_actuelle=date("d/m/Y",(time()-86400));
}
$jour_nom=$Jours_semaine[$jour_num];
$abo_infos=$abo->get_infos_cache(true);
/*annonces promotionnelles à diffuser pour cet abonnement ?
$annonces_abo=array();
if(!empty($annonces))
{
foreach($annonces as $annonce_infos)
{
if(empty($annonce_infos["hubs"]))//annonce à diffuser à tout le monde
$annonces_abo[]=$annonce_infos;
else
{//je boucle dans $abos_info pour trouver un des id_hub concernés par l'annonce
foreach($abo_infos as $key => $value)
{
if(is_array($value))//cela doit être l'id d'un des hubs de l'abonnement
{
$id_hub=$value["id_hub"];
if(strpos($annonce_infos["hubs"],"[$id_hub]"))
{
$annonces_abo[]=$annonce_infos;
break(1);//pour éviter les doublons et de boucler inutilement
}
}
}
}
}
}*/
if(empty($abo_infos["auteur_id"]))//je continue tout de même à boucler pour ne pas bloquer les autres
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT." >> ".intval($abo_id["id_abonnement"])));
else
{
$destinataire=new FclFlux_utilisateur();
$destinataire->id_utilisateur=$abo_infos["auteur_id"];
$destinataire_infos=$destinataire->get_infos_cache(false);
if(!empty($destinataire_infos["time_validation"]))//l'utilisateur doit avoir validé son compte pour recevoir quelque chose.
{
if(empty($destinataire_infos["email"]))//c'est tellement impossible que cela va arriver ? oui... c'est arrivé ! :-)
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT." >> ".intval($abo_infos["auteur_id"])));
else
$liens=$abo->get_liste_posts_cache(false,"semaine");// je ne peux me limiter aux liens des dernières 24H, l'utilisateur pouvant choisir de recevoir son abonnement une seule fois / semaine
if(!empty($liens))
{
echo "Il y a ".count($liens)." liens pour ".$destinataire_infos["email"]."<br>";
$time_message=time();
$cle_message=crea_passe();
$Mail_expediteur_email=EMAIL_MAILINGS;
$Mail_expediteur_nom=SITE_NOM;
$Mail_destinataire_email=$destinataire_infos["email"];
//$Mail_destinataire_email="divers@ecrivez-moi.com";
$Mail_destinataire_nom=stripslashes($destinataire_infos["pseudo"]);
$Mail_sujet="[".SITE_NOM."] ".stripslashes($abo_infos["designation"]);
// message alternatif lorsque le html n'est pas lu :
$Mail_boby_txt="Hello ".stripslashes($destinataire_infos["pseudo"])." !\n\nLe facteur est passé :-)\nVoici les nouvelles pour le $jour_nom $date_actuelle.\n\nPour voir les nouvelles sur Hello facteur : ".PAGE_ABO_AFFICHE.$abo->id_abonnement."/$time_message/$cle_message/\n\n";
//-- version html :
//texte invisible (sauf certains webmail ?) :
$Mail_html_sujet="Voici les dernières nouvelles pour votre abonnement : ".htmlentities(stripslashes($abo_infos["designation"])).".";
//entête avant logo :
$Mail_html_header="<p>Pour modifier ou supprimer votre abonnement <a href='".PAGE_ABO_MAJ.$abo->id_abonnement."/$time_message/$cle_message/'>cliquez-ci</a>.</p>";
//permet de compter les affichages (revoir : url directe !)
$Mail_html_url_logo=PAGE_AFFICHE_LOGO.$abo->id_abonnement."_".time().".jpg";
//texte d'introduction du message, hors liste de liens :
$Mail_html_intro="<p>Hello ".htmlentities(stripslashes($destinataire_infos["pseudo"])).",<br/><br/>Le facteur est passé :-)<br/>Voici les nouvelles pour le $jour_nom $date_actuelle.</p>";
$nb_item=0;
//d'abord les annonces d'entête
/*if(!empty($annonces_abo))
{
foreach($annonces_abo as $annonce_infos)
{
if($annonce_infos["emplacement"]=="header")
{
$lien_clic=PAGE_CLIC_LIEN."a/".$annonce_infos["id_annonce"]."/".intval($destinataire->id_utilisateur)."/".$annonce_infos["time_crea"];
$Mail_html_items[$nb_item]="<p><FclFlux_annonce_h>".$annonce_infos["annonce"]." <a href='$lien_clic'>".strtoupper($annonce_infos["lien_ancre"])."</a>.</FclFlux_annonce_h></p>";
$Mail_boby_txt.="** ".$annonce_infos["annonce"]." **\nLien : $lien_clic\n\n";
$nb_item++;
}
}
}*/
//liste de liens pour cet abonnement
// si l'utilisateur a choisi un nombre de liens / message, je remplace la valeur par défaut:
if(!empty($abo->max_liens))
$max_liens=$abo->max_liens;
else
$max_liens=$Abo_max_liens["medium"];
$i=0;$j=0;$manque=0;
while(isset($liens[$i]))
{
$time_compare=$liens[$i]["time_validation"];
if(!empty($liens[$i]["time_diffusion"]))
$time_compare=$liens[$i]["time_diffusion"];
if(($j<$max_liens)&&($time_compare>$abo->time_envoi))
{
$lien_clic=PAGE_CLIC_LIEN.$abo->id_abonnement."/".$liens[$i]["id_post"]."/".intval($destinataire->id_utilisateur);
// l'annonce a pu être importée d'un flux ou postée par un utilisateur -> mais c'est le nom du hub que j'affiche !
if((!empty($liens[$i]["flux"]))&&(!empty($liens[$i]["flux"]["source"])))// parfois je n'ai pas la source mais pourquoi ?
$Mail_html_items[$nb_item]="<p>[".stripslashes($liens[$i]["flux"]["source"]["nom"])."] ";
elseif(!empty($liens[$i]["hub"]))
$Mail_html_items[$nb_item]="<p>[".stripslashes($liens[$i]["hub"]["nom"])."] ";
elseif(!empty($liens[$i]["auteur"]))// dans quel cas, je rencontre cette situation ?
$Mail_html_items[$nb_item]="<p>[".htmlspecialchars_decode(stripslashes($liens[$i]["auteur"]["pseudo"]))."] ";
$Mail_html_items[$nb_item].=htmlspecialchars_decode(stripslashes($liens[$i]["ancre"]))." <a href='$lien_clic' title=\"Publié dans : ".stripslashes($liens[$i]["hub"]["nom"])."\">+ LIRE</a>.</p>";
$Mail_boby_txt.=htmlspecialchars_decode(stripslashes($liens[$i]["ancre"]))."\nLien : $lien_clic\n\n";
$j++;$nb_item++;
}
elseif($time_compare>$abo->time_envoi)
$manque++;
$i++;
}
//. . . . . . . . . . . . . . . . ..
/*puis les annonces en footer
if(!empty($annonces_abo))
{
foreach($annonces_abo as $annonce_infos)
{
if($annonce_infos["emplacement"]=="footer")
{
$lien_clic=PAGE_CLIC_LIEN."a/".$annonce_infos["id_annonce"]."/".intval($destinataire->id_utilisateur)."/".$annonce_infos["time_crea"];
$Mail_html_items[$nb_item]="<p><FclFlux_annonce_b>".$annonce_infos["annonce"]." <a href='$lien_clic'>".strtoupper($annonce_infos["lien_ancre"])."</a>.</FclFlux_annonce_b></p>";
$Mail_boby_txt.="** ".$annonce_infos["annonce"]." **\nLien : $lien_clic\n\n";
$nb_item++;
}
}
}*/
if($j!=0)//pas de lien, pas de chocolat :-)
{
$Mail_html_complement="";
if(!empty($manque))//un seul lien vous manque et tout est...
$Mail_html_complement="<p>Au moins $manque autres actualités vous attendent sur <a href='".PAGE_ABO_AFFICHE.$abo->id_abonnement."/$time_message/$cle_message/' title=\"Voir la version web (+ de liens)\">Hello facteur</a>. Vous pouvez aussi <a href='".PAGE_ABO_MAJ.$abo->id_abonnement."/$time_message/$cle_message/#max_liens'>augmenter le nombre maximum d'actualités envoyées</a> pour cet abonnement.</p>";
//liens sous forme de grands boutons. L'ancre ne doit donc pas être trop longue :
$Mail_html_liens_action[0]="<a href='".PAGE_ABO_AFFICHE.$abo->id_abonnement."/$time_message/$cle_message/' title=\"Voir la version web (+ de liens)\">Voir sur Hello facteur.</a>";
$Mail_html_liens_action[1]="<a href='".PAGE_ABO_MAJ.$abo->id_abonnement."/$time_message/$cle_message/' title=\"Modifier ou supprimer votre abonnement\">Modifier mon abonnement.</a>";
$Mail_boby_txt.="Pour modifier ou supprimer votre abonnement :\n".PAGE_ABO_MAJ.$abo->id_abonnement."/$time_message/$cle_message/\n\n";
//footer du mail html :
$Mail_html_footer="<p>Vous recevez ce message parce que vous vous êtes abonné(e) au site <strong>".SITE_NOM."</strong> avec comme adresse ".$destinataire_infos["email"]." | <a href='".SITE_URL."/blog/faq.html' title='F.A.Q.'>Aide</a> | <a href='".PAGE_ABO_MAJ.$abo->id_abonnement."/$time_message/$cle_message/' title=\"Modifier ou supprimer votre abonnement\">Supprimer mon abonnement</a> | <a href='".PAGE_ABSENCES_LISTE."' title=\"Période d'absences\">Stopper temporairement les envois</a>.</p>";
$Mail_boby_html="";
ob_start();
include(BASE_REP."../www/".TEMPLATE_REP."/mail/defaut.php");
$Mail_boby_html=ob_get_contents();
ob_end_clean();
require(BASE_REP."../divers/phpmailer-initialise.php");
require(BASE_REP."../divers/phpmailer-envoi.php");
$succes=0;
if(!$mail->Send())
{
unset($mail);
sleep(2);
require(BASE_REP."../divers/phpmailer-initialise.php");//réinitialise et annule l'envoi précédent
require(BASE_REP."../divers/phpmailer-envoi.php");
if(!$mail->Send())
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,"bug envoi mail :".$mail->ErrorInfo.">>".intval($abo->id_abonnement)));
else
{
$nb_envoi++;
$succes=1;
}
}
else
{
$nb_envoi++;
$succes=1;
}
//j'enregistre la tentative d'envoi d'email
$ajout=$prepare_ajout_mailing->execute(array(':id'=>$abo->id_abonnement,':utilisateur'=>$abo_infos["auteur_id"],':time'=>$time_message,':succes'=>$succes,':cle'=>$cle_message));
if((test_requete(__FILE__,__LINE__,$ajout,$prepare_ajout_mailing)===false))
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_AJOUT.">>".intval($abo->id_abonnement)."/".intval($abo_infos["auteur_id"])."/$time_message/$succes/$cle_message"));
/*+ les diffusions d'annonces si c'est le cas
if(($succes)&&(!empty($annonces_abo)))
{
foreach($annonces_abo as $annonce_infos)
{
$ajout_diffusion=$prepare_diffusion_annonce->execute(array(':id'=>intval($annonce_infos["id_annonce"]),':utilisateur'=>$abo_infos["auteur_id"],':time'=>$time_message));
if((test_requete(__FILE__,__LINE__,$ajout_diffusion,$prepare_diffusion_annonce)===false))
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_MAJ.">>".intval($annonce_infos["id_annonce"])));
unset($ajout_diffusion);
}
}*/
}
unset($Mail_html_items);//sinon je mélange les liens...
unset($Mail_html_complement);
unset($mail);// nécessaire de réinitailiser cette variable
unset($succes);
}
unset($liens);
if((!isset($succes))||($succes==1))
{
//liens trouvés ou pas, cet abonnement a été traité...
$maj=$prepare_maj_abo->execute(array(':time'=>time(),':id'=>$abo->id_abonnement));
if((test_requete(__FILE__,__LINE__,$maj,$prepare_maj_abo)===false))
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_MAJ.">>".intval($abo->id_abonnement)));
}
}
unset($destinataire);unset($destinataire_infos);
}
unset($abo);unset($abo_infos);unset($liens);
}
}
return $nb_envoi;
}
/**
* Méthode actualisant les décalages horaires à prendre en compte pour l'envoi des abonnements
* suivant le fuseau horaire de l'utilisateur
*
* @return booléen suivant succès
* @author Fabrice PENHOËT
**/
static function actualise_decalages_horaires()
{
global $Bd;
if((isset_connexion(__FILE__,__LINE__)===false)) return false;
$fuseau_defaut=date_default_timezone_get();
$get_utilisateurs=$Bd->query("SELECT DISTINCT U.id_utilisateur,U.fuseau_horaire FROM utilisateurs AS U,abonnements AS A WHERE ((U.id_utilisateur=A.auteur_id) AND (U.fuseau_horaire!='$fuseau_defaut') AND (U.fuseau_horaire!='') AND (A.jours_alerte!='')) order by U.fuseau_horaire desc");
if((test_requete(__FILE__,__LINE__,$get_utilisateurs)===false))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_RECHERCHE));
return false;
}
$utilisateurs=$get_utilisateurs->fetchAll(PDO::FETCH_ASSOC);
unset($get_utilisateurs);
if(!empty($utilisateurs))
{
$prepare_decalage=$Bd->prepare("UPDATE abonnements SET decalage_horaire=:decalage WHERE auteur_id=:id;");
$date_reference=new DateTime('now',new DateTimeZone($fuseau_defaut));
$decalage_reference=$date_reference->format("Z")/3600;
foreach($utilisateurs as $user)
{
$date_ailleurs=new DateTime('now',new DateTimeZone($user["fuseau_horaire"]));
$decalage_ailleurs=$date_ailleurs->format("Z")/3600;
$difference=round($decalage_ailleurs-$decalage_reference);
$set_decalage=$prepare_decalage->execute(array(":decalage"=>$difference,":id"=>$user["id_utilisateur"]));
if((test_requete(__FILE__,__LINE__,$set_decalage,$prepare_decalage)===false))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_MAJ." >> ".$user["id_utilisateur"]));
return false;
}
}
unset($prepare_decalage);
}
//à l'inverse, si un utilisateur est revenu au fuseau horaire par défaut, il faut supprimer le décalage de ses abonnements.
$relocalise=$Bd->query("UPDATE abonnements SET decalage_horaire=0 WHERE ((decalage_horaire!=0) AND (auteur_id NOT IN (SELECT id_utilisateur FROM utilisateurs WHERE fuseau_horaire!='$fuseau_defaut')))");
if((test_requete(__FILE__,__LINE__,$relocalise)===false))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_MAJ));
return false;
}
unset($relocalise);
return true;
}
/**
* Méthode désactivant/activant les abonnements
* suivant les périodes de vacance enregistrées pour l'utilisateur.
*
* @return booléen suivant succès
* @author Fabrice PENHOËT
**/
static function actualise_absences()
{
global $Bd;
if((isset_connexion(__FILE__,__LINE__)===false)) return false;
//détermination de l'heure locale pour les comparaisons
$fuseau_defaut=date_default_timezone_get();
$date_reference=new DateTime('now',new DateTimeZone($fuseau_defaut));
$timestamp_local=$date_reference->getTimestamp();
$cherche_abos_retour=$Bd->query("SELECT Abs.id_periode,Abo.id_abonnement FROM abonnements AS Abo,utilisateurs_absences AS Abs,abonnements_pauses as Pause WHERE ((Abo.id_abonnement=Pause.abonnement_id) AND (Pause.periode_id=Abs.id_periode) AND (Abs.time_fin<($timestamp_local+3600*Abo.decalage_horaire)));");
if((test_requete(__FILE__,__LINE__,$cherche_abos_retour)===false))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_RECHERCHE));
return false;
}
$abos=$cherche_abos_retour->fetchAll(PDO::FETCH_ASSOC);
unset($cherche_abos_retour);
if(!empty($abos))
{
$prepare_reactive=$Bd->prepare("UPDATE abonnements SET actif_ok=1 WHERE id_abonnement=:id;");
$periodes_obsoletes=array();
foreach($abos as $abo)
{
$reactive=$prepare_reactive->execute(array(":id"=>$abo["id_abonnement"]));
if((test_requete(__FILE__,__LINE__,$reactive,$prepare_reactive)===false))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_MAJ." >> ".$abo["id_abonnement"]));
return false;
}
$periodes_obsoletes[]=$abo["id_periode"];
}
unset($prepare_reactive);
if(!empty($periodes_obsoletes))
{
$periodes_suppr=implode(",",$periodes_obsoletes);
$suppr=$Bd->query("DELETE FROM utilisateurs_absences WHERE id_periode IN($periodes_suppr);");
if((test_requete(__FILE__,__LINE__,$suppr)===false))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_SUPPR));
return false;
}
unset($suppr);
}
}
//ensuite je désactive les abonnements correspondant à une période d'absence qui vient de débuter
$cherche_abos_depart=$Bd->query("SELECT DISTINCT Abo.id_abonnement FROM abonnements AS Abo,utilisateurs_absences AS Abs,abonnements_pauses as Pause WHERE ((Abo.id_abonnement=Pause.abonnement_id) AND (Pause.periode_id=Abs.id_periode) AND (Abs.time_debut<=($timestamp_local+3600*decalage_horaire)) AND (Abo.actif_ok=1));");
if((test_requete(__FILE__,__LINE__,$cherche_abos_depart)===false))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_RECHERCHE));
return false;
}
$abos=$cherche_abos_depart->fetchAll(PDO::FETCH_ASSOC);
unset($cherche_abos_depart);
if(!empty($abos))
{
$prepare_desactive=$Bd->prepare("UPDATE abonnements SET actif_ok=0 WHERE id_abonnement=:id;");
foreach($abos as $abo)
{
$desactive=$prepare_desactive->execute(array(":id"=>$abo["id_abonnement"]));
if((test_requete(__FILE__,__LINE__,$desactive,$prepare_desactive)===false))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_MAJ." >> ".$abo["id_abonnement"]));
return false;
}
}
unset($prepare_desactive);
}
return true;
}
/**
* Méthode supprimant les abonnements n'ayant plus aucun hub
*
* @return booléen suivant succès
* @author Fabrice PENHOËT
**/
static function nettoye_abonnements_sans_hub()
{
global $Bd;
if((isset_connexion(__FILE__,__LINE__)===false)) return false;
$recherche_abo=$Bd->query("SELECT id_abonnement,auteur_id FROM abonnements WHERE id_abonnement NOT IN (SELECT DISTINCT id_abonnement FROM abonnements_hub);");
if((test_requete(__FILE__,__LINE__,$recherche_abo)===false))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_RECHERCHE));
return false;
}
$abos_suppr=$recherche_abo->fetchAll(PDO::FETCH_ASSOC);
unset($recherche_abo);
if(!empty($abos_suppr))
{
foreach($abos_suppr as $abo)
{
$proprietaire=new FclFlux_utilisateur();
$proprietaire->id_utilisateur=$abo["auteur_id"];
$abo["proprietaire"]=$proprietaire;//pour passer la protection lors de la suppression
$abonnement=new FclFlux_abonnement($abo);
$abonnement->supprime();
unset($proprietaire);
unset($abonnement);
}
}
return true;
}
/**
* Méthode traitant les abonnements inactifs
*
* @return nombre d'abonnements désactivés, false en cas d'erreur
* @author Fabrice PENHOËT
**/
static function desactivation()
{
global $Bd;
global $hub_site;//infos de l'abonnement par défaut si il existe
if((isset_connexion(__FILE__,__LINE__)===false)) return false;
// recherche des abonnements ayant été envoyés + de X fois.
$cherche_abos=$Bd->query("SELECT DISTINCT abonnement_id,count(abonnement_id) AS nb_envois FROM abonnements_mail GROUP BY abonnement_id HAVING nb_envois>=".ABO_MAX_ENVOIS_PASSIFS.";");
if((test_requete(__FILE__,__LINE__,$cherche_abos)===false))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_RECHERCHE));
return false;
}
// recherche de la date du X ième envoi le + ancien pour chacun de ces abonnement.
$cherche_date_abo=$Bd->prepare("SELECT time_envoi FROM abonnements_mail WHERE abonnement_id=:id ORDER BY time_envoi DESC LIMIT 0,".ABO_MAX_ENVOIS_PASSIFS);
// recherche si des clics (site ou email) ont été enregistrés pour chacun de ces abonnement durant ses X derniers envois.
$cherche_clics_abo=$Bd->prepare("SELECT id_clic FROM stat_clics_posts WHERE abonnement_id=:id AND time_clic>:time;");
// désactivation des abonnements pour lesquels aucune action n'a été trouvée durant cette période
$desactivation=$Bd->prepare("UPDATE abonnements SET jours_alerte='' WHERE id_abonnement=:id AND jours_alerte!='';");
// on supprimme tous les envois enregistrés pour les abonnements désactivés.
$suppr_envois_tous=$Bd->prepare("DELETE FROM abonnements_mail WHERE abonnement_id=:id;");
// on supprime aussi les envois les + anciens, pour les abonnements toujours actifs.
$suppr_envois_anciens=$Bd->prepare("DELETE FROM abonnements_mail WHERE abonnement_id=:id AND time_envoi<:time;");
// ainsi que les clics pour cet abonnement trop ancien pour servir à désactiver cet abonnement ou celui par défaut
$suppr_clics_anciens=$Bd->prepare("DELETE FROM stat_clics_posts WHERE abonnement_id=:id AND time_clic<:time;");
$time_suppr_abo_defaut=time();
if(!empty($hub_site["duree_max"]))
{
$time_suppr_abo_defaut=$time_suppr_abo_defaut-$hub_site["duree_max"]*24*3600;
}
$abos=$cherche_abos->fetchAll();
$nb_abo=0;$nb_desactive=0;$nb_suppr_anciens=0;
foreach ($abos as $infos)
{
$date_abo=$cherche_date_abo->execute(array(":id"=>$infos["abonnement_id"]));
if((test_requete(__FILE__,__LINE__,$date_abo,$cherche_date_abo)===false))
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_RECHERCHE." >> ".intval($infos["abonnement_id"])));
else
{
$dates_info=$cherche_date_abo->fetchAll(PDO::FETCH_ASSOC);
$nb_dates=ABO_MAX_ENVOIS_PASSIFS-1;//puisque tableau commence à 0
$date_limite=$dates_info[$nb_dates]["time_envoi"];
if(!empty($date_limite))
{
$nb_abo++;
$get_clics=$cherche_clics_abo->execute(array(":id"=>$infos["abonnement_id"],":time"=>$date_limite));
if((test_requete(__FILE__,__LINE__,$get_clics,$cherche_clics_abo)===false))
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_RECHERCHE." >> ".intval($infos["abonnement_id"]).",".$date_limite));
else
{
$clics=$cherche_clics_abo->fetchAll();
if(empty($clics))
{
$desactive=$desactivation->execute(array(":id"=>$infos["abonnement_id"]));
if((test_requete(__FILE__,__LINE__,$desactive,$desactivation)===false))
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_MAJ." >> ".intval($infos["abonnement_id"])));
else
{
$nb_desactive++;
//je supprime tous les envois de cet abonnement
$suppr=$suppr_envois_tous->execute(array(":id"=>$infos["abonnement_id"]));
if((test_requete(__FILE__,__LINE__,$suppr,$suppr_envois_tous)===false))
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_SUPPR." >> ".intval($infos["abonnement_id"])));
else
$nb_suppr_anciens+=$suppr_envois_tous->rowCount();
//actualisation du cache de l'abonnement
$abo_desactif=new FclFlux_abonnement();
$abo_desactif->id_abonnement=$infos["abonnement_id"];
$abo_desactif->get_infos(true);
//envoi d'un email à l'abonné
$infos_abo=$abo_desactif->get_infos_cache();
if((empty($infos_abo["auteur_id"]))||(empty($infos_abo["designation"])))
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT." >> ".intval($infos["abonnement_id"])));
else
{
$user=new FclFlux_utilisateur();
$user->id_utilisateur=$infos_abo["auteur_id"];
$infos_user=$user->get_infos_cache(true);
if((empty($infos_user["pseudo"]))||(empty($infos_user["email"])))
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT));
else
{
$Mail_expediteur_email=EMAIL_TRANSACTIONNEL_DE;
$Mail_expediteur_nom=SITE_NOM;
$Mail_destinataire_email=$infos_user["email"];
$Mail_destinataire_nom=stripslashes($infos_user["pseudo"]);
$Mail_sujet=DESACTIVATION_OBJET;
// message alternatif lorsque le html n'est pas lu :
$Mail_boby_txt=str_replace(array("__NOM_UTILISATEUR__","__NOM_ABO__"),array(stripslashes($infos_user["pseudo"]),stripslashes($infos_abo["designation"])),DESACTIVATION_CORPS);
//-- version html :
//texte invisible (sauf certains webmail ?) :
$Mail_html_sujet=DESACTIVATION_OBJET;
//entête avant logo :
$Mail_html_header="<p>Désactivation de votre abonnement : ".stripslashes($infos_abo["designation"])."</p>";
//texte du message :
$Mail_html_intro=str_replace(array("__NOM_UTILISATEUR__","__NOM_ABO__"),array(stripslashes($infos_user["pseudo"]),stripslashes($infos_abo["designation"])),DESACTIVATION_CORPS_HTML);
//liens sous forme de grands boutons. L'ancre ne doit donc pas être trop longue :
$Mail_html_liens_action[0]="<a href='".PAGE_ABO_MAJ.$abo_desactif->id_abonnement."'>Réactiver mon abonnement.</a>";// ajouter un ticket pour connexion sans mot de passe !
//footer du mail html :
$Mail_html_footer="<p><a href='".SITE_NOM."'>".SITE_NOM."</a>, ".SITE_SLOGAN."</p>";
$Mail_boby_html="";
ob_start();
include(BASE_REP."../www/".TEMPLATE_REP."/mail/defaut.php");
$Mail_boby_html=ob_get_contents();
ob_end_clean();
require(BASE_REP."../divers/phpmailer-initialise.php");
require(BASE_REP."../divers/phpmailer-envoi.php");
if(!$mail->Send())
{
sleep(2);
if(!$mail->Send())
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_EMAIL_ENVOI.$mail->ErrorInfo));
}
}
}
}
}
else
{
$suppr=$suppr_envois_anciens->execute(array(":id"=>$infos["abonnement_id"],":time"=>$date_limite));
if(test_requete(__FILE__,__LINE__,$suppr,$suppr_envois_anciens)===false)
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_SUPPR." >> ".intval($infos["abonnement_id"]).",".$date_limite));
else
$nb_suppr_anciens+=$suppr_envois_anciens->rowCount();
//les stats
if($date_limite>$time_suppr_abo_defaut)
$date_limite=$time_suppr_abo_defaut;
$suppr=$suppr_clics_anciens->execute(array(":id"=>$infos["abonnement_id"],":time"=>$date_limite));
if(test_requete(__FILE__,__LINE__,$suppr,$suppr_clics_anciens)===false)
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_SUPPR." >> ".intval($infos["abonnement_id"]).",".$date_limite));
}
}
}
}
}
// si il y a un abonnement par défaut définit pour toute inscription,
// il peut être à désactiver si l'abonné est resté inactif sur l'ensemble du site au-delà d'une certaine durée.
if((!empty($hub_site["id"]))&&(!empty($hub_site["duree_max"])))
{
$time_limite=time()-3600*24*$hub_site["duree_max"];
$get_abos_inactifs_site=$Bd->query("SELECT DISTINCT A.id_abonnement FROM abonnements as A,abonnements_hub as H WHERE (A.jours_alerte!='') AND (A.time_crea<$time_limite) AND (A.id_abonnement=H.id_abonnement) AND (H.id_hub=".$hub_site["id"].") AND (A.auteur_id NOT IN (SELECT utilisateur_id FROM stat_clics_posts GROUP BY utilisateur_id HAVING MAX(time_clic)>$time_limite));");// optimiser requête avec jointure ?
if((test_requete(__FILE__,__LINE__,$get_abos_inactifs_site)===false))
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_RECHERCHE));
else
{//je désactive chacun des abonnements concernés
$abos=$get_abos_inactifs_site->fetchAll();
unset($get_abos_inactifs_site);
$nb_inactifs=count($abos);
if(!empty($nb_inactifs))
{
$nb_desactif_site=0;
foreach($abos as $abo_infos)
{
$desactive=$desactivation->execute(array(":id"=>$abo_infos["id_abonnement"]));
if((test_requete(__FILE__,__LINE__,$desactive,$desactivation)===false))
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_MAJ." >> ".intval($abo_infos["id_abonnement"])));
else
{
$nb_desactif_site++;
$suppr=$suppr_envois_tous->execute(array(":id"=>$abo_infos["id_abonnement"]));
if((test_requete(__FILE__,__LINE__,$suppr,$suppr_envois_tous)===false))
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_SUPPR." >> ".intval($abo_infos["id_abonnement"])));
$abo_desactif=new FclFlux_abonnement();
$abo_desactif->id_abonnement=$abo_infos["id_abonnement"];
$abo_desactif->get_infos(true);
unset($abo_desactif);
}
}
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,"$nb_desactif_site abonnements par défaut viennent d'être désactivés."));
}
}
}
return $nb_desactive;
}
/**
* Affichage par défaut d'un objet
*
* @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