/*! * GJframework * model/Page.class.php * v1.0.0 (03/09/2018) * * Created by Guillaume Juncker on 24/08/2018. * Copyright © Guillaume Juncker. All rights reserved. */ /** * Page * Classe de gestion des pages du site */ class Page extends DB { public $max_items = 0; public $id = "", $title = "", $url = "", $content = "", $position = "", $menu_id = "", $customizable = TRUE, $visible = FALSE; /*------------------------------------------------------------------------------------------------------------------------------*/ /** * __construct * Construit un objet Page * [@param mixed $vars: un id ou un tableau de clés => valeurs à rechercher] * @return void */ public function __construct($vars = NULL) { $this->max_items = $_SESSION['config']['page']['max_items']; parent::__construct($vars); } /*------------------------------------------------------------------------------------------------------------------------------*/ /** * initRequiredVars * Implémentation de la fonction parente * @return void */ protected function initRequiredVars() { $this->required_vars = array("title", "menu_id"); } /** * initUniqueVars * Implémentation de la fonction parente * @return void */ protected function initUniqueVars() { $this->unique_vars = array("url"); } /** * initErrors * Surcharge de la fonction parente pour personnaliser les messages * @return void */ protected function initErrors() { parent::initErrors(); $this->Errors['I_SUCCESS']->message = "La page a bien été ajoutée"; $this->Errors['I_MISSING']->message = "Veuillez renseigner tous les champs obligatoires"; $this->Errors['I_EXISTS']->message = "Une page portant ce titre existe déjà"; $this->Errors['I_QUOTA'] = new CustomError("warning", "Vous ne pouvez pas créer cette page car le quota de ".$this->max_items." pages a été atteint"); $this->Errors['I_ERROR']->message = "Une erreur s'est produite lors de l'ajout de la page, veuillez réessayer"; $this->Errors['U_SUCCESS']->message = "La page a bien été modifiée"; $this->Errors['U_MISSING']->message = "Veuillez renseigner tous les champs obligatoires"; $this->Errors['U_EXISTS']->message = "Une page portant ce titre existe déjà"; $this->Errors['U_ERROR']->message = "Une erreur s'est produite lors de la modification de la page, veuillez réessayer"; $this->Errors['O_ERROR'] = new CustomError("danger", "Une erreur s'est produite lors du réordonnancement des pages, veuillez réessayer"); $this->Errors['D_SUCCESS']->message = "La page a bien été supprimée"; $this->Errors['D_ERROR']->message = "Une erreur s'est produite lors de la suppression de la page, veuillez réessayer"; } /*------------------------------------------------------------------------------------------------------------------------------*/ /** * getByURL * Version réservée à l'url de la fonction getBy() * @param string $url: une url de page à rechercher * @return mixed: l'Objet chargé s'il existe, FALSE sinon */ public function getByURL(string $url) { return $this->getBy(array("url" => $url)); } /** * 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 = "WHERE url <> 'index' ORDER BY position ASC") { return parent::getAll($req); } /** * getAllVisibles * Variation de la fonction getAll() pour ne récupérer que les pages visibles * @return array: un tableau de tous les Objets */ public function getAllVisibles() { return $this->getAll("WHERE url <> 'index' AND visible = 1 ORDER BY position ASC"); } /** * customizable * Détermine si la page peut être modifiée par l'utilisateur actuel * @return bool: TRUE si la page peut être modifier, FALSE sinon */ public function customizable() { return $this->id AND (($this->customizable AND $GLOBALS['_USER']->accreditation>= User::ACCREDITATION_MODERATOR) OR $GLOBALS['_USER']->accreditation>= User::ACCREDITATION_DEVELOPER); } /** * maxReached * Détermine si le maximum de page 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 une page après vérification du quota et modifications de certaines données * @return CustomError: l'erreur déclenchée à l'exécution */ public function insert(array $vars) { if(!$this->maxReached()) { $vars['url'] = $GLOBALS['_SITE']->url($vars['title']); $vars['content'] = "

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis eros metus, suscipit ac felis ut, eleifend vulputate nulla. Pellentesque tempor mi sed auctor pulvinar. Pellentesque eget enim arcu. Vestibulum et diam lorem. Nunc a ipsum luctus urna sagittis tincidunt vitae at nisi. Proin tristique efficitur pharetra. Praesent eu tortor non dolor aliquam scelerisque at sit amet dui. Nulla condimentum justo erat, sit amet congue quam ultricies eget. Vestibulum sed massa ex. In hac habitasse platea dictumst.

"; $vars['menu_id'] = 1; $vars['customizable'] = $this->customizable; $vars['visible'] = $this->visible; $vars['position'] = $this->count() + 1; return parent::insert($vars); } else { return $this->Errors['I_QUOTA'];} } /** * update * Surcharge de la fonction parente pour modifier une page après vérification et modifications de certaines données * @return CustomError: l'erreur déclenchée à l'exécution */ public function update(array $vars) { if($this->customizable()) { if($this->id > 10) { $vars['url'] = $GLOBALS['_SITE']->url($vars['title']);} return parent::update($vars); } else { return $GLOBALS['_SITE']->Errors['ACCESS'];} } /** * reorder * Surcharge de la fonction parente pour intégrer les menus aux limites de nouvelle position * @return void */ public function reorder(int $new_position) { if($this->menu_id > 1) { // Récupération de la position min et max dans le menu $req = $this->pdo()->prepare("SELECT MIN(position), MAX(position) FROM ".$this->db_table." WHERE menu_id = :menu_id"); $req->execute(array("menu_id" => $this->menu_id)); $fetch = $req->fetch(PDO::FETCH_ASSOC); if($new_position < ($min_position = (int)$fetch['MIN(position)'])) { $new_position = $min_position;} if($new_position > ($max_position = (int)$fetch['MAX(position)'])) { $new_position = $max_position;} } parent::reorder($new_position); } /** * changeMenu * Change le menu et la position d'une page * @param int $menu_id: l'id du menu dans lequel déplacer la page * @return CustomError: l'erreur déclenchée à l'exécution */ public function changeMenu(int $menu_id) { // Récupération de la position max dans le menu de destination if($menu_id > 1) { $req = $this->pdo()->prepare("SELECT MAX(position) FROM ".$this->db_table." WHERE menu_id = :menu_id"); $req->execute(array("menu_id" => $menu_id)); $max_position = (int)$req->fetch(PDO::FETCH_ASSOC)['MAX(position)']; } else { $max_position = $this->count(); } // Calcul de la position de la page pour coller aux autres pages du menu if($max_position== 0) { $new_position = $this->count(); } elseif($this->position < $max_position) { $new_position = $max_position; } else { $new_position = $max_position + 1; } parent::reorder($new_position); // Changement de menu $req = $this->pdo()->prepare("UPDATE ".$this->db_table." SET menu_id = :menu_id WHERE id = :id"); if($req->execute(array("id" => $this->id, "menu_id" => $menu_id))) { return $this->Errors['U_SUCCESS']; } else { return $this->Errors['U_ERROR'];} } /** * toggleVisibility * Permet d'inverser la visibilité d'une page * @return CustomError: l'erreur déclenchée à l'exécution */ public function toggleVisibility() { $req = $this->pdo()->prepare("UPDATE ".$this->db_table." SET visible = NOT visible WHERE id = :id"); if($req->execute(array("id" => $this->id))) { return $this->Errors['U_SUCCESS']; } else { return $this->Errors['U_ERROR'];} } /** * delete * Surcharge de la fonction parente pour supprimer une page après vérification de certaines données * @return CustomError: l'erreur déclenchée à l'exécution */ public function delete() { if($this->customizable()) { return parent::delete();} else { return $GLOBALS['_SITE']->Errors['ACCESS'];} } }