Test Failed
Push — master ( e6f4b5...c3cccf )
by
unknown
15:56
created

RendererTemplateService::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 11
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 1

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 4
c 1
b 0
f 0
nc 1
nop 0
dl 0
loc 11
ccs 5
cts 5
cp 1
crap 1
rs 10
1
<?php
2
3
declare(strict_types=1);
4
5
/**
6
 * LibreDTE: Biblioteca PHP (Núcleo).
7
 * Copyright (C) LibreDTE <https://www.libredte.cl>
8
 *
9
 * Este programa es software libre: usted puede redistribuirlo y/o modificarlo
10
 * bajo los términos de la Licencia Pública General Affero de GNU publicada
11
 * por la Fundación para el Software Libre, ya sea la versión 3 de la Licencia,
12
 * o (a su elección) cualquier versión posterior de la misma.
13
 *
14
 * Este programa se distribuye con la esperanza de que sea útil, pero SIN
15
 * GARANTÍA ALGUNA; ni siquiera la garantía implícita MERCANTIL o de APTITUD
16
 * PARA UN PROPÓSITO DETERMINADO. Consulte los detalles de la Licencia Pública
17
 * General Affero de GNU para obtener una información más detallada.
18
 *
19
 * Debería haber recibido una copia de la Licencia Pública General Affero de
20
 * GNU junto a este programa.
21
 *
22
 * En caso contrario, consulte <http://www.gnu.org/licenses/agpl.html>.
23
 */
24
25
namespace libredte\lib\Core\Service;
26
27
use libredte\lib\Core\Service\PathManager;
28
use Mpdf\Mpdf;
29
use Mpdf\Output\Destination;
30
use Twig\Environment;
31
use Twig\Loader\FilesystemLoader;
32
33
/**
34
 * Servicio de renderización de plantillas.
35
 *
36
 * Permite renderizar plantillas Twig a HTML y PDF.
37
 */
38
class RendererTemplateService
39
{
40
    /**
41
     * Formato por defecto que se debe utilizar.
42
     *
43
     * @var string
44
     */
45
    private string $defaultFormat = 'pdf';
46
47
    /**
48
     * Rutas donde están las plantillas.
49
     *
50
     * @var array
51
     */
52
    private array $paths = [];
53
54
    /**
55
     * Cargador de plantillas mediante el sistema de archivos para Twig.
56
     */
57
    private FilesystemLoader $filesystemLoader;
58
59
    /**
60
     * Renderizador de plantillas HTML con Twig.
61
     *
62
     * @var Environment
63
     */
64
    private Environment $twig;
65
66
    /**
67
     * Constructor de la clase.
68
     */
69 2
    public function __construct()
70
    {
71
        // Ubicación por defecto de las plantillas Twig.
72 2
        $this->paths[] = PathManager::getTemplatesPath();
73
74
        // Agregar directorio de plantillas Pro.
75 2
        $this->addTemplatesPathPro();
76
77
        // Crear renderizador de HTML.
78 2
        $this->filesystemLoader = new FilesystemLoader($this->paths);
79 2
        $this->twig = new Environment($this->filesystemLoader);
80
    }
81
82
    /**
83
     * Renderiza una plantilla Twig.
84
     *
85
     * @param string $template Plantilla Twig a renderizar.
86
     * @param array $data Datos que se pasarán a la plantilla Twig.
87
     * @return string Código HTML con el renderizado de la plantilla Twig.
88
     */
89 2
    public function render(string $template, array $data): string
90
    {
91
        // Formato en el que se renderizará la plantilla.
92 2
        $format = $data['options']['format'] ?? $this->defaultFormat;
93
94
        // Renderizar HTML de la plantilla Twig.
95 2
        $html = $this->renderHtml($template, $data);
96
97
        // Si el formato solicitado es HTML se retorna directamente.
98 2
        if ($format === 'html') {
99
            return $html;
100
        }
101
102
        // Renderizar el PDF a partir del HTML.
103 2
        $configPdf = $data['options']['config']['pdf'] ?? [];
104 2
        $pdf = $this->renderPdf($html, $configPdf);
105
106
        // Entregar el contenido del PDF renderizado.
107 2
        return $pdf;
108
    }
109
110
    /**
111
     * Renderiza una plantilla Twig en HTML.
112
     *
113
     * @param string $template Plantilla Twig a renderizar.
114
     * @param array $data Datos que se pasarán a la plantilla Twig.
115
     * @return string Código HTML con el renderizado de la plantilla Twig.
116
     */
117 2
    private function renderHtml(string $template, array $data): string
118
    {
119
        // Resolver plantilla.
120 2
        $template = $this->resolveTemplate($template);
121
122
        // Renderizar la plantilla.
123 2
        return $this->twig->render($template, $data);
124
    }
125
126
    /**
127
     * Renderiza un HTML en un documento PDF.
128
     *
129
     * El renderizado se realiza a partir de un HTML previamente renderizado que
130
     * será pasado a PDF.
131
     */
132 2
    private function renderPdf(string $html, array $config): string
133
    {
134
        // Generar el PDF con mPDF.
135 2
        $mpdf = new Mpdf();
136 2
        $mpdf->WriteHTML($html);
137
138
        // Obtener el contenido del PDF.
139 2
        $pdf = $mpdf->Output('', Destination::STRING_RETURN);
140
141
        // Entregar el contenido del PDF.
142 2
        return $pdf;
143
    }
144
145
    /**
146
     * Resuelve la plantilla que se está solicitando.
147
     *
148
     * Se encarga de:
149
     *
150
     *   - Agregar la extensión a la plantilla.
151
     *   - Agregar el directorio si se pasó una ruta absoluta de la plantilla.
152
     *
153
     * @param string $template
154
     * @return string
155
     */
156 2
    private function resolveTemplate(string $template): string
157
    {
158
        // Agregar extensión.
159 2
        $template .= '.html.twig';
160
161
        // Agregar el directorio si se pasó una ruta absoluta.
162 2
        if ($template[0] === '/') {
163 1
            $dir = dirname($template);
164 1
            $this->filesystemLoader->addPath($dir);
165 1
            $template = basename($template);
166
        }
167
168
        // Entregar nombre de la plantilla.
169 2
        return $template;
170
    }
171
172
    /**
173
     * Agrega el directorio de plantillas Pro si existe.
174
     *
175
     * @return void
176
     */
177 2
    private function addTemplatesPathPro(): void
178
    {
179
        // Si existe lib-pro se omite agregar.
180 2
        if (!class_exists('\libredte\lib\Pro\LibPro')) {
181 2
            return;
182
        }
183
184
        // Agregar directorio.
185
        $this->paths[] = realpath(dirname(__DIR__, 5) . '/resources/templates');
186
    }
187
}
188