349 lines
13 KiB
PHP
349 lines
13 KiB
PHP
|
<?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
|