$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(($longueurABO_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"]."
"; $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="

Pour modifier ou supprimer votre abonnement cliquez-ci.

"; //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="

Hello ".htmlentities(stripslashes($destinataire_infos["pseudo"])).",

Le facteur est passé :-)
Voici les nouvelles pour le $jour_nom $date_actuelle.

"; $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]="

".$annonce_infos["annonce"]." ".strtoupper($annonce_infos["lien_ancre"]).".

"; $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]="

[".stripslashes($liens[$i]["flux"]["source"]["nom"])."] "; elseif(!empty($liens[$i]["hub"])) $Mail_html_items[$nb_item]="

[".stripslashes($liens[$i]["hub"]["nom"])."] "; elseif(!empty($liens[$i]["auteur"]))// dans quel cas, je rencontre cette situation ? $Mail_html_items[$nb_item]="

[".htmlspecialchars_decode(stripslashes($liens[$i]["auteur"]["pseudo"]))."] "; $Mail_html_items[$nb_item].=htmlspecialchars_decode(stripslashes($liens[$i]["ancre"]))." + LIRE.

"; $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]="

".$annonce_infos["annonce"]." ".strtoupper($annonce_infos["lien_ancre"]).".

"; $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="

Au moins $manque autres actualités vous attendent sur Hello facteur. Vous pouvez aussi augmenter le nombre maximum d'actualités envoyées pour cet abonnement.

"; //liens sous forme de grands boutons. L'ancre ne doit donc pas être trop longue : $Mail_html_liens_action[0]="Voir sur Hello facteur."; $Mail_html_liens_action[1]="Modifier mon abonnement."; $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="

Vous recevez ce message parce que vous vous êtes abonné(e) au site ".SITE_NOM." avec comme adresse ".$destinataire_infos["email"]." | Aide | Supprimer mon abonnement | Stopper temporairement les envois.

"; $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="

Désactivation de votre abonnement : ".stripslashes($infos_abo["designation"])."

"; //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]="Réactiver mon abonnement.";// ajouter un ticket pour connexion sans mot de passe ! //footer du mail html : $Mail_html_footer="

".SITE_NOM.", ".SITE_SLOGAN."

"; $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="

".__CLASS__."

"; foreach($this as $key => $value) { if(is_array($value)) $value=affiche_tableau($value,"
  • #valeur
  • ",""); $texte.="$key : $value\n"; } return $texte; } }//fin de la classe