hellofacteurV1/modele/FclFlux_marque_page.php

349 lines
13 KiB
PHP
Raw Permalink Normal View History

2021-11-02 11:23:49 +01:00
<?php
/**
* classe d<EFBFBD>riv<EFBFBD>e de la classe Lien d<EFBFBD>crivant les liens sauvegard<EFBFBD>s par l'utilisateur
* ils peuvent <EFBFBD>tre saisis <EFBFBD> "nu" ou via la r<EFBFBD>cup<EFBFBD>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<EFBFBD>
* on a besoin de la classe FclFlux_lien pour d<EFBFBD>signer l'<EFBFBD>ventuelle origine du lien.
* + la classe FclFlux_utilisateur pour d<EFBFBD>signer son propri<EFBFBD>taire
*
* @author Fabrice PENHO<EFBFBD>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'<27>ventuel lien <20> l'origine du marque-page
protected $motscles;// mots-cl<63>s d<>crivant le lien (utile pour recherche)
protected $time_crea;// timestamp de l'enregistrement du lien
protected $time_maj;// timestamp de la derni<6E>re mise <20> jour du lien
protected $proprietaire;// objet de type FclFlux_utilisateur d<>sigant le propri<72>taire du lien
/**
* Constructeur qui initialise certains attributs en testant les valeurs fournies
* copier/ coller de la classe h<EFBFBD>rit<EFBFBD>e mais m<EFBFBD>thodes contr<EFBFBD>lant des champs suppl<EFBFBD>mentaires
*
* @param $infos tableau contenant les diff<EFBFBD>rentes donn<EFBFBD>es correspondant aux attributs (suppos<EFBFBD>s homonymes)
* @return null
* @author Fabrice PENHO<EFBFBD>T
**/
public function __construct($infos=null)
{
if((!empty($infos))&&(is_array($infos)))
{
//les limites doivent <20>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<EFBFBD>thode v<EFBFBD>rifiant que le param<EFBFBD>tre fourni est bien un lien existant
* et lui attribuant l'origine du marque-page si c'est le cas
*
* @param la valeur <EFBFBD> contr<EFBFBD>ler (peut <EFBFBD>tre nulle si saisie libre d'un lien)
* @return bool<EFBFBD>en suivant succ<EFBFBD>s
* @author Fabrice PENHO<EFBFBD>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<EFBFBD>thode test la valeur fournie pour les mots-cl<EFBFBD>s du marque-pages
*
* @param les mots-cl<EFBFBD>s <EFBFBD> cont<EFBFBD>ler
* @return bool<EFBFBD>en suivant succ<EFBFBD>s
* @author Fabrice PENHO<EFBFBD>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<EFBFBD>thode testant la validit<EFBFBD> du propri<EFBFBD>taire fourni
*
* @param user : une instance de l'objet FclFlux_utilisateur
* @return bool<EFBFBD>en suivant succ<EFBFBD>s
* @author Fabrice PENHO<EFBFBD>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<EFBFBD>thode cherchant un marque-page dans le bd via via son id_marque_page, seul identifiant unique
*
* @param l'id du marque-page recherch<EFBFBD>, son propri<EFBFBD>taire + les champs souhait<EFBFBD>s en sortie
* @return les donn<EFBFBD>es de la table dans un tableau si trouv<EFBFBD>, false si pas trouv<EFBFBD> ou en cas d'erreur
* @author Fabrice PENHO<EFBFBD>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<EFBFBD>thode listant les marque-pages d'un utilisateur
*
* @param $crea_cache vaut true si on souhaite stocker le r<EFBFBD>sultat dans un fichier, $champ_sortie les champs souhait<EFBFBD>s
* @return les donn<EFBFBD>es de la table dans un tableau php si trouv<EFBFBD>. false si pas trouv<EFBFBD> ou en cas d'erreur.
* @author Fabrice PENHO<EFBFBD>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<EFBFBD>thode enregistrant un nouveau marque-page
*
* @return bool<EFBFBD>en suivant succ<EFBFBD>s
* @author Fabrice PENHO<EFBFBD>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<EFBFBD>thode modifiant les informations d'un marque-page
* seul le propri<EFBFBD>taire du lien doit pouvoir faire cette op<EFBFBD>ration
*
* @return bool<EFBFBD>en suivant succ<EFBFBD>s
* @author Fabrice PENHO<EFBFBD>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<EFBFBD>thode supprimant l'enregistrement d'un marque-page
* seul le propri<EFBFBD>taire du lien doit pouvoir faire cette op<EFBFBD>ration
*
* @param null
* @return bool<EFBFBD>en suivant succ<EFBFBD>s
* @author Fabrice PENHO<EFBFBD>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<EFBFBD>thode de recherche parmi les marque-pages de l'utilisateur pour un mots-cl<EFBFBD>s donn<EFBFBD>
*
* @param le mot recherch<EFBFBD>, l'utilisateur concern<EFBFBD>, les champs souhait<EFBFBD>s en sortie.
* @return les donn<EFBFBD>es de la table dans un tableau php si trouv<EFBFBD>. false si pas trouv<EFBFBD> ou en cas d'erreur.
* @author Fabrice PENHO<EFBFBD>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<EFBFBD>faut d'un objet
*
* @return cha<EFBFBD>ne de caract<EFBFBD>res listant la valeur de chaque attribut
* @author Fabrice PENHO<EFBFBD>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