SMMP/manager/View.php

179 lines
3.6 KiB
PHP

<?php
namespace manager;
use \manager\View;
use \manager\ManagerError;
class View{
public $error = ManagerError::Success;
private $template;
private $content;
private $view;
/* INITIALISATION DE LA VUE VUE
*
* @template<String> Nom du modèle de la vue à utiliser
* @content<Array> Données pour construire la vue à partir du modèle
*
*/
public function __construct($template, $content){
// Si pas parametre manquant, on quitte
if( $template == null ){
$this->error = ManagerError::MissingPath;
return false;
}
/* [1] On vérifie que le template existe
=========================================================*/
$templatePath = $this->checkPath($template);
if( $templatePath === false )
return false;
/* [2] On récupère le chemin du template et on l'enregistre
=========================================================*/
$this->template = $templatePath;
/* [3] On enregistre les paramètres
=========================================================*/
$this->content = $content;
/* [4] On process la vue
=========================================================*/
$this->view = call_user_func(
$this->template,
$this->content
);
}
/* AFFICHE LA VUE CALCULEE
*
*/
public function view(){
echo $this->view;
}
/* VERIFICATION DE L'EXISTENCE D'UN MODELE
*
* @template<String> Chemin du modèle
*
* @return status<Boolean> TRUE si le modèle existe, sinon FALSE
*
*/
private function checkPath($template){
/* [1] On vérifie le format
=========================================================*/
if( !preg_match('/^([a-z]+)\.([a-z]+)$/i', $template, $match) ){
$this->error = ManagerError::ParamError;
return false;
}
/* [2] On vérifie que le template existe
=========================================================*/
$class = '\\manager\\view\\'.$match[1];
$method = $match[2];
/* (1) On vérifie que la classe existe */
if( !class_exists($class) ){
$this->error = ManagerError::UnknownTemplate;
return false;
}
/* (2) On vérifie que la méthode existe */
if( !method_exists($class, $method) ){
$this->error = ManagerError::UnknownTemplate;
return false;
}
/* [3] Si tout est bon, on renvoie les données
=========================================================*/
return [ $class, $method ];
}
/* APPLIQUE UN REMPLACEMENT SIMPLE
*
* @template<String> Contenu HTML du templace
* @content<Array> Variables à insérer
*
* @return result<String> Retourne le templace rempli
*
*/
public static function replace($template, $content){
/* [1] On trie le tableau du plus long au plus court
=========================================================*/
// usort($content, ['\manager\View', 'length_sort']);
// $content = array_reverse($content);
/* [2] On applique chaque remplacement
=========================================================*/
foreach($content as $k=>$v){
/* Tant qu'il y a, on remplace */
if( strpos($template, '@'.$k) !== false )
$template = str_replace('@'.$k, $v, $template);
}
return $template;
}
private static function length_sort($A, $B){
$lenA = strlen($A);
$lenB = strlen($B);
if( $lenA == $lenB ) return strcmp($A, $B);
return ($lenA < $lenB) ? -1 : 1;
}
}
// USE case
//
// $myView = new View('templateParent.templateModel', [
// 'myVar' => 1,
// 'helloMsg' => 'Hello',
// ]);
//
// $myView->view();
//
?>