*/ public private(set) array $integratedContent; /** * Garde la dernière instance de vue. * Si il y a un squelette, ce sera l'instance du squelette. * * @var View */ private static self $lastInstance; /** * Permet de construire les informations de la vue. * * @param string $viewName Le nom du fichier de vue. * @param array $viewArgs Les arguments de la vue. * @param bool $autoRender Si la méthode $this->render() est automatiquement exécuté. * @param string|null $skeleton Le squelette du fichier, null correspond à aucun squelette, default correspond au * squelette défini dans la configuration des vues. * @param array $integratedContent Le contenu intégré dans le nouveau squelette. */ public function __construct( string $viewName, array $viewArgs = [], bool $autoRender = true, ?string $skeleton = 'default', array $integratedContent = [] ) { if( !str_ends_with( $viewName, '.php' ) ) { $viewName .= '.php'; } $this->viewName = $viewName; $this->viewArgs = $viewArgs; $this->skeleton = $skeleton; if( $this->skeleton === "default" ){ $this->skeleton = Kernel::$configs['views']['base_view_skeleton']; } $this->integratedContent = $integratedContent; try { if (!file_exists(self::VIEW_PATH . $this->viewName)) { throw new InvalidViewException($this->viewName); } if ($autoRender) { $this->render(); } } catch (InvalidViewException $e) { die( $e->getMessage() ); } } /** * Permet de démarrer le rendu d'une vue. * @return void */ public function startView(): void { ob_start(); } /** * Permet de finir le rendu d'une vue. * @return void */ public function endView(): void { echo ob_get_clean(); } /** * Permet de faire le rendu proprement de la vue. * @return void */ public function render(): void { self::$lastInstance = $this; if( $this->skeleton === null ){ // Si on a pas de squelette, on inclut la vue. // pour accéder aux éléments de la vue, on utilise les méthodes statiques de cette classe. $this->startView(); require self::VIEW_PATH . $this->viewName; $this->endView(); } else { // Si on a un squelette, on charge tout le contenu de la vue enfante. $content = file_get_contents( self::VIEW_PATH . $this->viewName ); // On démarre la vue du squelette. $base = new View( $this->skeleton, $this->viewArgs, skeleton: null, integratedContent: [ 'content' => $content ] ); } } /* * VIEW TOOLS */ /** * Permet d'injecter un contenu sauvegardé dans $this->integratedContent. * * @param string $integratedContentName * @return void N'affiche rien si le contenu n'existe pas. */ public static function inject( string $integratedContentName ): void { if( isset( self::$lastInstance->integratedContent[ $integratedContentName ] ) ) echo self::$lastInstance->integratedContent[ $integratedContentName ]; } /** * Permet de récupérer un argument passé à la vue. * * @param string $argumentName * @return mixed null si l'argument n'existe pas. */ public static function arg( string $argumentName ): mixed { if( isset( self::$lastInstance->viewArgs[ $argumentName ] ) ) return self::$lastInstance->viewArgs[ $argumentName ]; return null; } /** * Permet d'intégrer un bloc à la vue. * * @param string $partialName * @return void N'affiche rien si le bloc n'existe pas. */ public static function partial( string $partialName ): void { if( !str_ends_with( $partialName, '.php' ) ) { $partialName .= '.php'; } if( file_exists( self::VIEW_PATH . 'partials/' . $partialName ) ) { require self::VIEW_PATH . 'partials/' . $partialName; } } public static function getHeadTitle(): string { $siteUrl = Kernel::$configs['general']['website_name']; return Router::$clientRoute->routeName . ' - ' . $siteUrl; } }