limites=$infos["limites"]; unset($infos["limites"]); $erreur_ok=false; foreach ($infos as $attribut => $valeur) { $methode="set_$attribut"; if (method_exists(__CLASS__,$methode)) { if(!$this->$methode($valeur)) $erreur_ok=true; } else $this->$attribut=$valeur; } if(($erreur_ok)&&(empty($this->erreurs))) $this->erreurs=(array) ERREUR_IMPREVUE; } } /** * Méthode vérifiant que le paramètre fourni est bien un hub existant * et lui destinant l'annonce si c'est le cas * * @param la valeur à contrôler * @return booléen suivant succès * @author Fabrice PENHOËT **/ public function set_hub($hub) { if(!($hub instanceof FclFlux_hub)) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_FORMAT)); return false; } if(empty($hub->id_hub)) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_FORMAT)); return false; } if(($hub->recherche($hub->id_hub,"id_hub","id_hub")===false)) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_ENREG_ABSENT." >> ".htmlentities($hub->id_hub,ENT_QUOTES))); return false; } $this->hub=$hub; return true; } /** * Méthode vérifiant que le paramètre fourni est bien un flux existant * et lui attribuant l'origine de l'annonce si c'est le cas * * @param la valeur à contrôler (peut être vide). * @return booléen suivant succès * @author Fabrice PENHOËT **/ public function set_flux($flux) { if(empty($flux)) return true; if(!($flux instanceof FclFlux_flux)) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_FORMAT)); return false; } if(empty($flux->id_flux)) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_FORMAT)); return false; } if(($flux->recherche($flux->id_flux,"id_flux","id_flux")===false)) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_ENREG_ABSENT." >> ".htmlentities($flux->id_flux,ENT_QUOTES))); return false; } $this->flux=$flux; return true; } /** * Méthode vérifiant que le paramètre fourni est bien un utilisateur existant * et lui attribuant l'origine de l'annonce si c'est le cas * * @param la valeur à contrôler (peut être vide) * @return booléen suivant succès * @author Fabrice PENHOËT **/ public function set_auteur($auteur) { if(empty($auteur)) return true; if(!($auteur instanceof FclFlux_utilisateur)) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_FORMAT)); return false; } if(empty($auteur->id_utilisateur)) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_FORMAT)); return false; } $existe=FclFlux_utilisateur::recherche($auteur->id_utilisateur,"id_utilisateur","id_utilisateur"); if(empty($existe)) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_ENREG_ABSENT." >> ".intval($auteur->id_utilisateur))); return false; } $this->auteur=$auteur; return true; } /** * Méthode testant la validité du texte du lien. * 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_ancre($ancre) { if((empty($this->limites["ancre_long_min"]))||(empty($this->limites["ancre_long_max"]))) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT)); return false; } $long_min=$this->limites["ancre_long_min"]; $long_max=$this->limites["ancre_long_max"]; if((!is_int($long_min))||(!is_int($long_max))||($long_max<$long_min)) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_FORMAT)); return false; } $ancre=strip_tags(strval(trim($ancre))); $longueur=strlen($ancre); if(($longueur<$long_min)||($longueur>$long_max)) { $this->erreurs=array_merge($this->erreurs,(array) (str_replace(array("__MIN__","__MAX__"),array($long_min,$long_max),ERREUR_POST_ANCRE_LONG))); return false; } else { $this->ancre=$ancre; return true; } } /** * Méthode testant la validité d'une url fournie * on contrôle le format de l'url et sa longueur * si tout est ok, on l'attribut à l'objet * * @param l'url à contrôler (peut être vide si annonce publiée sur le site) * @return booléen suivant succès * @author Fabrice PENHOËT **/ public function set_url($url) { if(empty($url)) return true; $long_min=(!empty($this->limites["url_long_min"]))?$this->limites["url_long_min"]:0; if(empty($this->limites["url_long_max"])) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT)); return false; } $long_max=$this->limites["url_long_max"]; if((($long_min!=0)&&(!is_int($long_min)))||(!is_int($long_max))||($long_max<$long_min)) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_FORMAT)); return false; } $url=strip_tags(strval(trim($url))); $longueur=strlen($url); if(($longueur<$long_min)||($longueur>$long_max)) { $this->erreurs=array_merge($this->erreurs,(array) (str_replace(array("__MIN__","__MAX__"),array($long_min,$long_max),ERREUR_LIEN_URL_LONG))); return false; } if(!filter_var($url,FILTER_VALIDATE_URL)) { $this->erreurs=array_merge($this->erreurs,(array) ERREUR_LIEN_URL_FORMAT); return false; } $this->url=$url; return true; } /** * Méthode testant la validité du texte de l'annonce * et l'attribuant à l'objet si ok * * @param le texte à contrôler (peut être vide si un lien est fourni) * @return booléen suivant succès * @author Fabrice PENHOËT **/ public function set_annonce($annonce,$html_ok=false) { if(empty(strip_tags($annonce))) return true; if((empty($this->limites["annonce_long_min"]))||(empty($this->limites["annonce_long_max"]))) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT)); return false; } $long_min=$this->limites["annonce_long_min"]; $long_max=$this->limites["annonce_long_max"]; if((!is_int($long_min))||(!is_int($long_max))||($long_max<$long_min)) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_FORMAT)); return false; } $annonce=strval(trim($annonce)); $longueur=strlen(strip_tags($annonce)); if(($longueur<$long_min)||($longueur>$long_max)) { $this->erreurs=array_merge($this->erreurs,(array) (str_replace(array("__MIN__","__MAX__","__NB__"),array($long_min,$long_max,$longueur),ERREUR_POST_ANNONCE_LONG))); return false; } else { if($html_ok===false) $this->annonce=strip_tags($annonce); else $this->annonce=$annonce; return true; } } /** * Méthode permettant d'accepter le html pour le contenu de l'annonce * * @param le texte à contrôler (peut être vide si un lien est fourni) * @return booléen suivant succès * @author Fabrice PENHOËT **/ public function set_annonce_html($annonce) { return $this->set_annonce($annonce,true); } /** * Méthode testant la validité de la date de début de diffusion de l'annonce. * et la transformant en timestamp unix si ok pour l'attribuer à l'objet * * @param la date au format JJ/MM/AAAA * @return booléen suivant succès * @author Fabrice PENHOËT **/ public function set_time_diffusion($date_diffusion="") { if(empty($date_diffusion)) { $this->time_diffusion=0; return true; } if(preg_match(DATE_FORMAT_EREG,$date_diffusion)==0) { $this->erreurs=array_merge($this->erreurs,(array) ERREUR_POST_DATE_DIFFUSION_FORMAT); return false; } $tab_diffusion=explode("/",$date_diffusion); $time_diffusion=mktime(0,0,0,$tab_diffusion[1],$tab_diffusion[0],$tab_diffusion[2]); if($time_diffusion===false) { $this->erreurs=array_merge($this->erreurs,(array) ERREUR_POST_DATE_DIFFUSION_FORMAT); return false; } /*$timeS=time(); if($time_diffusion<=$timeS) { $this->erreurs=array_merge($this->erreurs,(array) ERREUR_POST_DATE_DIFFUSION); return false; } --> je peux avoir besoin de modifier un post déjà diffusé sans vouloir le redifuser... */ $this->time_diffusion=$time_diffusion; return true; } /** * Méthode testant la validité de la date de fin d'expiration de l'annonce. * et la transformant en timestamp unix si ok pour l'attribuer à l'objet * * @param la date au format JJ/MM/AAAA * @return booléen suivant succès * @author Fabrice PENHOËT **/ public function set_time_expiration($date_expiration="") { if(empty($date_expiration)) { $this->time_expiration=0; return true; } if(preg_match(DATE_FORMAT_EREG,$date_expiration)==0) { $this->erreurs=array_merge($this->erreurs,(array) ERREUR_POST_DATE_EXPIRATION_FORMAT); return false; } $tab_expiration=explode("/",$date_expiration); $time_expiration=mktime(0,0,0,$tab_expiration[1],$tab_expiration[0],$tab_expiration[2]); if($time_expiration===false) { $this->erreurs=array_merge($this->erreurs,(array) ERREUR_POST_DATE_EXPIRATION_FORMAT); return false; } if(empty($this->time_diffusion)) $timeS=time()+7*24*3600;// annonce susceptible d'être diffusée pendant 7 jours. else $timeS=$this->time_diffusion+7*24*3600; if($time_expiration<$timeS) { $this->erreurs=array_merge($this->erreurs,(array) ERREUR_POST_DATE_EXPIRATION); return false; } $this->time_expiration=$time_expiration; return true; } /** * Méthode testant la validité du fichier image illustrant l'annonce (nom, format, taille...) * Si ok, une miniature est créée localement et son adresse affectée à l'objet. * l'ancre de l'annonce doit être attribuée à l'objet avant car elle sert à nommer le fichier image. * * @param $fichier : les infos du fichier qui vient d'être téléchargé * @return booléen suivant succès * @author Fabrice PENHOËT **/ public function set_illustration($fichier) { if(!empty($fichier)) { $adresse_temp=$fichier["tmp_name"]; if(!file_exists($adresse_temp)) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_FICHIER_EXISTE." >> ".htmlentities($adresse_temp,ENT_QUOTES))); return false; } if(empty($this->ancre)) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_POST_ANCRE_ABSENT)); return false; } $extension=strtolower(strrchr($fichier["name"],".")); if (strpos(POST_ILLUS_EXTENSIONS,$extension)===false) $messages[]=ERREUR_IMAGE_FORMAT; $taille_max=min(intval(str_replace("M","000000",ini_get("upload_max_filesize"))),POST_ILLUS_MAX_TAILLE); $taille_fichier=filesize($adresse_temp); if($taille_fichier>$taille_max) $messages[]=ERREUR_FICHIER_POIDS." (maximum : ".($taille_max/1000)." ko)"; if(empty($messages)) { $ancre=get_chaine_debut(nettoye_chaine(strtolower($this->ancre)),50); $adresse_illustration=POST_ILLUS_REP."/".$ancre[0]."/".$ancre.$extension; $i=1; while(file_exists($adresse_illustration)) { $i++; $adresse_illustration=POST_ILLUS_REP."/".$ancre[0]."/".$ancre.$i.$extension; } if(!file_exists(POST_ILLUS_REP."/".$ancre[0]."/")) { if(!mkdir(POST_ILLUS_REP."/".$ancre[0]."/",POST_ILLUS_REP_CHMOD,true)) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_REP_CREA." >> ".POST_ILLUS_REP."/".$ancre[0]."/")); return false; } } if((import_image($adresse_temp,$adresse_illustration,0,POST_ILLUS_MAX_LARGEUR)===true)) { $this->illustration=substr(strrchr($adresse_illustration,"/"),1); return $this->sauve_illustration(); } else { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_IMAGE_CREATION)); return false; } } else { $this->erreurs=array_merge($this->erreurs,$messages); return false; } } else $this->illustration=NULL; } /** * Méthode enregistrant un changement concernant l'illustration de l'annonce qui peut aussi bien être ajoutée ou modifiée. * On ne s'occupe pas du téléchargement, ni du contrôle du fichier. * * @return booléen suivant succès * @author Fabrice PENHOËT **/ public function sauve_illustration() { global $Bd; if((isset_connexion(__FILE__,__LINE__)===false)) return false; if((empty($this->illustration))||(empty($this->id_post))) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT." >> ".intval($this->id_post))); return false; } $post_infos=self::recherche($this->id_post,"illustration,annonce,time_validation"); if(empty($post_infos)) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_ENREG_ABSENT." >> ".intval($this->id_post))); return false; } if($this->illustration==$post_infos["illustration"]) return true; $prepare=$Bd->prepare("UPDATE hub_post SET illustration=:illustration WHERE id_post=:id_post;"); $maj=$prepare->execute(array(':illustration'=>$this->illustration,':id_post'=>$this->id_post)); if((test_requete(__FILE__,__LINE__,$maj,$prepare)===false)) return false; $prepare=null; // suppression de l'ancien fichier si nécessaire if(!empty($post_infos["illustration"])) { $fichier=$post_infos["illustration"]; $adresse_illustration=POST_ILLUS_REP."/".$fichier[0]."/".$fichier; if((file_exists($adresse_illustration))&&(!unlink($adresse_illustration))) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_FICHIER_SUPPR." >> ".htmlentities($adresse_illustration,ENT_QUOTES))); return false; } } if((!empty($post_infos["annonce"]))&&(!empty($post_infos["time_validation"]))) $this->crea_cache(); return true; } /** * Méthode supprimant l'illustration d'une annonce si elle existe (fichier + sql) * * @param * @return booléen suivant succès * @author Fabrice PENHOËT **/ public function suppr_illustration() { global $Bd; if((isset_connexion(__FILE__,__LINE__)===false)) return false; if(empty($this->id_post)) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT)); return false; } $post_infos=self::recherche($this->id_post,"illustration,annonce,time_validation"); if(empty($post_infos)) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_ENREG_ABSENT." >> ".intval($this->id_post))); return false; } if(empty($post_infos["illustration"])) return true;//bien que ne devant pas être possible... // suppression du fichier $fichier=$post_infos["illustration"]; $adresse_illustration=POST_ILLUS_REP."/".$fichier[0]."/".$fichier; if(!file_exists($adresse_illustration)) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_FICHIER_EXISTE." >> ".htmlentities($adresse_illustration,ENT_QUOTES))); return false; } if(!unlink($adresse_illustration)) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_FICHIER_SUPPR." >> ".htmlentities($adresse_illustration,ENT_QUOTES))); return false; } $suppr=$Bd->query("UPDATE hub_post SET illustration=NULL WHERE id_post=".$this->id_post.";"); if((test_requete(__FILE__,__LINE__,$suppr)===false)) return false; if((!empty($post_infos["annonce"]))&&(!empty($post_infos["time_validation"]))) $this->crea_cache(); return true; } /** * Méthode cherchant une annonce dans la bd via son id_post. * * @param la valeur recherchée, les champs souhaités en sortie si trouvé. * @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,$champ_sortie="*") { global $Bd; if((isset_connexion(__FILE__,__LINE__)===false)) return false; $prepare=$Bd->prepare("SELECT $champ_sortie FROM hub_post WHERE id_post=: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 recherchant les posts dans le bd pour un (ou +sieurs) mots-clés. * * @param les champs souhaités en sortie * @return les données de la table dans un tableau php si trouvé. false si pas trouvé ou en cas d'erreur. * @author Fabrice PENHOËT **/ static function recherche_globale($recherche,$champ_sortie="*") { global $Bd; if((isset_connexion(__FILE__,__LINE__)===false)) return false; $recherche=strip_tags(strval(trim($recherche))); $recherche_like="%".str_replace(" ","%",$recherche)."%";//qd espaces, cherchez plusieurs mots plutôt qu'une seule expression ??? $prepare=$Bd->prepare("SELECT $champ_sortie FROM hub_post WHERE id_post=:cherche_id OR ancre LIKE :recherche OR annonce LIKE :recherche OR url LIKE :recherche ORDER BY ancre ASC;"); $recherche=$prepare->execute(array(":cherche_id"=>$recherche,":recherche"=>$recherche_like)); if((test_requete(__FILE__,__LINE__,$recherche,$prepare)===false)) return false; $resultat=$prepare->fetchAll(PDO::FETCH_ASSOC); $prepare=null; if(empty($resultat)) return false; else return $resultat; } /** * Méthode créant le fichier cache contenant les infos utiles d'un post * id_post doit être connu * * @return booléen suivant succès * @author Fabrice PENHOËT **/ public function crea_cache() { if(empty($this->id_post)) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT)); return false; } $infos=self::recherche($this->id_post,"*"); if($infos===false) //$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_ENREG_ABSENT.">>".intval($this->id_post)));->> pas un bug car on a peut-être juste voulu afficher un post supprimé return false; if((!empty($infos["time_validation"]))&&(!empty($infos["annonce"])))// fichier cache inutile pour les simples redirections. { $id=strval($this->id_post); return crea_cache(CACHE_REP_POSTS."/".$id[0]."/$id.txt",$infos); } else return false; return true; } /** * Méthode ouvrant le fichier cache contenant les infos d'un post * * @param crea_cache : un booléen pour savoir si il faut tester la création du fichier en cas d'absence * @return tableau contenant les infos du post fournies par le fichier (si trouvé), false en cas d'erreur * @author Fabrice PENHOËT **/ public function get_infos_cache($crea_cache=false) { global $Bd; if(empty($this->id_post)) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT)); return false; } $id=strval($this->id_post); $fichier=CACHE_REP."/".CACHE_REP_POSTS."/".$id[0]."/$id.txt"; $infos=array(); if(!file_exists($fichier)) { if($crea_cache) { if(empty($GLOBALS['Bd'])) require("connexion-bd.php"); if(empty($GLOBALS['Bd'])) return false; if(!$this->crea_cache()) //{ //$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_CACHE_ECRITURE.">>".intval($this->id_post))); return false; //} } else return false; } include($fichier); if(empty($t)) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_FICHIER_EXISTE.">>".htmlentities($fichier,ENT_QUOTES))); return false; } else { foreach($t as $key => $value) { if(!is_array($value)) $infos[$key]=stripslashes($value); } } if(empty($infos)) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT.">>".intval($this->id_post))); return false; } else return $infos; } /** * Méthode de suppression du fichier cache lié à un post * id_post doit être connu * * @return booléen suivant succès * @author Fabrice PENHOËT **/ public function suppr_cache() { if(empty($this->id_post)) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT)); return false; } $id=strval($this->id_post); $chemin=CACHE_REP."/".CACHE_REP_POSTS."/".$id[0]."/$id.txt"; if((file_exists($chemin))&&(!unlink($chemin))) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_FICHIER_SUPPR." >> ".htmlentities($chemin,ENT_QUOTES))); return false; } return true; } /** * Méthode cherchant si il y a de nouveaux posts qu'un administrateur du site doit valider. * * @param * @return les données de la table dans un tableau si trouvé, false si pas trouvé ou en cas d'erreur * @author Fabrice PENHOËT **/ static function get_a_valider() { global $Bd; if((isset_connexion(__FILE__,__LINE__)===false)) return false; $get_posts=$Bd->query("SELECT id_post,ancre FROM hub_post WHERE ((time_validation=0) AND (((auteur_id IS NOT NULL)) OR ((auteur_id IS NULL) AND (flux_id IS NOT NULL))) AND (hub_id NOT IN (select DISTINCT id_hub FROM hub_admin))) ORDER BY time_crea"); if((test_requete(__FILE__,__LINE__,$get_posts)===false)) return false; $resultats=$get_posts->fetchAll(PDO::FETCH_ASSOC); if(empty($resultats)) return false; else return $resultats; } /** * Méthode enregistrant un nouveau post individuellement. * un post saisi par un utilisateur non connecté n'a pas d'auteur mais ses infos doivent être fournies en paramètre * un message lui est envoyé pour valider son annonce * si l'email est inconnu un compte utilisateur est créé qui sera validé en même temps que l'annonce * un post sans auteur (ni flux) n'apparaît pas dans les messages à valider * le cache n'est créé que si l'annnonce est validée et n'est pas une simple redirection * il sera supprimé si non validé au-delà de la durée de validation d'un compte * * @param $auteur objet de type utilisateur contenant les infos de l'annonceur (email, pseudo) * @return booléen suivant succès * @author Fabrice PENHOËT **/ public function ajout($auteur=null) { global $Bd; if((isset_connexion(__FILE__,__LINE__)===false)) return false; if(((empty($this->url))&&(empty($this->annonce)))||(empty($this->ancre))||(empty($this->hub))||((empty($this->auteur))&&(empty($this->flux))&&(empty($auteur)))) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT)); return false; } $timeS=time(); if((!empty($this->time_diffusion))&&($this->time_diffusion<=$timeS)) { $this->erreurs=array_merge($this->erreurs,(array) ERREUR_POST_DATE_DIFFUSION); return false; } if(!empty($auteur)) { if((empty($auteur["email"]))||(empty($auteur["pseudo"]))) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT)); return false; } //-- un utilisateur existe-t-il déjà pour cette adresse email ? $existe=FclFlux_utilisateur::recherche($auteur["email"],"email","id_utilisateur,pseudo"); if(!empty($existe)) { $auteur["id_utilisateur"]=$existe["id_utilisateur"]; $annonceur=new FclFlux_utilisateur($auteur); if(!empty($annonceur->erreurs)) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_FORMAT." >> ".intval($existe["id_utilisateur"]))); return false; } } else { //on tente la création d'un nouveau compte if(empty($auteur["origine"])) $auteur["origine"]="annonces"; $annonceur=new FclFlux_utilisateur($auteur); if(!empty($annonceur->erreurs)) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_FORMAT)); return false; } $crea=$annonceur->ajout(false,"ext");//si création ok, je récupère l'id_utilisateur + le ticket de validation utile plus loin if($crea!==true) { if(!empty($annonceur->erreurs)) $this->erreurs=array_merge($this->erreurs,$annonceur->erreurs);// par exemple, problème sur le pseudo return false; } } } $flux_id=NULL;$auteur_id=NULL; if(!empty($this->flux)) $flux_id=$this->flux->id_flux; if(!empty($this->auteur)) $auteur_id=$this->auteur->id_utilisateur; $url=NULL;$annonce=NULL;$illustration=NULL; if(!empty($this->url)) $url=$this->url; if(!empty($this->annonce)) $annonce=$this->annonce; if(!empty($this->illustration))//à priori l'illustration se télécharge dans un deuxième temps. $illustration=$this->illustration; $time_crea=time(); $time_flux=0;$time_diffusion=0;$time_expiration=0; if(!empty($this->time_flux)) $time_flux=$this->time_flux; if(!empty($this->time_diffusion)) $time_diffusion=$this->time_diffusion; if(!empty($this->time_expiration)) $time_expiration=$this->time_expiration; // annonce automatiquement validée si venant d'un flux ou d'un administrateur du hub (ou administrateur général). $time_validation=0; if(!empty($this->flux)) $time_validation=$time_crea; elseif((!empty($this->auteur))&&(($this->hub->est_admin($this->auteur)===true)||($this->auteur->est_admin()===true))) $time_validation=$time_crea; $prepare=$Bd->prepare("INSERT INTO hub_post (hub_id,flux_id,auteur_id,ancre,url,annonce,time_crea,time_flux,time_validation,time_diffusion,time_expiration,illustration) VALUES (:hub_id,:flux_id,:auteur_id,:ancre,:url,:annonce,:time_crea,:time_flux,:time_validation,:time_diffusion,:time_expiration,:illustration)"); $ajout=$prepare->execute(array(':hub_id'=>$this->hub->id_hub,':flux_id'=>$flux_id,':auteur_id'=>$auteur_id,':ancre'=>$this->ancre,':url'=>$url,':annonce'=>$annonce,':time_crea'=>$time_crea,':time_flux'=>$time_flux,':time_validation'=>$time_validation,':time_diffusion'=>$time_diffusion,':time_expiration'=>$time_expiration,':illustration'=>$illustration)); if((test_requete(__FILE__,__LINE__,$ajout,$prepare)===false)) return false; $this->id_post=$Bd->lastInsertId(); //$prepare=$Bd->prepare("INSERT INTO hub_post_svg (id_post,hub_id,flux_id,auteur_id,time_crea) VALUES (:id,:hub_id,:flux_id,:auteur_id,:time_crea)"); //$ajout=$prepare->execute(array(':id'=>$this->id_post,':hub_id'=>$this->hub->id_hub,':flux_id'=>$flux_id,':auteur_id'=>$auteur_id,':time_crea'=>$time_crea)); //if((test_requete(__FILE__,__LINE__,$ajout,$prepare)===false)) return false; $prepare=null; if($time_validation!=0)// création du cache du post + des dernières annonces du hub { if(!empty($annonce)) $this->crea_cache(); if(empty($time_diffusion))// un script lancé par crontab s'occupe des actus ayant une date de diffusion déterminée. $this->hub->get_liste_posts(true); if(!empty($this->auteur)) { self::get_liste_posts_auteur($this->auteur,true); self::get_liste_derniers_posts(true); } } elseif(!empty($this->auteur))//annonce soumise par utilisateur connecté (mais non administrateur). { // il faut prévenir le(s) administrateur(s) du hub, si il y en a $hub_admins=$this->hub->get_admins(); if(empty($hub_admins))// et sinon les administrateurs du site $hub_admins=FclFlux_utilisateur::get_admins(); // nom du hub ? $hub_infos=$this->hub->get_infos_cache(true); if((empty($hub_infos))||(empty($hub_admins))) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT." > >".$this->id_post)); return false; } foreach($hub_admins as $admin_infos) { // connexion au serveur smtp si il y a lieu : require(BASE_REP."../divers/phpmailer-initialise.php"); $Mail_expediteur_email=EMAIL_TRANSACTIONNEL_DE; $Mail_expediteur_nom=SITE_NOM; $Mail_destinataire_email=$admin_infos["email"]; $Mail_destinataire_nom=$admin_infos["pseudo"]; $Mail_sujet=NOUVEAU_POST_OBJET; // message alternatif lorsque le html n'est pas lu : $Mail_boby_txt=str_replace(array("__NOM_UTILISATEUR__","__NOM_HUB__","__ID__"),array($admin_infos["pseudo"],$hub_infos["nom"],$this->id_post),NOUVEAU_POST_CORPS); //-- version html : //entête avant logo : $Mail_html_sujet="Une nouvelle annonce vient d'être postée dans le bureau de poste ".$hub_infos["nom"]."."; //texte du message, hors liste de liens : $Mail_html_intro=str_replace(array("__NOM_UTILISATEUR__","__NOM_HUB__"),array($admin_infos["pseudo"],$hub_infos["nom"]),NOUVEAU_POST_CORPS_HTML); //liens sous forme de grands boutons. L'ancre ne doit donc pas être trop longue : $Mail_html_liens_action[0]="Traiter cette annonce."; //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(); $SMTP_CustomHeader["X-Mailin-Tag"]="alerte_admin_nouveau_post"; require(BASE_REP."../divers/phpmailer-envoi.php"); if(!$mail->Send()) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_EMAIL_ENVOI.$mail->ErrorInfo)); return false; } } } else { //l'annonce a été postée par un utilisateur non connecté qui doit donc d'abord la valider via un lien. require(BASE_REP."../divers/phpmailer-initialise.php"); $Mail_expediteur_email=EMAIL_TRANSACTIONNEL_DE; $Mail_expediteur_nom=SITE_NOM; $Mail_destinataire_email=$auteur["email"]; $Mail_destinataire_nom=$auteur["pseudo"]; $Mail_sujet=NOUVEAU_POST_VALIDATION_OBJET; $ticket=$this->id_post."a".$annonceur->id_utilisateur."a".$time_crea; if(!empty($annonceur->ticket))//compte venant d'être créé pour l'occasion. $ticket.="/".$annonceur->ticket; // message alternatif lorsque le html n'est pas lu : $Mail_boby_txt=str_replace(array("__NOM_UTILISATEUR__","__ID__"),array($auteur["pseudo"],$ticket),NOUVEAU_POST_VALIDATION_CORPS); //-- version html : //entête avant logo : $Mail_html_sujet=NOUVEAU_POST_VALIDATION_OBJET; //texte du message, hors liste de liens : $Mail_html_intro=str_replace("__NOM_UTILISATEUR__",$auteur["pseudo"],NOUVEAU_POST_VALIDATION_CORPS_HTML); //liens sous forme de grands boutons. L'ancre ne doit donc pas être trop longue : $Mail_html_liens_action[0]="Valider mon annonce."; //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(); $SMTP_CustomHeader["X-Mailin-Tag"]="envoi_lien_validation_post"; require(BASE_REP."../divers/phpmailer-envoi.php"); if(!$mail->Send()) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_EMAIL_ENVOI.$mail->ErrorInfo)); return false; } } return true; } /** * Méthode enregistrant la validation de son annonce par un utilisateur * Elle reste ensuite encore à faire modérer par un administrateur (sauf si il l'est lui-même). * C'est aussi lors de cette étape que l'on abonne l'utilisateur à certains hubs (news du site + actus ville). * * @ $time_crea timestramp de création de l'annonce à contrôler, @auteur objet utilisateur, $cle : ticket de validation si création du compte utilisateur * @return booléen suivant succès * @author Fabrice PENHOËT **/ public function validation_auteur($time_crea=0,$auteur,$cle="") { global $Bd;global $hub_site; if((isset_connexion(__FILE__,__LINE__)===false)) return false; if((empty($this->id_post))||(empty($auteur))||(empty($auteur->id_utilisateur))||(empty($time_crea))) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT." >> ".intval($this->id_post))); return false; } //contrôle du timestamp de création $post_infos=self::recherche($this->id_post,"hub_id,time_crea,time_validation,auteur_id"); if(empty($post_infos)) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_ENREG_ABSENT." >> ".intval($this->id_post))); return false; } if(($time_crea!=$post_infos["time_crea"])||(empty($post_infos["hub_id"]))) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_AUTORISES." >> ".intval($this->id_post))); return false; } if((!empty($post_infos["time_validation"]))||(!empty($post_infos["auteur_id"]))) { $this->erreurs=array_merge($this->erreurs,(array) ERREUR_UTILISA_VALIDATION_POST_LIEN); return false; } //si une clé est fournie, c'est que l'annonceur vient de créer son compte dont je teste la validation if(!empty($cle)) { $auteur=new FclFlux_utilisateur(); $valide_c=$auteur->valide($cle,true); if(($valide_c!==true)||(empty($auteur->id_utilisateur))) { $this->erreurs=array_merge($this->erreurs,$auteur->erreurs); return false; } // + je l'abonne aux actus de sa ville & co et au hub du site si déclaré // pour ce faire, j'ai besoin de connaître l'insee de la rubrique du hub visé par l'annonce. // l'insee peut avoir été enregistré dans un cookie if(!isset($_SESSION)) { session_save_path(SESSIONS_REP); ini_set("session.use_only_cookies",1); session_start(); } if(!empty($_COOKIE["insee_post"])) { $test_cookie=get_villes($_COOKIE["insee_post"],"insee"); if(!empty($test_cookie)) { $post_insee=$_COOKIE["insee_post"]; // j'en profite pour affecter le bon fuseau horaire si DOM TOM global $DT_fuseau; $num_depart=$test_cookie[0]["dep_num"]; if(isset($DT_fuseau["$num_depart"])) { $auteur->set_fuseau_horaire($DT_fuseau["$num_depart"]); $svg=$auteur->actualise_fuseau_horaire(); if($svg!==true) $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_MAJ." >> ".intval($auteur->id_utilisateur))); } } setcookie("insee_post",NULL,-1); unset($_COOKIE['insee_post']); unset($test_cookie); } if(empty($post_insee))//pas de cookie ou valeur non correcte { $recherche_insee=$Bd->query("SELECT R.insee FROM hub_rubriques as R,hub_classement_rubriques as C WHERE ((R.id_rubrique=C.id_rubrique) AND (C.id_hub=".$post_infos["hub_id"]."));"); if((test_requete(__FILE__,__LINE__,$recherche_insee)===false)) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_ENREG_ABSENT." >> ".intval($post_infos["hub_id"]))); return false; } $resultats=$recherche_insee->fetchAll();// il peut en fait y avoir plusieurs insee si +sieurs villes partagent le même code postal. if(empty($resultats)) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_ENREG_ABSENT." >> ".intval($post_infos["hub_id"]))); return false; } $post_insee=$resultats[0]["insee"]; unset($resultats); } $abo_ville=new FclFlux_abonnement(); $crea_abo_ville=$abo_ville->abo_rapide_ville($auteur,$post_insee); if($crea_abo_ville===false)//j'informe les admins mais ne bloque pas $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_AJOUT." >> ".intval($auteur->id_utilisateur))); if(!empty($hub_site)) {// il peut y avoir un hub auxquel on est automatiquement abonné lorsque l'on créé un compte $infos_abo["designation"]=$hub_site["nom"]; $infos_abo["proprietaire"]=$auteur; $abo_news=new FclFlux_abonnement($infos_abo); $crea_abo_news=$abo_news->ajout(); if($crea_abo_news!==false) { $hub=new FclFlux_hub(); $hub->id_hub=$hub_site["id"]; $abo_news->ajout_hubs(array($hub)); unset($hub); } } unset($abo_news); } else {// utilisateur déjà connu des services... j'en profite pour contrôler son identité et lui créer une session. $auteur_infos=FclFlux_utilisateur::recherche($auteur->id_utilisateur,"id_utilisateur","pseudo,statut"); if(empty($auteur_infos)) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_ENREG_ABSENT." >> ".intval($auteur->id_utilisateur))); return false; } $auteur->set_pseudo($auteur_infos["pseudo"]); $auteur->set_statut($auteur_infos["statut"]); if(!empty($auteur->erreurs)) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_FORMAT." >> ".intval($auteur->id_utilisateur))); return false; } if(!($auteur_infos["statut"]=="administrateur")) $auteur->crea_session(false); unset($auteur_infos); } //-- je peux enregistrer cet utilisateur comme auteur de l'annonce $prepare=$Bd->prepare("UPDATE hub_post SET auteur_id=:id WHERE id_post=:id_post;"); $maj=$prepare->execute(array(':id'=>$auteur->id_utilisateur,':id_post'=>$this->id_post)); if((test_requete(__FILE__,__LINE__,$maj,$prepare)===false)) return false; //$prepare=$Bd->prepare("UPDATE hub_post_svg SET auteur_id=:id WHERE id_post=:id_post;"); //$maj=$prepare->execute(array(':id'=>$auteur->id_utilisateur,':id_post'=>$this->id_post)); //if((test_requete(__FILE__,__LINE__,$maj,$prepare)===false)) return false; $prepare=null; //-- il faut prévenir le(s) administrateurs du hub si il y en a $hub_annonce=new FclFlux_hub(); $hub_annonce->id_hub=$post_infos["hub_id"]; $hub_admins=$hub_annonce->get_admins(); if(empty($hub_admins))// et sinon les administrateurs du site $hub_admins=FclFlux_utilisateur::get_admins(); // nom du hub ? $hub_infos=$hub_annonce->get_infos_cache(true); if((empty($hub_infos))||(empty($hub_admins))) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT." > >".$this->id_post)); return false; } foreach($hub_admins as $admin_infos) { require(BASE_REP."../divers/phpmailer-initialise.php"); $Mail_expediteur_email=EMAIL_TRANSACTIONNEL_DE; $Mail_expediteur_nom=SITE_NOM; $Mail_destinataire_email=$admin_infos["email"]; $Mail_destinataire_nom=$admin_infos["pseudo"]; $Mail_sujet=NOUVEAU_POST_OBJET; // message alternatif lorsque le html n'est pas lu : $Mail_boby_txt=str_replace(array("__NOM_UTILISATEUR__","__NOM_HUB__","__ID__"),array($admin_infos["pseudo"],$hub_infos["nom"],$this->id_post),NOUVEAU_POST_CORPS); //-- version html : //entête avant logo : $Mail_html_sujet="Une nouvelle annonce vient d'être postée dans le bureau de poste ".$hub_infos["nom"]."."; //texte du message, hors liste de liens : $Mail_html_intro=str_replace(array("__NOM_UTILISATEUR__","__NOM_HUB__"),array($admin_infos["pseudo"],$hub_infos["nom"]),NOUVEAU_POST_CORPS_HTML); //liens sous forme de grands boutons. L'ancre ne doit donc pas être trop longue : $Mail_html_liens_action[0]="Traiter cette annonce."; //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(); $SMTP_CustomHeader["X-Mailin-Tag"]="alerte_admin_nouveau_post"; require(BASE_REP."../divers/phpmailer-envoi.php"); if(!$mail->Send()) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_EMAIL_ENVOI.$mail->ErrorInfo)); return false; } } return true; } /** * Méthode modifiant les informations d'une annonce (peut permettre en même temps de la valider). * * @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->url))&&(empty($this->annonce)))||(empty($this->ancre))||(empty($this->id_post))||(empty($this->hub))) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT." >> ".intval($this->id_post))); return false; } $post_infos=self::recherche($this->id_post,"hub_id,time_validation,auteur_id,time_diffusion,time_expiration"); if(empty($post_infos)) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_ENREG_ABSENT." >> ".intval($this->id_post))); return false; } $time_validation=$post_infos["time_validation"]; if(empty($time_validation)) { // si l'utilisateur connecté est un des administrateurs du hub, il valide l'annonce en même temps. if(empty($_SESSION["id_utilisateur"])) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_ACTION_NON_AUTORISEE." >> ".intval($this->id_post))); return false; } $user=new FclFlux_utilisateur(); $user->id_utilisateur=intval($_SESSION["id_utilisateur"]); $hub=$this->hub; if(($this->hub->est_admin($user))||($user->est_admin())) $time_validation=time(); unset($user);unset($hub); } if(!isset($this->time_diffusion)) $this->time_diffusion=$post_infos["time_diffusion"]; if(!isset($this->time_expiration)) $this->time_expiration=$post_infos["time_expiration"]; $prepare=$Bd->prepare("UPDATE hub_post SET ancre=:ancre,url=:url,annonce=:annonce,time_validation=:time_validation,time_diffusion=:time_diffusion,time_expiration=:time_expiration WHERE id_post=:id_post;"); $maj=$prepare->execute(array(':ancre'=>$this->ancre,':url'=>$this->url,':annonce'=>$this->annonce,':time_validation'=>$time_validation,':time_diffusion'=>$this->time_diffusion,':time_expiration'=>$this->time_expiration,':id_post'=>$this->id_post)); if((test_requete(__FILE__,__LINE__,$maj,$prepare)===false)) return false; $prepare=null; if($time_validation!=0) {//cache du post + des dernières annonces du hub: if(!empty($this->annonce))// pas de texte=annonce juste diffusée mais non publiée $this->crea_cache(); if((empty($post_infos["time_diffusion"]))||(empty($this->time_diffusion)))// le cron s'occupe des actus dont la date de diffusion est définie. $this->hub->get_liste_posts(true); if(!empty($post_infos["auteur_id"])) { $auteur=new FclFlux_utilisateur(); $auteur->id_utilisateur=intval($post_infos["auteur_id"]); self::get_liste_posts_auteur($auteur,true); unset($auteur); } // j'actualise la liste des derniers posts. self::get_liste_derniers_posts(true); if((empty($post_infos["time_validation"]))&&(!empty($post_infos["auteur_id"])))//je peux aussi avoir à valider une annonce venant d'un partenaire. { //un administrateur vient de valider l'annonce. Je préviens l'utilisateur l'ayant postée. $auteur_infos=FclFlux_utilisateur::recherche($post_infos["auteur_id"],"id_utilisateur","pseudo,email"); if(empty($auteur_infos)) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_RECHERCHE." > >".intval($post_infos["auteur_id"]))); return false; } require(BASE_REP."../divers/phpmailer-initialise.php"); $Mail_expediteur_email=EMAIL_TRANSACTIONNEL_DE; $Mail_expediteur_nom=SITE_NOM; $Mail_destinataire_email=$auteur_infos["email"]; $Mail_destinataire_nom=$auteur_infos["pseudo"]; $Mail_sujet=POST_VALIDE_OK_OBJET; // message alternatif lorsque le html n'est pas lu : $Mail_boby_txt=str_replace(array("__NOM_UTILISATEUR__","__ID__"),array($auteur_infos["pseudo"],$this->id_post),POST_VALIDE_OK_CORPS); //-- version html : //entête avant logo : $Mail_html_sujet="Votre annonce vient d'être validée par le facteur."; //texte du message, hors liste de liens : $Mail_html_intro=str_replace("__NOM_UTILISATEUR__",$auteur_infos["pseudo"],POST_VALIDE_OK_CORPS_HTML); if(!empty($this->annonce)) $Mail_html_liens_action[0]="Voir mon annonce."; //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(); $SMTP_CustomHeader["X-Mailin-Tag"]="confirmation_validation_post"; require(BASE_REP."../divers/phpmailer-envoi.php"); if(!$mail->Send()) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_EMAIL_ENVOI.$mail->ErrorInfo)); return false; } } } return true; } /** * Méthode modifiant le hub dans lequel est classé un post (mais ne le valide pas) * * @return booléen suivant succès * @author Fabrice PENHOËT **/ public function change_hub() { global $Bd; if((isset_connexion(__FILE__,__LINE__)===false)) return false; if((empty($this->id_post))||(empty($this->hub))) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT." >> ".intval($this->id_post))); return false; } $post_infos=self::recherche($this->id_post,"hub_id,time_validation,annonce,time_diffusion"); if(empty($post_infos)) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_ENREG_ABSENT." >> ".intval($this->id_post))); return false; } if($this->hub->id_hub===$post_infos["hub_id"])//rien ne bouge ! return true; $prepare=$Bd->prepare("UPDATE hub_post SET hub_id=:hub_id WHERE id_post=:id_post;"); $maj=$prepare->execute(array(':hub_id'=>$this->hub->id_hub,':id_post'=>$this->id_post)); if((test_requete(__FILE__,__LINE__,$maj,$prepare)===false)) return false; //$prepare=$Bd->prepare("UPDATE hub_post_svg SET hub_id=:hub_id WHERE id_post=:id_post;"); //$maj=$prepare->execute(array(':hub_id'=>$this->hub->id_hub,':id_post'=>$this->id_post)); //if((test_requete(__FILE__,__LINE__,$maj,$prepare)===false)) return false; $prepare=null; if(!empty($post_infos["time_validation"])) {//cache du post + des dernières annonces du nouvel hub et de l'ancien : if(!empty($post_infos["annonce"])) $this->crea_cache(); self::get_liste_derniers_posts(true); if(empty($post_infos["time_diffusion"])) { $this->hub->get_liste_posts(true); $ancien_hub=new FclFlux_hub(); $ancien_hub->id_hub=$post_infos["hub_id"]; $ancien_hub->get_liste_posts(true); unset($ancien_hub); } } return true; } /** * Méthode modifiant l'auteur d'un post (mais ne le valide pas) * * @return booléen suivant succès * @author Fabrice PENHOËT **/ public function change_auteur() { global $Bd; if((isset_connexion(__FILE__,__LINE__)===false)) return false; if((empty($this->id_post))||(empty($this->auteur))) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT." >> ".intval($this->id_post))); return false; } $post_infos=self::recherche($this->id_post,"auteur_id,time_validation,annonce"); if(empty($post_infos)) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_ENREG_ABSENT." >> ".intval($this->id_post))); return false; } if($this->auteur->id_utilisateur===$post_infos["auteur_id"])//rien ne bouge ! return true; $prepare=$Bd->prepare("UPDATE hub_post SET auteur_id=:auteur_id WHERE id_post=:id_post;"); $maj=$prepare->execute(array(':auteur_id'=>$this->auteur->id_utilisateur,':id_post'=>$this->id_post)); if((test_requete(__FILE__,__LINE__,$maj,$prepare)===false)) return false; //$prepare=$Bd->prepare("UPDATE hub_post_svg SET auteur_id=:auteur_id WHERE id_post=:id_post;"); //$maj=$prepare->execute(array(':auteur_id'=>$this->auteur->id_utilisateur,':id_post'=>$this->id_post)); //if((test_requete(__FILE__,__LINE__,$maj,$prepare)===false)) return false; $prepare=null; if(!empty($post_infos["time_validation"])) {//cache du post + des dernières annonces du nouvel auteur et de l'ancien (si non nul) : if(!empty($post_infos["annonce"])) $this->crea_cache(); self::get_liste_posts_auteur($this->auteur,true); if(!empty($post_infos["auteur_id"])) { $auteur=new FclFlux_utilisateur(); $auteur->id_utilisateur=intval($post_infos["auteur_id"]); self::get_liste_posts_auteur($auteur,true); unset($auteur); } } return true; } /** * Méthode supprimant l'enregistrement d'un post * * @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_post)) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT)); return false; } $post_infos=self::recherche($this->id_post,"hub_id,auteur_id,illustration"); if(empty($post_infos)) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_ENREG_ABSENT." >> ".intval($this->id_post))); return false; } $prepare=$Bd->prepare("DELETE FROM hub_post WHERE id_post=:id_post LIMIT 1;"); $suppr=$prepare->execute(array(':id_post'=>$this->id_post)); 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_post))); return false; } $this->suppr_cache(); if(!empty($post_infos["illustration"])) { $fichier=$post_infos["illustration"]; $adresse_illustration=POST_ILLUS_REP."/".$fichier[0]."/".$fichier; if((file_exists($adresse_illustration))&&(!unlink($adresse_illustration))) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_FICHIER_SUPPR." >> ".htmlentities($adresse_illustration,ENT_QUOTES))); return false; } } if(empty($this->hub)) { $hub=new FclFlux_hub(); $hub->id_hub=$post_infos["hub_id"]; $this->hub=$hub; unset($hub); } $this->hub->get_liste_posts(true); if(!empty($post_infos["auteur_id"])) { $auteur=new FclFlux_utilisateur(); $auteur->id_utilisateur=intval($post_infos["auteur_id"]); self::get_liste_posts_auteur($auteur,true); unset($auteur); } self::get_liste_derniers_posts(true); return true; } /** * Méthode actualisant un journal comptabilisant les clics du post * * @param utilisateur et abonnement concernés + action et contexte. * @return booléen suivant succès * @author Fabrice PENHOËT **/ public function ajout_journal_clic($utilisateur,$abonnement,$contexte="email") { if(empty($this->id_post)) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_FORMAT)); return false; } if(!($utilisateur instanceof FclFlux_utilisateur)) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_FORMAT)); return false; } if(empty($utilisateur->id_utilisateur)) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_FORMAT)); return false; } if(!($abonnement instanceof FclFlux_abonnement)) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_FORMAT)); return false; } if(empty($abonnement->id_abonnement)) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_FORMAT)); return false; } $repertoire_fichier=CACHE_REP."/".CACHE_REP_POSTS."/clics/"; $nom_fichier=strval(date('Y-m-d-H-i')); $now=time(); $code="\$c[$now]['u_id']='".$utilisateur->id_utilisateur."';\$c[$now]['a_id']='".$abonnement->id_abonnement."';\$c[$now]['p_id']='".$this->id_post."';\$c[$now]['c']='".$contexte."';"; if(file_exists($repertoire_fichier.$nom_fichier)) { if(!file_put_contents($repertoire_fichier.$nom_fichier,$code,FILE_APPEND | LOCK_EX)) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_FICHIER_ECRITURE)); return false; } else return true; } else { if(!file_exists($repertoire_fichier)) { if(!mkdir($repertoire_fichier,CACHE_REP_CHMOD,true)) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_REP_CREA)); return false; } } if(!file_put_contents($repertoire_fichier.$nom_fichier,"prepare("SELECT flux_id,auteur_id from hub_post WHERE id_post=:post_id");//utile pour compteurs clics $prepare_ajout_stat=$Bd->prepare("INSERT INTO stat_clics_posts (utilisateur_id,time_clic,contexte,abonnement_id) VALUES (:utilisateur_id,:time,:contexte,:abonnement_id)"); $prepare_ajout_clic_flux=$Bd->prepare("UPDATE flux SET nb_clics=nb_clics+1 WHERE id_flux=:flux_id"); $prepare_ajour_clic_auteur=$Bd->prepare("UPDATE utilisateurs SET nb_clics=nb_clics+1 WHERE id_utilisateur=:auteur_id"); foreach ($clics as $time_clic=>$infos) { $recherche_post_infos=$prepare_cherche_post->execute(array(":post_id"=>$infos["p_id"])); if((test_requete(__FILE__,__LINE__,$recherche_post_infos,$prepare_cherche_post)===false)) return false; $post_infos=$prepare_cherche_post->fetch(PDO::FETCH_ASSOC); if(!empty($post_infos)) { $ajout_stat=$prepare_ajout_stat->execute(array(':utilisateur_id'=>$infos["u_id"],':time'=>$time_clic,':contexte'=>$infos["c"],':abonnement_id'=>$infos["a_id"])); if((test_requete(__FILE__,__LINE__,$ajout_stat,$prepare_ajout_stat)===false)) return false; $nb_import++; if(!empty($post_infos["flux_id"])) $ajout_clic_flux=$prepare_ajout_clic_flux->execute(array(":flux_id"=>$post_infos["flux_id"]));// en s'en fout si ça bug... elseif(!empty($post_infos["auteur_id"])) $ajout_clic_auteur=$prepare_ajout_clic_auteur->execute(array(":auteur_id"=>$post_infos["auteur_id"]));// idem } } $prepare_cherche_post=null;$prepare_ajout_stat=null;$prepare_ajout_clic_flux=null;$prepare_ajour_clic_auteur=null; } return $nb_import; } /** * Méthode listant les annonces postées par un utilisateur (qu'elles soient validées ou non) * permet aussi de créer le cache si souhaité * * @param l'utilisateur concerné + booléen pour savoir si il faut enregistrer le résultat dans des fichiers + champs souhaités en sortie * @return liste des annonces dans un tableau si trouvé (peut être vide), false en cas d'erreur * @author Fabrice PENHOËT **/ static function get_liste_posts_auteur($auteur,$crea_cache=false,$champs="id_post,ancre,url,time_validation") { global $Bd; if((isset_connexion(__FILE__,__LINE__)===false)) return false; if(empty($auteur)) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT)); return false; } if(!($auteur instanceof FclFlux_utilisateur)) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_FORMAT)); return false; } if(empty($auteur->id_utilisateur)) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_FORMAT)); return false; } $id=strval($auteur->id_utilisateur); $prepare=$Bd->prepare("SELECT $champs FROM hub_post WHERE auteur_id=:valeur ORDER BY time_validation DESC"); $recherche=$prepare->execute(array(":valeur"=>$id)); if((test_requete(__FILE__,__LINE__,$recherche,$prepare)===false)) return false; $posts=$prepare->fetchAll(PDO::FETCH_ASSOC); $prepare=null; if($crea_cache) $cache=crea_cache(CACHE_REP_POSTS."/auteurs/".$id[0]."/$id.txt",$posts); return $posts; } /** * Méthode ouvrant le fichier cache des annonces postées par un utilisateur * * @param l'utilisateur qui nous intéresse, crea_cache : booléen à true si il faut lancer la création du fichier en cas d'absence, * @return tableau contenant les infos des posts telles que fournies par le fichier (peut être vide), false en cas d'erreur * @author Fabrice PENHOËT * */ static function get_liste_posts_auteur_cache($auteur,$crea_cache=false) { global $Bd; if(empty($auteur)) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT)); return false; } if(!($auteur instanceof FclFlux_utilisateur)) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_FORMAT)); return false; } if(empty($auteur->id_utilisateur)) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_FORMAT)); return false; } $id=strval($auteur->id_utilisateur); $fichier=CACHE_REP."/".CACHE_REP_POSTS."/auteurs/".$id[0]."/$id.txt"; if(!file_exists($fichier)) { if($crea_cache) { if(empty($GLOBALS['Bd'])) require("connexion-bd.php"); if(empty($GLOBALS['Bd'])) return false; if(self::get_liste_posts_auteur($auteur,true)===false) return false; } else return false; } if(!file_exists($fichier))//ne devrait pas être possible mais... { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_FICHIER_EXISTE." >> ".$fichier)); return false; } include($fichier);//le fichier peut être vide si aucune annonce postée par cet utilisateur, mais peut aussi contenir des annonces non validées à filtrer à l'affichage. if(empty($t)) return false; else return $t; } /** * Méthode listant les dernières annonces postées par un utilisateur et qui ont été validées, * y compris les annonces qui ne sont pas encore à diffuser. * * @param booléen pour savoir si il faut enregistrer le résultat dans un fichier, champs souhaités en sortie, nombre max d'actualités listées. * @return liste des annonces dans un tableau si trouvé (peut être vide), false en cas d'erreur * @author Fabrice PENHOËT **/ static function get_liste_derniers_posts($crea_cache=false,$champs="id_post,ancre,url,time_validation,time_diffusion,hub_id,auteur_id",$nb_max=30) { global $Bd; if((isset_connexion(__FILE__,__LINE__)===false)) return false; $get_posts=$Bd->query("SELECT $champs FROM hub_post WHERE auteur_id IS NOT NULL AND time_validation!=0 AND annonce IS NOT NULL AND annonce!='' ORDER BY time_validation DESC LIMIT 0,$nb_max"); if((test_requete(__FILE__,__LINE__,$get_posts)===false)) return false; $posts=$get_posts->fetchAll(PDO::FETCH_ASSOC); if($crea_cache) $cache=crea_cache(CACHE_REP_POSTS."/derniers.txt",$posts); return $posts; } /** * Méthode ouvrant le fichier cache des dernières annonces postées par des utilisateurs * * @param crea_cache : booléen à true si il faut lancer la création du fichier en cas d'absence, * @return tableau contenant les infos des posts telles que fournies par le fichier (peut être vide), false en cas d'erreur * @author Fabrice PENHOËT * */ static function get_liste_derniers_posts_cache($crea_cache=false) { global $Bd; $fichier=CACHE_REP."/".CACHE_REP_POSTS."/derniers.txt"; if(!file_exists($fichier)) { if($crea_cache) { if(empty($GLOBALS['Bd'])) require("connexion-bd.php"); if(empty($GLOBALS['Bd'])) return false; if(self::get_liste_derniers_posts(true)===false) return false; } else return false; } if(!file_exists($fichier))//ne devrait pas être possible mais... { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_FICHIER_EXISTE." >> ".$fichier)); return false; } include($fichier); if(empty($t)) return false; else return $t; } /** * Méthode supprimant les anciens posts de la base de données * Le cas des liens venant des flux est traité dans FclFlux_flux->import_liens() * J'en profite pour supprimer les clics les plus anciens dans stat_clics_posts * * @return booléen suivant succès * @author Fabrice PENHOËT **/ static function supprime_anciens_posts() { global $Bd; if((isset_connexion(__FILE__,__LINE__)===false)) return false; $now=time(); $sql_time_limite="((time_expiration!=0 AND time_expiration<$now) OR (time_expiration=0 AND time_diffusion=0 AND time_crea+(".POSTS_MAX_JOURS."*24*3600)<$now) OR (time_expiration=0 AND time_diffusion!=0 AND time_diffusion+(".POSTS_MAX_JOURS."*24*3600)<$now))"; // on traite 1 par 1 les posts ayant un auteur car dans ce cas il peut y avoir un fichier cache et ou une image à supprimer $get_posts_auteur=$Bd->query("SELECT id_post FROM hub_post WHERE ($sql_time_limite AND (auteur_id IS NOT NULL));"); if((test_requete(__FILE__,__LINE__,$get_posts_auteur)===false)) return false; $posts_auteur=$get_posts_auteur->fetchAll(PDO::FETCH_ASSOC); foreach($posts_auteur as $post_infos) { $post_suppr=new FclFlux_post(); $post_suppr->id_post=$post_infos["id_post"]; $post_suppr->supprime();//--> actualise le cache des diverses listes de posts concernées } unset($post_suppr); // suppression de tous les clics enregistrés dont on plus besoin // c'est-à-dire les clics des utilisateurs n'ayant plus d'abonnement actif. $suppr_clics=$Bd->query("DELETE FROM stat_clics_posts WHERE ((utilisateur_id NOT IN(SELECT DISTINCT auteur_id FROM `abonnements` where jours_alerte!='')));"); if((test_requete(__FILE__,__LINE__,$suppr_clics)===false)) return false; unset($suppr_clics); // la suppression des clics obsolètes des abonnements toujours actifs se fait dans FclFlux_abonnement::desactivation() // + suppression des annonces qui n'ont jamais été validées par leur auteur. $time_limite=time()-COMPTE_VALIDATION_MAX_DUREE*24*3600; $suppr=$Bd->query("DELETE FROM hub_post WHERE ((time_crea<$time_limite) AND (flux_id=NULL) AND (auteur_id=NULL));"); if((test_requete(__FILE__,__LINE__,$suppr)===false)) return false; unset($suppr); return true; } /** * 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="