3.4.01. Parametrización de plantillas de anexos - diezMalena/api_FCTFiller GitHub Wiki

Introducción

FCTFiller es una aplicación de gestión documental que generará archivos de dos clases: documentos de texto (.docx) y hojas de cálculo (.xslx). Esto se consigue desde la API utilizando varios elementos:

  • Librerías de lectura y escritura en documentos: PHPOffice (PHPWord y PHPSpreadSheet). Pueden editar el contenido de los documentos mediante el uso de arrays asociativos.
  • Plantillas de los documentos a rellenar, parametrizadas y en los formatos correctos (.docx, .xslx).

Set de funciones modelToArray

Para agilizar el desarrollo del proyecto y facilitar el relleno de documentos, se desarrollaron en la API un grupo de funciones que convierten los modelos en arrays asociativos. Son métodos estáticos localizados en la clase Auxiliar:

  • modelToArray(Model $modelo, string $prefijoClave): transforma un modelo en un vector asociativo y añade el prefijo a los índices, concatenándolo con un '.'. Por ejemplo:
    $arr = Auxiliar::modelToArray($user, 'user');
    echo($arr)
    // --> ['user.id' => 1, 'user.email' => '[email protected]', ...]
    
  • modelsToArray(array $modelos, array $prefijos): transforma un vector de modelos en un solo array asociativo, añadiendo los prefijos correspondientes en las mismas posiciones, concatenándolos con un '.'. Por ejemplo:
    $arr = Auxiliar::modelsToArray([$user, $empresa], ['user', 'empresa'])
    echo($arr)
    // --> ['user.id' => 1, 'user.email' => '[email protected]', ..., 'empresa.cif' => '1A', 'empresa.localidad' => 'Puertollano', ...]
    

Plantillas de texto (.docx)

El primer requisito para que FCTFiller pueda utilizar las plantillas es que estén en formato .docx. No se admiten documentos en formatos distintos.

Para preparar el archivo de cada anexo, debe parametrizarse. Cada uno de los campos a rellenar debe sustituirse por la siguiente estructura: ${objeto.campo}. El objeto representa una tabla de la base de datos (o modelos), es decir, un elemento concreto y complejo que contiene información más simple. Dicha información más simple está representada mediante el campo.

Podemos trasladar los resultados de los ejemplos desarrollados en el ejemplo anterior, de forma que algunos parámetros válidos serían: ${user.id}, ${user.email}, ${empresa.cif} o ${empresa.localidad}. Estos datos serían sustituidos por sus valores.

La forma de utilizar la librería PHPWord está detallada en este repositorio de ejemplo

Plantillas de hoja de cálculo (.xlsx)

Los libros de Microsoft Excel pueden editarse mediante la librería PhpSpreadsheet. Es muy sencillo acceder al contenido del libro y puede realizarse de diversas maneras. En este proyecto se ha optado por acceder a las filas y columnas del libro mediante el mismo índice alfanumérico que nos presenta Excel (A1, B2, etc...)

Para acceder a las filas y columnas según estos índices, utilizaremos la función setCellValue($rowColumn, $data).

El procedimiento completo es el siguiente:

  1. Importar las clases PhpOffice\PhpSpreadsheet\Reader\Xlsx y PhpOffice\PhpSpreadsheet\Writer\Xlsx. Como disponen del mismo nombre (aunque son clases diferentes), es recomendable importarlas con alias para que no exista ambiguedad de nombres:
use PhpOffice\PhpSpreadsheet\Reader\Xlsx as ReaderXlsx;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx as WriterXlsx;
  1. Definir una nueva instancia del objeto ReaderXlsx y leer la hoja activa del libro. Para leer una hoja específica del libro, consultar la documentación oficial
$reader = new ReaderXlsx();
$libro = $reader->load($pathPlantillaAnexo);
$tabla = $libro->getActiveSheet();
  1. Realizar las consultas pertienentes para obtener los datos y utilizar la función setCellValue($rowColumn, $data):
$tabla->setCellValue('J9', $horas);
  1. Una vez realizada la inserción deseada, guardar el fichero en la ubicación deseada con WriterXlsx:
$writer = new WriterXlsx($libro);
$writer->save($path);

Almacenamiento de los documentos

Los anexos originales y las plantillas están almacenadas en la API, en el directorio public/anexos. Las plantillas se almacenan en plantillas como AnexoN.docx. Los documentos originales se almacenan en originales con su nombre completo.

Cada usuario tendrá su propia carpeta, en public, cuyo nombre es su DNI. Contendrá un subdirectorio por cada tipo de anexo, en los cuales se almacenarán los anexos que generen.