/** * Récupère les statistiques des visites * @return array Un tableau des statistiques sur les visites * @static */ public static function getStat() { $visiteDAO = new VisiteDAO(BDD::getInstancePDO()); $arr['total'] = $visiteDAO->getCount(); $arr['today'] = $visiteDAO->getCountToday(); $arr['now'] = $visiteDAO->getCountNow(); return $arr; }
/** * Supprimer un Token * @param $id_token L'identifiant du Token à supprimer * @return object 2 attributs, bool success et array string msg * @static */ public static function dropToken($id_token) { $std = (object) array('success' => false, 'msg' => array()); $tokenDAO = new TokenDAO(BDD::getInstancePDO()); $token = $tokenDAO->getOne($id_token); if ($token->id_membre == $_SESSION['user']->id_membre || $_SESSION['user']->groupe == 'Administrateur') { if ($tokenDAO->desactiver($id_token)) { $std->msg[] = 'Token désactivé'; $std->success = true; return $std; } else { $std->msg[] = 'Erreur BDD'; } } else { $std->msg[] = 'Vous n\'avez pas le droit de supprimer ce token'; } return $std; }
/** * Envoi un email * @return object 2 attributs, bool success et array string msg */ public function sendMail() { $resCheck = $this->check(); $res = $resCheck; if ($resCheck->success === true) { $param = array('pseudo' => 'Admin', 'pseudoExpediteur' => $this->pseudo, 'emailExpediteur' => $this->email, 'sujet' => $this->sujet, 'message' => nl2br($this->message)); $mail = new Mail(DESTINATAIRE_MAIL_CONTACT, '[Technote] Contact', 'mail_contact.twig', $param); $resMail = $mail->sendMail(); $res->success = $resCheck->success && $resMail->success; $res->msg = array_merge($res->msg, $resMail->msg); if ($resMail->success === true && !empty($_SESSION['user'])) { $actionDAO = new ActionDAO(BDD::getInstancePDO()); $action = new Action(array('id_action' => DAO::UNKNOWN_ID, 'libelle' => 'Contact par formulaire', 'id_membre' => $_SESSION['user']->id_membre)); $actionDAO->save($action); } } return $res; }
/** * Effectue une recherche de Technote, ou compte le nombre de résultats pour cette recherche * @param $max Le nombre de technotes par page * @param $conditions Le tableau contenant les parametres de recherche * @param bool $count True si c'est pour avoir le nombre de résultat (pagination), false si c'est pour avoir les technotes * @param int $debut La première technote à récupérer * @return array|mixed Les technotes correspondant à la recherche */ public function getTechnotesWithSearch($max, $conditions, $count = false, $debut = 0) { $res = array(); $where = ''; $join = ''; $param = array(); // Partie titre technote if (!empty($conditions['titre'])) { $param['titre'] = '%' . $conditions['titre'] . '%'; $where .= " AND t.titre LIKE :titre"; } // Partie date if (!empty($conditions['date_debut']) && !empty($conditions['date_fin'])) { $conditions['date_debut'] .= ' 00:00:00'; $conditions['date_fin'] .= ' 23:59:59'; $param['date_debut'] = $conditions['date_debut']; $param['date_fin'] = $conditions['date_fin']; $where .= " AND date_creation BETWEEN :date_debut AND :date_fin"; } elseif (!empty($conditions['date_debut'])) { $conditions['date_debut'] .= ' 00:00:00'; $param['date_debut'] = $conditions['date_debut']; $where .= " AND date_creation BETWEEN :date_debut AND NOW()"; } elseif (!empty($conditions['date_fin'])) { $conditions['date_fin'] .= ' 23:59:59'; $param['date_fin'] = $conditions['date_fin']; $where .= " AND date_creation < :date_fin"; } // Partie auteur if (!empty($conditions['auteur'])) { $param['auteur'] = $conditions['auteur']; $where .= " AND ma.pseudo = :auteur"; } // Partie mots clés if (!empty($conditions['mots_cles'])) { $sqlMCObligatoire = ''; $sqlMCNonObligatoire = ''; foreach ($conditions['mots_cles'] as $mc) { if ($mc[0] == '+') { $sqlMCObligatoire .= '\'' . substr($mc, 1) . '\', '; // On enleve le + pour la requete } else { $sqlMCNonObligatoire .= '\'' . $mc . '\', '; } } $sqlMCObligatoire = substr($sqlMCObligatoire, 0, -2); $sqlMCNonObligatoire = substr($sqlMCNonObligatoire, 0, -2); if (!empty($sqlMCObligatoire)) { $where .= " AND NOT EXISTS(SELECT id_mot_cle FROM mot_cle mc WHERE label IN ({$sqlMCObligatoire}) AND NOT EXISTS(SELECT * FROM decrire d WHERE mc.id_mot_cle=d.id_mot_cle AND d.id_technote=t.id_technote))"; } else { $join .= ' LEFT JOIN decrire d ON d.id_technote=t.id_technote'; $where .= " AND d.id_mot_cle IN(SELECT id_mot_cle FROM mot_cle WHERE label IN({$sqlMCNonObligatoire}))"; } } // Si c'est pour savoir le nombre de résultats (pagination) if ($count) { $sql = 'SELECT COUNT(DISTINCT t.id_technote) nbRes FROM technote t INNER JOIN membre ma ON ma.id_membre=t.id_auteur LEFT JOIN membre mm ON mm.id_membre=t.id_modificateur ' . $join . ' WHERE publie = 1 AND visible = 1 ' . $where; $req = $this->pdo->prepare($sql); $req->execute($param); $res = $req->fetch(); return $res->nbRes; } $sql = 'SELECT DISTINCT t.*, ma.pseudo auteur, mm.pseudo modificateur FROM technote t INNER JOIN membre ma ON ma.id_membre=t.id_auteur LEFT JOIN membre mm ON mm.id_membre=t.id_modificateur ' . $join . ' WHERE publie = 1 AND visible = 1 ' . $where . ' ORDER BY date_creation DESC LIMIT ' . $debut . ', ' . $max; // Ne peut pas etre preparé car échapé (LIMIT '9', '0' => FAIL) $req = $this->pdo->prepare($sql); $req->execute($param); foreach ($req->fetchAll() as $ligne) { // Recuperation des mot-cles correspondant a la technote $decrireDAO = new DecrireDAO(BDD::getInstancePDO()); $ligne->motsCles = $decrireDAO->getAllForOneTechnote($ligne->id_technote); $res[] = new Technote(get_object_vars($ligne)); } return $res; }
public static function recherche(&$param, $page) { $std = (object) array('success' => false, 'msg' => array()); $cond = array(); $strPagination = ''; // On construit l'URL pour la pagination, et on construit un tableau pour la requête SQL if (!empty($param['titre'])) { $cond['titre'] = $param['titre']; $strPagination .= '&titre=' . urlencode($param['titre']); } if (!empty($param['date_debut'])) { if (($res = Date::verifierDate($param['date_debut'])) !== true) { $std->msg[] = $res . ' (date de début)'; } else { $cond['date_debut'] = $param['date_debut']; $strPagination .= '&date_debut=' . $param['date_debut']; } } if (!empty($param['date_fin'])) { if (($res = Date::verifierDate($param['date_fin'])) !== true) { $std->msg[] = $res . ' (date de fin)'; } else { $cond['date_fin'] = $param['date_fin']; $strPagination .= '&date_fin=' . $param['date_fin']; } } if (!empty($param['resolu'])) { if ($param['resolu'] != 'oui' && $param['resolu'] != 'non') { $std->msg[] = 'Valeur invalide pour le champ résolu'; } else { $cond['resolu'] = $param['resolu']; $strPagination .= '&resolu=' . $param['resolu']; } } if (!empty($param['mots_cles'])) { // Construit un tableau de mots clés $tabMC = explode(',', $param['mots_cles']); $tabMCClean = array(); foreach ($tabMC as $key => $value) { // On enlève les espaces de début et de fin $valueClean = trim($value); if ($valueClean != '') { $tabMCClean[] = $valueClean; // Si le mot clé est obligatoire, on supprime le + de début if ($valueClean[0] == '+') { $valueClean = substr($valueClean, 1); } if (($res = MotCle::checkExisteByLabel($valueClean)) !== true) { $std->msg[] = $res; } } } $cond['mots_cles'] = $tabMCClean; } // S'il y a des erreurs, on s'arrête if (!empty($std->msg)) { return $std; } $questionDAO = new QuestionDAO(BDD::getInstancePDO()); // On récupère le nombre de questions qu'on a en résultat $count = $questionDAO->getQuestionsWithSearch(NB_QUESTIONS_PAGE, $cond, true); // On créé la pagination $std->pagination = new Pagination($page, $count, NB_QUESTIONS_PAGE, '/questions?recherche=' . $strPagination . '&page='); // On récupère les questions $std->questions = $questionDAO->getQuestionsWithSearch(NB_QUESTIONS_PAGE, $cond, false, $std->pagination->debut); if (empty($std->questions)) { $std->msg[] = 'Aucune question avec ces critères'; } else { $std->success = true; } return $std; }
public function getAllForOneGroupeTree($id_groupe) { $res['id_groupe'] = $id_groupe; $res['droits'] = $this->getAllForOneGroupe($id_groupe); $groupeDAO = new GroupeDAO(BDD::getInstancePDO()); $groupe = $groupeDAO->getOne($id_groupe); if (!empty($groupe->id_groupe_parent)) { $res['groupe_parent'] = $this->getAllForOneGroupeTree($groupe->id_groupe_parent); } return $res; }
private static function checkReponseParent(&$id_reponse_parent, $id_technote) { if (!empty($id_reponse_parent)) { $reponseDAO = new ReponseDAO(BDD::getInstancePDO()); if (($res = $reponseDAO->getOne($id_reponse_parent)) !== false) { if ($res->id_question == $id_technote) { return true; } else { return 'La réponse parent n\'appartient pas à la même question'; } } else { return 'La réponse parent n\'existe pas ou plus'; } } $id_reponse_parent = NULL; return true; }
/** * Vérifie que le mot de passe peut etre modifié par oublie * @param array $param Les attributs de la demande de réinitialisation du mot de passe * @return object 2 attributs, bool success et array string msg * @static */ public static function sendMailLostPass(&$param) { $resCheck = self::checkSendMailLostPass($param); $res = $resCheck; if (!isset($resCheck->success)) { $membreRes = $resCheck; $cle = hash('sha256', uniqid(rand(), true) . SALT_RESET_PASS); $membreDAO = new MembreDAO(BDD::getInstancePDO()); $membre = new membre(array('id_membre' => $membreRes->id_membre, 'cle_reset_pass' => $cle)); if (($resSave = $membreDAO->save($membre)) !== false) { $param = array('pseudo' => $membreRes->pseudo, 'sujet' => 'Oubli de mot de passe', 'cle' => $cle); $mail = new Mail($membreRes->email, '[Technote] Oubli de mot de passe', 'mail_lostPass.twig', $param); $resMail = $mail->sendMail(); $res = $resMail; if ($resMail->success === true) { $actionDAO = new ActionDAO(BDD::getInstancePDO()); $action = new Action(array('id_action' => DAO::UNKNOWN_ID, 'libelle' => 'Oubli de mot de passe (création de la clé)', 'id_membre' => $membreRes->id_membre)); $actionDAO->save($action); $res->success = true; $res->msg[0] = 'Un email vous a été envoyé, merci de suivre les instructions'; } } else { $res->success = false; $res->msg[] = 'Erreur BDD'; } } return $res; }
public static function add(&$param) { $std = (object) array('success' => false, 'msg' => array()); if (($res = MotCle::checkLabel($param['label'])) !== true) { $std->msg[] = $res; } if (!empty($std->msg)) { return $std; } // Si c'est un modérateur ou un admin actif, sinon non actif $actif = $_SESSION['user']->groupe == 'Administrateur' || $_SESSION['user']->groupe == 'Modérateur' ? 1 : 0; $motCle = new MotCle(array('id_mot_cle' => DAO::UNKNOWN_ID, 'label' => $param['label'], 'actif' => $actif)); $motCleDAO = new MotCleDAO(BDD::getInstancePDO()); $resSave = $motCleDAO->save($motCle); if ($resSave !== false) { $std->msg[] = 'Mot clé créer avec succès'; } else { $std->msg[] = 'Erreur BDD'; } $actionDAO = new ActionDAO(BDD::getInstancePDO()); $action = new Action(array('id_action' => DAO::UNKNOWN_ID, 'libelle' => "Création d\\'un mot clé (mot clé n°{$resSave->id_mot_cle} : {$resSave->label})", 'id_membre' => $_SESSION['user']->id_membre)); $actionDAO->save($action); $std->success = true; return $std; }
public function mots_cles($action, $id, $vars) { switch ($action) { /**** GET ****/ case 'get': $vars['titrePage'] = 'Les mots clés'; // <h1> de la page $motCleDAO = new MotCleDAO(BDD::getInstancePDO()); $vars['motsCles'] = $motCleDAO->getAllForTable(); $this->vue->display('admin/motsCles_get_all.twig', $vars); exit; /**** EDIT ****/ /**** EDIT ****/ case 'edit': $vars['titrePage'] = 'Modification d\'un mot clé'; // <h1> de la page $motCleDAO = new MotCleDAO(BDD::getInstancePDO()); $vars['motCle'] = $motCleDAO->getOne($id); // Si un formulaire a été envoyé if (!empty($_POST)) { // Si le formulaire est valide au niveau faille CSRF if (!empty($_POST['jetonCSRF']) && $_POST['jetonCSRF'] == $_SESSION['jetonCSRF']) { // On essaye de faire les modifications $res = MotCle::edit($_POST, $id); if ($res->success) { $res->redirect = '/admin/mots_cles'; } echo json_encode($res); exit; } } $this->vue->display('admin/motCle_edit.twig', $vars); exit; /**** DROP ****/ /**** DROP ****/ case 'drop': if (!empty($_POST)) { // Si le formulaire est valide au niveau faille CSRF if (!empty($_POST['jetonCSRF']) && $_POST['jetonCSRF'] == $_SESSION['jetonCSRF']) { echo json_encode(MotCle::delete($id)); } } exit; default: $this->vue->display('404.twig', $vars); exit; } }
public function getTreeForOneQuestion($id_question, $id_reponse_parent) { $res = array(); $op = empty($id_reponse_parent) ? 'IS' : '='; $req = $this->pdo->prepare('SELECT r.*, ma.pseudo auteur, mm.pseudo modificateur FROM reponse r INNER JOIN membre ma ON ma.id_membre=r.id_auteur LEFT JOIN membre mm ON mm.id_membre=r.id_modificateur WHERE id_question = :id_question AND id_reponse_parent ' . $op . ' :id_reponse_parent'); $req->execute(array('id_question' => $id_question, 'id_reponse_parent' => $id_reponse_parent)); $reponseDAO = new ReponseDAO(BDD::getInstancePDO()); foreach ($req->fetchAll() as $ligne) { $ligne->reponses = $reponseDAO->getTreeForOneQuestion($id_question, $ligne->id_reponse); $res[] = new Reponse(get_object_vars($ligne)); } return $res; }
/** * Vérifie si un cookie de connexion est présent et est valide * Si oui remplie la variable de session avec un Membre, sinon session = False et destruction cookie */ public function checkToken() { if (!empty($_COOKIE['token'])) { $req = $this->pdo->prepare('SELECT id_membre FROM token T WHERE cle = :token AND date_expiration > NOW() AND actif = 1'); $req->execute(array('token' => $_COOKIE['token'])); if ($res = $req->fetch()) { $membreDAO = new MembreDAO(BDD::getInstancePDO()); $_SESSION['user'] = $membreDAO->getOne($res->id_membre); // Récupère les doits du groupe du membre $droitGroupeDAO = new DroitGroupeDAO(BDD::getInstancePDO()); $_SESSION['droits']['groupe'] = $droitGroupeDAO->getAllForOneGroupeTree($_SESSION['user']->id_groupe); // Récupère les doits du membre $droitMembreDAO = new DroitMembreDAO(BDD::getInstancePDO()); $_SESSION['droits']['membre'] = $droitMembreDAO->getAllForOneMembre($_SESSION['user']->id_membre); return; } } setcookie('token', '', time()); $_SESSION['user'] = false; }
public function autocomplete($action, $id, $vars) { switch ($action) { case 'get': if (!empty($_GET['type']) && !empty($_GET['term'])) { $res = NULL; if ($_GET['type'] == 'motcle') { $motCleDAO = new MotCleDAO(BDD::getInstancePDO()); $res = $motCleDAO->getAllComposedOf($_GET['term']); } elseif ($_GET['type'] == 'membre') { $membreDAO = new MembreDAO(BDD::getInstancePDO()); $res = $membreDAO->getAllComposedOf($_GET['term']); } elseif ($_GET['type'] == 'titreTechnote') { $technoteDAO = new TechnoteDAO(BDD::getInstancePDO()); $res = $technoteDAO->getAllTitreComposedOf($_GET['term']); } elseif ($_GET['type'] == 'titreQuestion') { $questionDAO = new QuestionDAO(BDD::getInstancePDO()); $res = $questionDAO->getAllTitreComposedOf($_GET['term']); } echo json_encode($res); exit; } $this->vue->display('404.twig', $vars); exit; default: $this->vue->display('404.twig', $vars); exit; } }
public function getTreeOfOneGroupe($id_groupe) { $req = $this->pdo->prepare('SELECT * FROM groupe WHERE id_groupe = :id_groupe'); $req->execute(array('id_groupe' => $id_groupe)); $groupeDAO = new GroupeDAO(BDD::getInstancePDO()); if (($groupe = $req->fetch()) !== false) { $groupe->groupe_parent = $groupeDAO->getTreeOfOneGroupe($groupe->id_groupe_parent); return new DroitGroupe(get_object_vars($groupe)); } else { return false; } }
private static function checkCommentaireParent(&$id_commentaire_parent, $id_technote) { if (!empty($id_commentaire_parent)) { $commentaireDAO = new CommentaireDAO(BDD::getInstancePDO()); if (($res = $commentaireDAO->getOne($id_commentaire_parent)) !== false) { if ($res->id_technote == $id_technote) { return true; } else { return 'Le commentaire parent n\'appartient pas à la même technote'; } } else { return 'Le commentaire parent n\'existe pas ou plus'; } } $id_commentaire_parent = NULL; return true; }
public function getTreeForOneTechnote($id_technote, $id_commentaire_parent) { $res = array(); $op = empty($id_commentaire_parent) ? 'IS' : '='; $req = $this->pdo->prepare('SELECT c.*, ma.pseudo auteur, mm.pseudo modificateur FROM commentaire c INNER JOIN membre ma ON ma.id_membre=c.id_auteur LEFT JOIN membre mm ON mm.id_membre=c.id_modificateur WHERE id_technote = :id_technote AND id_commentaire_parent ' . $op . ' :id_commentaire_parent'); $req->execute(array('id_technote' => $id_technote, 'id_commentaire_parent' => $id_commentaire_parent)); $commentaireDAO = new CommentaireDAO(BDD::getInstancePDO()); foreach ($req->fetchAll() as $ligne) { $ligne->commentaires = $commentaireDAO->getTreeForOneTechnote($id_technote, $ligne->id_commentaire); $res[] = new Commentaire(get_object_vars($ligne)); } return $res; }
require 'Autoloader.php'; Autoloader::Autoload(); // Démarre une session session_start(); // Connecte le client s'il possède un cookie $tokenDAO = new TokenDAO(BDD::getInstancePDO()); if (!isset($_SESSION['user'])) { $tokenDAO->checkToken(); } // Si le client n'est pas connecté if ($_SESSION['user'] === false) { // Récupère l'id du groupe Visiteur $groupeDAO = new GroupeDAO(BDD::getInstancePDO()); $groupe = $groupeDAO->getOneByLibelle('Visiteur'); // Récupère les doits du groupe Visiteur $droitGroupeDAO = new DroitGroupeDAO(BDD::getInstancePDO()); $_SESSION['droits']['groupe'] = $droitGroupeDAO->getAllForOneGroupeTree($groupe->id_groupe); $_SESSION['droits']['membre'] = array(); } // Créé le jeton pour éviter la faille CSRF if (empty($_SESSION['jetonCSRF'])) { $_SESSION['jetonCSRF'] = hash('sha1', uniqid(rand(), true) . SALT_JETON_CSRF); } // Enregistre la visite si c'est la premiere de cette heure $visite = new Visite(array('id_visite' => DAO::UNKNOWN_ID, 'ip' => $_SERVER['REMOTE_ADDR'])); $visite->checkVisite($visite); // Récupération de l'URL $controleur = !empty($_GET['url_controleur']) ? ucfirst($_GET['url_controleur']) : 'Main'; $page = !empty($_GET['url_page']) ? $_GET['url_page'] : 'accueil'; $action = !empty($_GET['url_action']) ? $_GET['url_action'] : 'get'; $id = !empty($_GET['url_id']) ? $_GET['url_id'] : NULL;
/** * Vérifie et ajoute une technote * @param array $param Les attributs de la technotes * @return object 2 attributs, bool success et array string msg * @static */ public static function addTechnote(&$param, &$files) { $resCheck = self::checkTechnote($param, $files, 'add'); $res = $resCheck; if ($resCheck->success === true) { $technoteDAO = new TechnoteDAO(BDD::getInstancePDO()); $technote = new Technote(array('id_technote' => DAO::UNKNOWN_ID, 'titre' => $param['titre'], 'contenu' => $param['contenu'], 'id_auteur' => $_SESSION['user']->id_membre, 'url_image' => $param['url_image'], 'description' => $param['description'], 'publie' => $param['publie'], 'visible' => '1')); if (($resSaveTechnote = $technoteDAO->save($technote)) !== false) { $decrireDAO = new DecrireDAO(BDD::getInstancePDO()); if (!empty($param['id_mot_cle'])) { foreach ($param['id_mot_cle'] as $id_mot_cle) { $decrire = new Decrire(array('id_technote' => $resSaveTechnote->id_technote, 'id_mot_cle' => $id_mot_cle)); $decrireDAO->save($decrire); } } $actionDAO = new ActionDAO(BDD::getInstancePDO()); $action = new Action(array('id_action' => DAO::UNKNOWN_ID, 'libelle' => "Ajout d\\'une technote (technote n°{$resSaveTechnote->id_technote})", 'id_membre' => $_SESSION['user']->id_membre)); $actionDAO->save($action); $res->success = true; $res->id_technote = $resSaveTechnote->id_technote; $res->msg[] = 'Ajout de la technote réussie'; } else { $res->success = false; $res->msg[] = 'Erreur BDD'; } } return $res; }