limites=$infos["limites"]; unset($infos["limites"]); $erreur_ok=false; foreach ($infos as $attribut => $valeur) { $methode="set_$attribut"; if (method_exists(__CLASS__,$methode)) { if(!$this->$methode($valeur)) $erreur_ok=true; } else $this->$attribut=$valeur; } if(($erreur_ok)&&(empty($this->erreurs))) $this->erreurs=(array) ERREUR_IMPREVUE; } } /** * Méthode vérifiant que le paramètre fourni est bien un utilisateur existant * et lui attribuant la source si c'est le cas * cet attribut ne peut être vide * * @param la valeur à contrôler * @return booléen suivant succès * @author Fabrice PENHOËT **/ public function set_auteur($auteur) { if(!($auteur instanceof FclFlux_utilisateur)) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_FORMAT)); return false; } if(empty($auteur->id_utilisateur)) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_FORMAT)); return false; } $existe=FclFlux_utilisateur::recherche($auteur->id_utilisateur,"id_utilisateur","statut"); if(empty($existe)) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_ENREG_ABSENT." >> ".intval($auteur->id_utilisateur))); return false; } $this->auteur=$auteur; return true; } /** * Méthode vérifiant le texte de description fourni * * @param la description à contôler * @return booléen suivant succès * @author Fabrice PENHOËT */ public function set_description($description) { if(empty($this->limites["description_long_max"])) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT)); return false; } $long_max=$this->limites["description_long_max"]; if(!is_int($long_max)) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_FORMAT)); return false; } $description=strip_tags(strval(trim($description))); if(empty($description)) $this->description=null; else $this->description=get_chaine_debut($description,$long_max," (...)"); return true; } /** * Méthode enregistrant un nouveau site "source" de flux * * @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->url))||(empty($this->designation))||(empty($this->auteur))) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT)); return false; } //la source est-il à valider par un administrateur ? $this->time_crea=time(); $est_admin=$this->auteur->est_admin(); if($est_admin) $this->time_maj=$this->time_crea; else $this->time_maj=0;//reste à valider $prepare=$Bd->prepare("INSERT INTO flux_sources (nom,url,description,time_crea,time_maj,auteur_id) VALUES (:designation,:url,:description,:date_crea,:date_maj,:auteur_id)"); $ajout=$prepare->execute(array(':designation'=>$this->designation,':url'=>$this->url,':description'=>$this->description,':date_crea'=>$this->time_crea,':date_maj'=>$this->time_maj,':auteur_id'=>$this->auteur->id_utilisateur)); if((test_requete(__FILE__,__LINE__,$ajout,$prepare)===false)) return false; $this->id_source=$Bd->lastInsertId(); $prepare=null; $this->crea_cache(); return true; } /** * Méthode modifiant les informations d'un site "source" de flux * * @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->designation))||(empty($this->id_source))) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT)); return false; } $prepare=$Bd->prepare("UPDATE flux_sources SET nom=:designation,url=:url,description=:description,time_maj=:date_actuelle WHERE id_source=:id_source;"); $maj=$prepare->execute(array(':designation'=>$this->designation,':url'=>$this->url,':description'=>$this->description,':date_actuelle'=>time(),':id_source'=>$this->id_source)); if((test_requete(__FILE__,__LINE__,$maj,$prepare)===false)) return false; $prepare=null; $this->crea_cache(); return true; } /** * Méthode supprimant l'enregistrement d'un site "source" de flux * * @param si sauve_flux vaut true je ne peux supprimer une source utilisée par un flux * sinon je supprime la source + tous ses flux et tout ce qui en dépend... * @return booléen suivant succès * @author Fabrice PENHOËT **/ public function supprime($sauve_flux=true) { global $Bd; if((isset_connexion(__FILE__,__LINE__)===false)) return false; if(empty($this->id_source)) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT)); return false; } $prepare=$Bd->prepare("SELECT id_flux FROM flux WHERE source_id=:id_source LIMIT 1;"); $recherche=$prepare->execute(array(':id_source'=>$this->id_source)); if((test_requete(__FILE__,__LINE__,$recherche,$prepare)===false)) return false; $flux=$prepare->fetchAll(); $prepare=null; if(!empty($flux)) { if($sauve_flux) { $this->erreurs=array_merge($this->erreurs,(array) ERREUR_SOURCE_SUPPR_FLUX); return false; } else { foreach($flux as $flux_info) { $flux_suppr=new FclFlux_flux(); $flux_suppr->id_flux=$flux_info["id_flux"]; $flux_suppr->supprime(false);//je supprime également ses dépendances en cascade unset($flux_suppr); } } } $prepare=$Bd->prepare("DELETE FROM flux_sources WHERE id_source=:id_source LIMIT 1;"); $suppr=$prepare->execute(array(':id_source'=>$this->id_source)); 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_source))); return false; } $this->suppr_cache(); return true; } /** * Méthode cherchant une source dans le bd via son id_source (seul champ identifiant) * * @param la valeur recherchée + les champs demandé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=0,$champ_sortie="*") { global $Bd; if((isset_connexion(__FILE__,__LINE__)===false)) return false; if(empty($valeur)) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT)); return false; } $prepare=$Bd->prepare("SELECT $champ_sortie FROM flux_sources WHERE id_source=: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 de recherche parmi les sources pour un mots-clés donné * * @param les champs souhaités en sortie * @return les données de la table dans un tableau php si trouvé. false si pas trouvé ou en cas d'erreur. * @author Fabrice PENHOËT **/ static function recherche_globale($recherche,$champ_sortie="*") { global $Bd; if((isset_connexion(__FILE__,__LINE__)===false)) return false; $recherche=strip_tags(strval(trim($recherche))); $recherche_like="%".str_replace(" ","%",$recherche)."%"; $prepare=$Bd->prepare("SELECT $champ_sortie FROM flux_sources WHERE (nom LIKE :recherche_l OR url LIKE :recherche_l OR description LIKE :recherche_l or id_source=:recherche) ORDER BY nom ASC;"); $recherche=$prepare->execute(array(":recherche_l"=>$recherche_like,":recherche"=>$recherche)); if((test_requete(__FILE__,__LINE__,$recherche,$prepare)===false)) return false; $resultat=$prepare->fetchAll(PDO::FETCH_ASSOC); $prepare=null; if(empty($resultat)) return false; else return $resultat; } /** * Méthode cherchant si il y a des sources qu'un administrateur doit valider. * * @param null * @return les données de la table dans un tableau si trouvé, false si pas trouvé ou en cas d'erreur * @author Fabrice PENHOËT **/ static function get_a_valider() { global $Bd; if((isset_connexion(__FILE__,__LINE__)===false)) return false; $get_sources=$Bd->query("SELECT id_source,nom FROM flux_sources WHERE time_maj=0"); if((test_requete(__FILE__,__LINE__,$get_sources)===false)) return false; $resultat=$get_sources->fetchAll(PDO::FETCH_ASSOC); if(empty($resultat)) return false; else return $resultat; } /** * Méthode création le fichier cache contenant les infos utiles d'une source * id_source doit être connue * * @return booléen suivant succès * @author Fabrice PENHOËT **/ public function crea_cache() { if(empty($this->id_source)) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT)); return false; } $infos=self::recherche($this->id_source,"nom,url,description"); if($infos===false) return false; $id=strval($this->id_source); return crea_cache(CACHE_REP_SOURCES."/".$id[0]."/$id.txt",$infos); } /** * Méthode listant les flux pour une origine donnée * * @param $crea_cache : un booléen pour savoir si il faut enregistrer le résultat dans un fichier * @return liste des id des rubriques dans un tableau si trouvé (peut être vide), false en cas d'erreur * @author Fabrice PENHOËT !!! à priori ne sert nulle part * public function get_liste_flux($crea_cache=false) { global $Bd; if((isset_connexion(__FILE__,__LINE__)===false)) return false; if(empty($this->id_source)) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT)); return false; } $prepare=$Bd->prepare("SELECT id_flux FROM flux WHERE source_id=:valeur ORDER BY time_crea"); $recherche=$prepare->execute(array(":valeur"=>$this->id_source)); if((test_requete(__FILE__,__LINE__,$recherche,$prepare)===false)) return false; $resultat=$prepare->fetchAll(PDO::FETCH_ASSOC); $prepare=null; $id=strval($this->id_source); if($crea_cache) { if(!empty($resultat)) return crea_cache(CACHE_REP_SOURCES."/".$id[0]."/flux-".$id.".txt",$resultat); else return unlink(CACHE_REP_SOURCES."/".$id[0]."/flux-".$id.".txt"); } else return $resultat; }*/ /** * Méthode de suppression du fichier cache contenant les infos d'une source de flux * + celui listant les flux de cette source * id_source doit être connu * * @return booléen suivant succès * @author Fabrice PENHOËT **/ /** * Méthode retournant la liste des abonnés actifs d'un source (et donc leur nombre) * * @return les données dans un tableau php, false en cas d'erreur * @author Fabrice PENHOËT **/ public function get_liste_abonnes() { global $Bd; if((isset_connexion(__FILE__,__LINE__)===false)) return false; if(empty($this->id_source)) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT)); return false; } $stats=array(); $get_actifs=$Bd->query("SELECT DISTINCT A.auteur_id FROM abonnements as A,abonnements_hub as H,hub_flux as HF,flux as F WHERE ((A.id_abonnement=H.id_abonnement) AND (H.id_hub=HF.id_hub) AND (HF.id_flux=F.id_flux) AND (F.source_id=".$this->id_source.") AND (A.jours_alerte!='') AND (A.actif_ok=1));"); if((test_requete(__FILE__,__LINE__,$get_actifs)===false)) return false; $stats["actifs"]=$get_actifs->fetchAll(); unset($get_actifs); $get_inactifs=$Bd->query("SELECT DISTINCT A.auteur_id FROM abonnements as A,abonnements_hub as H,hub_flux as HF,flux as F WHERE ((A.id_abonnement=H.id_abonnement) AND (H.id_hub=HF.id_hub) AND (HF.id_flux=F.id_flux) AND (F.source_id=".$this->id_source.") AND (A.jours_alerte=''));"); if((test_requete(__FILE__,__LINE__,$get_inactifs)===false)) return false; $stats["inactifs"]=$get_inactifs->fetchAll(); unset($get_inactifs); $get_en_pause=$Bd->query("SELECT DISTINCT A.auteur_id FROM abonnements as A,abonnements_hub as H,hub_flux as HF,flux as F WHERE ((A.id_abonnement=H.id_abonnement) AND (H.id_hub=HF.id_hub) AND (HF.id_flux=F.id_flux) AND (F.source_id=".$this->id_source.") AND (A.jours_alerte!='') AND (A.actif_ok=0));"); if((test_requete(__FILE__,__LINE__,$get_en_pause)===false)) return false; $stats["en_pause"]=$get_en_pause->fetchAll(); unset($get_en_pause); return $stats; } /** * Méthode retournant le nombre de clics cumulés des flux de cette source * * @return nombre entier, false en cas d'erreur * @author Fabrice PENHOËT **/ public function get_nb_clics() { global $Bd; if((isset_connexion(__FILE__,__LINE__)===false)) return false; if(empty($this->id_source)) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT)); return false; } $get_clics=$Bd->query("SELECT SUM(nb_clics) as Total FROM flux WHERE source_id=".$this->id_source." GROUP BY source_id;"); if((test_requete(__FILE__,__LINE__,$get_clics)===false)) return false; $res=$get_clics->fetch(); unset($get_clics); return $res["Total"]; } public function suppr_cache() { if(empty($this->id_source)) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT)); return false; } $fichier=$this->id_source.".txt"; $chemin=CACHE_REP."/".CACHE_REP_SOURCES."/".$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 false; } $fichier="flux-".$this->id_source.".txt"; $chemin=CACHE_REP."/".CACHE_REP_SOURCES."/".$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 false; } return true; } /** * Méthode ouvrant le fichier cache contenant les infos d'une source * * @param crea_cache : un booléen pour savoir si il faut tester la création du fichier en cas d'absence * @return tableau contenant les infos de la soruce 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_source)) { $ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT)); return false; } $id=strval($this->id_source); $fichier=CACHE_REP."/".CACHE_REP_SOURCES."/".$id[0]."/$id.txt"; $infos=array(); if(!file_exists($fichier)) { if($crea_cache) { if(empty($GLOBALS['Bd'])) require("connexion-bd.php"); if(empty($GLOBALS['Bd'])) return false; if(!$this->crea_cache()) return false; } else return false; } include($fichier); if(empty($t)) return false; else { foreach($t as $key => $value) $infos[$key]=stripslashes($value); } if(empty($infos)) return false; else return $infos; } }//fin de la classe