hellofacteurV1/modele/FclFlux_source.php

456 lines
16 KiB
PHP
Executable File

<?php
/**
* classe dérivée de la classe Lien décrit les sites "source" des flux
* on a aussi besoin de la classe FclFlux_utilisateur
*
* @author Fabrice PENHOËT
**/
require_once("lien.php");
require_once("FclFlux_utilisateur.php");
require_once("FclFlux_flux.php");
class FclFlux_source extends Lien
{
public $id_source;
protected $auteur;// l'utilisateur ayant saisi la source initialement (qui a pu être modidiée par un autre depuis)
protected $description;
/**
* Constructeur qui initialise certains attributs en testant les valeurs fournies
* copier/ coller de la classe héritée du fait de méthodes contrôlant des attributs supplémentaires
*
* @param infos tableau contenant les différentes données correspondant aux attributs (supposés homonymes)
* @return null
* @author Fabrice PENHOËT
**/
public function __construct($infos=null)
{
if((!empty($infos))&&(is_array($infos)))
{
//les limites doivent être connues avant le reste
if(!empty($infos["limites"]))
$this->limites=$infos["limites"];
unset($infos["limites"]);
$erreur_ok=false;
foreach ($infos as $attribut => $valeur)
{
$methode="set_$attribut";
if (method_exists(__CLASS__,$methode))
{
if(!$this->$methode($valeur))
$erreur_ok=true;
}
else
$this->$attribut=$valeur;
}
if(($erreur_ok)&&(empty($this->erreurs)))
$this->erreurs=(array) ERREUR_IMPREVUE;
}
}
/**
* Méthode 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