/** * 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; }
/** * 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; }