hellofacteurV1/modele/FclFlux_marque_page.php

349 lines
13 KiB
PHP
Executable File

<?php
/**
* classe dérivée de la classe Lien décrivant les liens sauvegardés par l'utilisateur
* ils peuvent être saisis à "nu" ou via la récupération des infos d'un lien originaire d'un flux
* l'utilisateur peut lancer une recherche parmi ses marque-pages
* il a la haute main pour les actualiser/supprimer comme souhaité
* on a besoin de la classe FclFlux_lien pour désigner l'éventuelle origine du lien.
* + la classe FclFlux_utilisateur pour désigner son propriétaire
*
* @author Fabrice PENHOËT
**/
require_once("lien.php");
require_once("FclFlux_utilisateur.php");
require_once("FclFlux_lien.php");
class FclFlux_marque_page extends Lien
{
public $id_marque_page;
protected $origine;// objet de type FclFlux_lien désignant l'éventuel lien à l'origine du marque-page
protected $motscles;// mots-clés décrivant le lien (utile pour recherche)
protected $time_crea;// timestamp de l'enregistrement du lien
protected $time_maj;// timestamp de la dernière mise à jour du lien
protected $proprietaire;// objet de type FclFlux_utilisateur désigant le propriétaire du lien
/**
* Constructeur qui initialise certains attributs en testant les valeurs fournies
* copier/ coller de la classe héritée mais méthodes contrôlant des champs 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 lien existant
* et lui attribuant l'origine du marque-page si c'est le cas
*
* @param la valeur à contrôler (peut être nulle si saisie libre d'un lien)
* @return booléen suivant succès
* @author Fabrice PENHOËT
**/
public function set_origine($lien)
{
if(empty($lien))
$this->origine=null;
else
{
if(!($lien instanceof FclFlux_lien))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_FORMAT));
return false;
}
if(empty($lien->id_lien))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_FORMAT));
return false;
}
if(!(FclFlux_lien::recherche($lien->id_lien,"id_lien","id_lien")))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_ENREG_ABSENT." >> ".intval($lien->id_lien)));
return false;
}
else
$this->origine=$lien;
}
return true;
}
/**
* Méthode test la valeur fournie pour les mots-clés du marque-pages
*
* @param les mots-clés à contôler
* @return booléen suivant succès
* @author Fabrice PENHOËT
**/
public function set_motscles($motscles)
{
if(empty($this->limites["motscles_long_max"]))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT));
return false;
}
$long_max=$this->limites["motscles_long_max"];
if(!is_int($long_max))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_FORMAT));
return false;
}
$motscles=strip_tags(strval(trim($motscles)));
if(empty($motscles))
$this->motscles=null;
else
$this->motscles=strip_tags(strval(trim($motscles)));
return true;
}
/**
* Méthode testant la validité du propriétaire fourni
*
* @param user : une instance de l'objet FclFlux_utilisateur
* @return booléen suivant succès
* @author Fabrice PENHOËT
**/
public function set_proprietaire($user)
{
if(!($user instanceof FclFlux_utilisateur))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_FORMAT));
return false;
}
if(!isset($user->id_utilisateur))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT));
return false;
}
if(!(FclFlux_utilisateur::recherche($user->id_utilisateur,"id_utilisateur","id_utilisateur")))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_ENREG_ABSENT." >> ".intval($user->id_utilisateur)));
return false;
}
$this->proprietaire=$user;
return true;
}
/**
* Méthode cherchant un marque-page dans le bd via via son id_marque_page, seul identifiant unique
*
* @param l'id du marque-page recherché, son propriétaire + les champs souhaités en sortie
* @return les données de la table dans un tableau si trouvé, false si pas trouvé ou en cas d'erreur
* @author Fabrice PENHOËT
**/
static function recherche($valeur,$proprietaire,$champ_sortie="*")
{
global $Bd;
if((isset_connexion(__FILE__,__LINE__)===false)) return false;
if(!($proprietaire instanceof FclFlux_utilisateur))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_FORMAT));
return false;
}
if(!isset($proprietaire->id_utilisateur))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT));
return false;
}
$prepare=$Bd->prepare("SELECT $champ_sortie FROM utilisateurs_marque_pages WHERE id_marque_page=:valeur and utilisateur_id=:id");
$recherche=$prepare->execute(array(":valeur"=>$valeur,":id"=>$proprietaire->id_utilisateur));
if((test_requete(__FILE__,__LINE__,$recherche,$prepare)===false)) return false;
$resultat=$prepare->fetch(PDO::FETCH_ASSOC);
$prepare=null;
if(empty($resultat))
return false;
else
return $resultat;
}
/**
* Méthode listant les marque-pages d'un utilisateur
*
* @param $crea_cache vaut true si on souhaite stocker le résultat dans un fichier, $champ_sortie les champs souhaités
* @return les données de la table dans un tableau php si trouvé. false si pas trouvé ou en cas d'erreur.
* @author Fabrice PENHOËT
**/
public function get_liste($crea_cache=false,$champ_sortie="*")
{
global $Bd;
if((isset_connexion(__FILE__,__LINE__)===false)) return false;
if(empty($this->proprietaire))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT));
return false;
}
$id=strval($this->proprietaire->id_utilisateur);
$prepare=$Bd->prepare("SELECT $champ_sortie FROM utilisateurs_marque_pages WHERE utilisateur_id=:id ORDER BY time_crea DESC;");
$recherche=$prepare->execute(array(":id"=>$id));
if((test_requete(__FILE__,__LINE__,$recherche,$prepare)===false)) return false;
$resultat=$prepare->fetchAll(PDO::FETCH_ASSOC);
$prepare=null;
if(empty($resultat))
return false;
else if($crea_cache)
return crea_cache(CACHE_REP_UTILISATEURS."/".$id[0]."/MP-$id.txt",$resultat);
else
return $resultat;
}
/**
* Méthode enregistrant un nouveau marque-page
*
* @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->proprietaire)))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT));
return false;
}
if(!empty($this->origine))
$id_origine=$this->origine->id_lien;
else
$id_origine=null;
$prepare=$Bd->prepare("INSERT INTO utilisateurs_marque_pages (ancre,url,utilisateur_id,description,motscles,lien_id,time_crea,time_maj) VALUES (:ancre,:url,:utilisateur_id,:description,:motscles,:lien_id,:date_actuelle,:date_actuelle)");
$ajout=$prepare->execute(array(':ancre'=>$this->designation,':url'=>$this->url,':utilisateur_id'=>$this->proprietaire->id_utilisateur,':description'=>$this->description,':motscles'=>$this->motscles,':lien_id'=>$id_origine,':date_actuelle'=>time()));
if((test_requete(__FILE__,__LINE__,$ajout,$prepare)===false)) return false;
$prepare=null;
$this->get_liste(true);
return true;
}
/**
* Méthode modifiant les informations d'un marque-page
* seul le propriétaire du lien doit pouvoir faire cette opération
*
* @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_marque_page))||(empty($this->proprietaire)))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT." >> ".intval($this->id_marque_page)));
return false;
}
$lien_infos=self::recherche($this->id_marque_page,$this->proprietaire,"id_marque_page");
if(empty($lien_infos))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_ENREG_ABSENT." >> ".intval($this->id_marque_page).",".intval($this->proprietaire->id_utilisateur)));
return false;
}
$prepare=$Bd->prepare("UPDATE utilisateurs_marque_pages SET ancre=:designation,url=:url,description=:description,motscles=:motscles,time_maj=:time WHERE id_marque_page=:id and utilisateur_id=:utilisateur_id;");
$maj=$prepare->execute(array(':designation'=>$this->designation,':url'=>$this->url,':description'=>$this->description,':motscles'=>$this->motscles,':id'=>$this->id_marque_page,':utilisateur_id'=>$this->proprietaire->id_utilisateur,':time'=>time()));
if((test_requete(__FILE__,__LINE__,$maj,$prepare)===false)) return false;
$nb_enreg=$prepare->rowCount();
$prepare=null;
if($nb_enreg==0)
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_MAJ." >> ".intval($this->id_marque_page)));
return false;
}
$this->get_liste(true);
return true;
}
/**
* Méthode supprimant l'enregistrement d'un marque-page
* seul le propriétaire du lien doit pouvoir faire cette opération
*
* @param null
* @return booléen suivant succès
* @author Fabrice PENHOËT
**/
public function supprime()
{
global $Bd;
if((isset_connexion(__FILE__,__LINE__)===false)) return false;
if((empty($this->id_marque_page))||(empty($this->proprietaire)))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT." >> ".intval($this->id_marque_page)));
return false;
}
$prepare=$Bd->prepare("DELETE FROM utilisateurs_marque_pages WHERE id_marque_page=:id and utilisateur_id=:id_utilisateur LIMIT 1;");
$suppr=$prepare->execute(array(':id'=>$this->id_marque_page,':id_utilisateur'=>$this->proprietaire->id_utilisateur));
if((test_requete(__FILE__,__LINE__,$suppr,$prepare)===false)) return false;
$nb_enreg=$prepare->rowCount();
$prepare=null;
if($nb_enreg==0)
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_SUPPR." >> ".intval($this->id_marque_page)));
return false;
}
$this->get_liste(true);
return true;
}
/**
* Méthode de recherche parmi les marque-pages de l'utilisateur pour un mots-clés donné
*
* @param le mot recherché, l'utilisateur concerné, 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,$user,$champ_sortie="*",$debut=0,$fin=30)
{
global $Bd;
if((isset_connexion(__FILE__,__LINE__)===false)) return false;
if(empty($user->id_utilisateur))
{
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT));
return false;
}
$recherche=strip_tags(strval(trim($recherche)));
$longueur=strlen($recherche);
if(($longueur<MP_MIN_RECHERCHE)||($longueur>MP_MAX_RECHERCHE))
{
$this->erreurs=array_merge($this->erreurs,(array) ERREUR_RECHERCHE_LONG);
return false;
}
$recherche="%".str_replace(" ","%",$recherche)."%";
if(!intval($debut))
$debut=0;
if((!intval($fin))||($fin<=$debut))
$fin=$debut+10;
$prepare=$Bd->prepare("SELECT $champ_sortie FROM utilisateurs_marque_pages WHERE (ancre LIKE :recherche OR url LIKE :recherche OR description LIKE :recherche OR motscles LIKE :recherche) and (utilisateur_id=:id) ORDER BY time_crea DESC LIMIT $debut,$fin;");
$recherche=$prepare->execute(array(":recherche"=>$recherche,":id"=>$user->id_utilisateur));
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;
}
/**
* 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="<h3>".__CLASS__."</h3>";
foreach($this as $key => $value)
{
if(is_array($value))
$value=affiche_tableau($value,"<li>#valeur</li>","<ul>","</ul>");
$texte.="$key : $value\n";
}
return $texte;
}
}//fin de la classe