From 6ab367d2216bfcc4cb77e86c4ecad9f0fc3400c5 Mon Sep 17 00:00:00 2001 From: Esteban De La Fuente Rubio Date: Sat, 21 Dec 2024 14:32:39 -0300 Subject: [PATCH] =?UTF-8?q?Se=20puede=20especificar=20el=20renderer=20medi?= =?UTF-8?q?ante=20su=20c=C3=B3digo.=20Se=20permite=20obtener=20desde=20lib?= =?UTF-8?q?-pro.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Documento/Renderer/DocumentoRenderer.php | 68 +++++++++++++++++-- 1 file changed, 62 insertions(+), 6 deletions(-) diff --git a/src/Sii/Dte/Documento/Renderer/DocumentoRenderer.php b/src/Sii/Dte/Documento/Renderer/DocumentoRenderer.php index 3a13506..3ae2e72 100644 --- a/src/Sii/Dte/Documento/Renderer/DocumentoRenderer.php +++ b/src/Sii/Dte/Documento/Renderer/DocumentoRenderer.php @@ -24,6 +24,7 @@ namespace libredte\lib\Core\Sii\Dte\Documento\Renderer; +use Illuminate\Support\Str; use libredte\lib\Core\Service\ArrayDataProvider; use libredte\lib\Core\Service\DataProviderInterface; use libredte\lib\Core\Sii\Dte\Documento\AbstractDocumento; @@ -95,13 +96,11 @@ public function renderFromDocumento( AbstractDocumento $documento, array $options = [] ): string { - // Opciones por defecto para el renderizado. - $options = array_merge([ - 'renderer' => $this->defaultRenderer, - ], $options); + // Nnormalizar las opciones. + $options = $this->normalizeOptions($options); // Crear el renderizador de los datos del DTE. - $renderer = $this->getRenderer($options['renderer']); + $renderer = $this->getRendererInstance($options['renderer']); // Renderizar el documento. $data = $renderer->render($documento, $options); @@ -110,13 +109,43 @@ public function renderFromDocumento( return $data; } + /** + * Normaliza las opciones para el renderizado del documento. + * + * Este método: + * + * - Asigna el renderizador por defecto. + * - Determina el nombre de la clase si se pasó como código de renderizado. + * + * @param array $options Opciones sin normalizar. + * @return array Opciones normalizadas. + */ + private function normalizeOptions(array $options): array + { + // Opciones por defecto para el renderizado. + $options = array_merge([ + 'renderer' => $this->defaultRenderer, + ], $options); + + // Si el renderizador tiene "." es el código del renderizador con el + // formato que el renderizador debe utilizar. + if (str_contains($options['renderer'], '.')) { + $aux = explode('.', $options['renderer']); + $options['renderer'] = $this->getRendererClass($aux[0]); + $options['format'] = $aux[1]; + } + + // Entregar las opciones que se normalizaron. + return $options; + } + /** * Obtener el objeto que se encarga de la renderización del documento. * * @param string $render Clase del renderizador que se debe utilizar. * @return AbstractRenderer */ - private function getRenderer(string $renderer): AbstractRenderer + private function getRendererInstance(string $renderer): AbstractRenderer { // Si no existe el renderizador se crea. if (!isset($this->renderers[$renderer])) { @@ -126,4 +155,31 @@ private function getRenderer(string $renderer): AbstractRenderer // Entregar el renderizador solicitado. return $this->renderers[$renderer]; } + + /** + * Determina la clase del renderer que se está solicitando. + * + * @param string $renderer Nombre del renderer solicitado. + * @return string FQCN de la clase del renderer solicitado. + */ + private function getRendererClass(string $renderer): string + { + // Determinar nombre del archivo PHP y de la clase. + $class = Str::studly($renderer) . 'Renderer'; + $file = __DIR__ . '/' . $class . '.php'; + + // La clase existe en el namespace actual. + if (file_exists($file)) { + $class = __NAMESPACE__ . '\\' . $class; + } + // La clase podría existir en lib-pro. + else { + $class = str_replace('\\Core\\', '\\Pro\\', __NAMESPACE__) + . '\\' . $class + ; + } + + // Entregar el FQCN de la clase del renderer buscado. + return $class; + } }