456 lines
16 KiB
PHP
Executable File
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
|