L'url courante * * @GET Arguments indirects (variable $_GET) * * @return status Retourne si oui ou non tout s'est bien passe * */ public function __construct($url){ /* [0] On met a jour la configuration =====================================================*/ // Extensions supportees $extensions_conf = json_decode( file_get_contents('http://'.$_SERVER['HTTP_HOST'].self::$extension_config_path), true )['extensions']; self::$supported_extensions = array(); self::$supported_extensions_header = array(); foreach($extensions_conf as $ext=>$head){ array_push(self::$supported_extensions, $ext); array_push(self::$supported_extensions_header, $head); } // Dossiers supportes $parents_conf = json_decode( file_get_contents('http://'.$_SERVER['HTTP_HOST'].self::$parents_config_path), true )['parents']; self::$supported_parents = array(); self::$supported_parents_folder = array(); foreach($parents_conf as $alias=>$folder){ array_push(self::$supported_parents, $alias); array_push(self::$supported_parents_folder, $folder); } /* [1] On recupere les donnees de l'URL ==================================================*/ $serialFlags = array_slice( explode('/',$url), 1 ); /* [2] On check/cree les drapeaux avec ces donnees ==================================================*/ if( !$this->createFlags($serialFlags) ) // Creation des drapeaux return false; // On retourne FALSE, si erreur /* [3] On construit le chemin a partir des tags ==================================================*/ if( !$this->buildPath() ) // Construction du chemin return false; // On retourne FALSE, si erreur /* [4] On gere l'affichage pour l'appel externe ==================================================*/ $this->view(); return true; } /* FONCTION QUI VERIFIE LES DRAPEAUX * * @serialFlags Tableau a indice numerique * * @return correct Retourne si oui ou non les drapeaux sont corrects * */ private function createFlags($serialFlags){ /* [1] Verification des flags (version serialisee) ======================================================*/ $correct = true; // Verification du nombre de drapeaux () au moins 3 $correct = $correct && count($serialFlags) >= 3; // Verification que l'extension est correcte $correct = $correct && array_search($serialFlags[0], self::$supported_extensions) !== false; // Verification du filename $correct = $correct && preg_match('#^[\w_-]+$#i', $serialFlags[1]); // Verification du parent $correct = $correct && array_search($serialFlags[2], self::$supported_parents) !== false; // Verification du sous-parent (optionnel) $opt_subParent = count($serialFlags) >= 4; if( $opt_subParent ) $correct = $correct && preg_match('#^[\w_-]+$#i', $serialFlags[3]); if( !$correct ) return false; /* [2] Creation (non serialisee) des flags ======================================================*/ // Si tout se deroule bien, on cree les flags $this->flags = array( 'extension' => $serialFlags[0], 'filename' => $serialFlags[1], 'parent' => $serialFlags[2] ); // Ajout du sous-parent optionnel if( $opt_subParent ) $this->flags['subparent'] = $serialFlags[3]; return true; } /* FONCTION QUI CONSTRUIT LE CHEMIN A PARTIR DU PATH * * @return fileExists Retourne si oui ou non le fichier cible existe * * @format * * f/extension/filename/parent/:subparent:/ (:OPT:) * */ private function buildPath(){ /* [1] On recupere le HEADER associe a l'extension ==========================================================*/ $index_header = array_search($this->flags['extension'], self::$supported_extensions); // Si l'extension n'est pas repertoriee, on retourne une erreur if( $index_header === false ) return false; // Si aucun header pour cet indice, on retourne une erreur if( !isset(self::$supported_extensions_header[$index_header]) ) return false; // On recupere le header associe $header = self::$supported_extensions_header[$index_header]; /* [2] On recupere le chemin associe au parent ==========================================================*/ $index_parent = array_search($this->flags['parent'], self::$supported_parents); // Si le parent n'est pas repertorie, on retourne une erreur if( $index_parent === false ) return false; // Si aucun dossier pour cet indice, on retourne une erreur if( !isset(self::$supported_parents_folder[$index_parent]) ) return false; // On recupere le dossier associe $parent = self::$supported_parents_folder[$index_parent]; /* [3] Gestion du sous-parent optionnel ==========================================================*/ $opt_subParent = (isset($this->flags['subparent'])) ? $this->flags['subparent'].'/' : ''; /* [4] On definit le header ==========================================================*/ $this->header = $header; /* [5] On construit le chemin ==========================================================*/ $this->path = __ROOT__.$parent.'/'.$opt_subParent.$this->flags['filename'].'.'.$this->flags['extension']; /* [6] On retourne si le fichier existe ou non ==========================================================*/ return file_exists( $this->path ); } /* FUNCTION QUI AFFICHE LA RESSOURCE EN QUESTION * */ public function view(){ // On definit le header header('Content-Type: '.$this->header); // On inclut le contenu include $this->path; } } ?>