/*! * GJframework * model/News.class.php * v1.0.0 (03/09/2018) * * Created by Guillaume Juncker on 24/08/2018. * Copyright © Guillaume Juncker. All rights reserved. */ /** * News * Classe de gestion des actualités du site */ class News extends DB { public $storage_img_dir = "", $max_items = 0, $max_img_size = 0; public $id = "", $title = "", $content = "", $img = "", $position = ""; /*------------------------------------------------------------------------------------------------------------------------------*/ /** * __construct * Construit un objet News * [@param mixed $vars: un id ou un tableau de clés => valeurs à rechercher] * @return void */ public function __construct($vars = NULL) { $this->storage_img_dir = $GLOBALS['_SITE']->base_path."/storage/private/news"; $this->max_items = $_SESSION['config']['news']['max_items']; $this->max_img_size = $_SESSION['config']['news']['max_img_size']; parent::__construct($vars); } /*------------------------------------------------------------------------------------------------------------------------------*/ /** * initRequiredVars * Implémentation de la fonction parente * @return void */ protected function initRequiredVars() { $this->required_vars = array("title", "content"); } /** * initUniqueVars * Implémentation de la fonction parente * @return void */ protected function initUniqueVars() { $this->unique_vars = array("title"); } /** * initErrors * Surcharge de la fonction parente pour personnaliser les messages * @return void */ protected function initErrors() { parent::initErrors(); $this->Errors['I_SUCCESS']->message = "L'article a bien été ajouté"; $this->Errors['I_MISSING']->message = "Veuillez renseigner tous les champs obligatoires"; $this->Errors['I_EXISTS']->message = "Un article portant ce titre existe déjà"; $this->Errors['I_ERROR']->message = "Une erreur s'est produite lors de l'ajout de l'article, veuillez réessayer"; $this->Errors['U_SUCCESS']->message = "L'article a bien été modifié"; $this->Errors['U_MISSING']->message = "Veuillez renseigner tous les champs obligatoires"; $this->Errors['U_EXISTS']->message = "Un article portant ce titre existe déjà"; $this->Errors['U_ERROR']->message = "Une erreur s'est produite lors de la modification de l'article, veuillez réessayer"; $this->Errors['O_ERROR'] = new CustomError("danger", "Une erreur s'est produite lors du réordonnancement des articles, veuillez réessayer"); $this->Errors['D_SUCCESS']->message = "L'article a bien été supprimé"; $this->Errors['D_ERROR']->message = "Une erreur s'est produite lors de la suppression de l'article, veuillez réessayer"; } /*------------------------------------------------------------------------------------------------------------------------------*/ /** * getBy * Surcharge de la fonction parente pour charger le paramètre $this->img * @return mixed: l'objet News chargé s'il existe, FALSE sinon */ public function getBy(array $vars) { if(parent::getBy($vars)) { if($img = glob($this->storage_img_dir."/".$GLOBALS['_SITE']->url($this->title).".{png,jpg,jpeg,gif}", GLOB_BRACE)[0]) { $this->img = $img; } return $this; } return FALSE; } /** * getAll * Surcharge de la fonction parente pour appliquer un tri par défaut * @return array: un tableau de tous les Objets */ public function getAll(string $req = "ORDER BY position DESC") { return parent::getAll($req); } /** * maxReached * Détermine si le maximum de news disponible a été atteint * @return bool: TRUE si le max a été atteint, FALSE sinon */ public function maxReached() { return $this->max_items AND $this->count()>= $this->max_items; } /*------------------------------------------------------------------------------------------------------------------------------*/ /** * insert * Surcharge de la fonction parente pour insérer un article avec une image * @return CustomError: l'erreur déclenchée à l'exécution */ public function insert(array $vars, array $img) { if($vars['title']) { $vars['title'] = $title = str_replace(array("/", "\"), "-", $vars['title']);} $vars['position'] = $this->count() + 1; // Insertion en base de données if(($insert_error = parent::insert($vars))->bool()) { // Suppression de l'article le plus ancien si le quota est atteint $this->deleteOlder(); // Vérification de l'image associée if(($uploads_errors = $GLOBALS['_SITE']->Finder->upload($img, array("png", "jpg", "jpeg", "gif"), $this->max_img_size, $this->storage_img_dir))->bool()) { // Stockage de l'image associée move_uploaded_file($img['tmp_name'], $this->storage_img_dir."/".$GLOBALS['_SITE']->url($title).".".strtolower(pathinfo($img['name'], PATHINFO_EXTENSION))); } else { return $uploads_errors;} } return $insert_error; } /** * update * Surcharge de la fonction parente pour modifier un article et/ou son image * @return CustomError: l'erreur déclenchée à l'exécution */ public function update(array $vars, array $img = NULL) { if($vars['title']) { $vars['title'] = $title = str_replace(array("/", "\"), "-", $vars['title']);} else { $title = $this->title;} // Modification en base de données if(($update_error = parent::update($vars))->bool()) { // Remplacement de l'image par une nouvelle if($img['name']) { // Vérification de l'image associée if(($uploads_errors = $GLOBALS['_SITE']->Finder->upload($img, array("png", "jpg", "jpeg", "gif"), $this->max_img_size, $this->storage_img_dir))->bool()) { // Suppression de l'image actuelle if($this->img) { @unlink($this->img);} // Stockage de la nouvelle image associée move_uploaded_file($img['tmp_name'], $this->storage_img_dir."/".$GLOBALS['_SITE']->url($title).".".strtolower(pathinfo($img['name'], PATHINFO_EXTENSION))); } else { return $uploads_errors;} } // Concervation de l'image actuelle else { // Renommage de l'image avec le nouveau titre rename($this->img, $this->storage_img_dir."/".$GLOBALS['_SITE']->url($title).".".strtolower(pathinfo($this->img, PATHINFO_EXTENSION))); } } return $update_error; } /** * delete * Surcharge de la fonction parente pour supprimer l'image associée * @return CustomError: l'erreur déclenchée à l'exécution */ public function delete() { // Suppression de l'image associée if($this->img) { @unlink($this->img);} // Suppression en base de données return parent::delete(); } /** * deleteOlder * Supprime l'article le plus ancien si nécessaire * @return bool: TRUE si l'article le plus ancien à été supprimer ou si ça n'était pas nécessaire, FALSE en cas d'erreur */ private function deleteOlder() { if($this->maxReached()) { $oldernews = new News(array("position" => 1)); return $oldernews->delete()->bool(); } return TRUE; } }