-
Notifications
You must be signed in to change notification settings - Fork 0
/
View.php
108 lines (93 loc) · 3.06 KB
/
View.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
<?php
/**
* Excepción: Archivo de vista no encontrado (plantilla o parcial)
*/
class ViewFileNotFoundException extends Exception {
public function __construct($file) {
parent::__construct("No se ha podido encontrar el archivo de vista ${file}");
}
}
/**
* Clase View
* Gestiona y procesa plantillas y renders
*/
final class View {
/** Plantilla a utilizar */
static private $template = "index";
/** Lista de archivos a utilizar */
static private $files = [];
/** Lista de parámetros para cada archivo */
static private $params = [];
/**
* Utilizar una plantilla.
*
* @param string $newTemplate Plantilla a utilizar.
*/
static public function template($newTemplate) {
// Componer el nombre y la ruta de la plantilla
$fileName = strtolower($newTemplate);
$fullFileName = Application::TEMPLATE_PATH . $fileName . ".php";
// Comprobar la existencia de la plantilla y gestionarla
if (file_exists($fullFileName))
self::$template = $newTemplate;
else
throw new ViewFileNotFoundException($fileName);
}
/**
* Añade una nueva vista a la cola de renderizado.
*
* @param string $newFile Nueva vista a renderizar.
* @param array $params Parámetros de la vista.
*/
static public function load($newFile, $params = []) {
// Componer el nombre y la ruta de la vista
$fileName = strtolower($newFile);
$fullFileName = Application::VIEW_PATH . $fileName . ".php";
// Comprobar la existencia de la plantilla y gestionarla
if (file_exists($fullFileName)) {
self::$files[] = $fullFileName;
// Gestionar los parámetros de la vista
if ($params != []) self::$params[$fullFileName] = $params;
} else {
throw new ViewFileNotFoundException($fileName);
}
}
/**
* Renderiza la plantilla y las vistas en cola.
*/
static public function render() {
// Contenido
$pageContent = "";
$viewContent = "";
// Cargar la plantilla
ob_start();
require_once Application::TEMPLATE_PATH . self::$template . ".php";
$pageContent = ob_get_contents();
ob_end_clean();
// Cargar el contenido de cada vista
foreach (self::$files as $view) {
// Cargar los parámetros de la vista
if (isset(self::$params[$view])) {
foreach (self::$params[$view] as $param => $value)
$$param = $value;
}
// Cargar el contenido de la vista
ob_start();
require_once $view;
$currentViewContent = ob_get_contents();
ob_end_clean();
// Sustituir el contenido de los parámetros de la vista
if (isset(self::$params[$view])) {
foreach (self::$params[$view] as $param => $value) {
$currentViewContent = str_replace("[[" . $param . "]]", $value, $currentViewContent);
$currentViewContent = str_replace("[[ " . $param . " ]]", $value, $currentViewContent);
}
}
$viewContent .= $currentViewContent;
}
$pageContent = str_replace("[[forallio-content]]", $viewContent, $pageContent);
$pageContent = str_replace("[[ forallio-content ]]", $viewContent, $pageContent);
echo $pageContent;
}
}
?>