Poder crear "extensiones" en las plantillas twig, o quizás mejor llamarlo Includes. Actualmente si un plugin quiere añadir código a una plantilla twig solo puede reemplazar toda la plantilla o heredar y cambiar un bloque, el problema viene cuando otro plugin quiere añadir código al mismo fichero, si lo hace elimina la modificación del otro plugin, problema.
Solución Crear una carpeta de Includes dentro de la carpeta View, los archivos tiwg tendrán ubicaciones preparadas donde se permitirá insertar código.
Archivo IncludeViewTrait Es el encargado de obtener todos los archivos twig de la plantilla que estamos viendo para posteriormente ir haciendo los includes en cada zona.
<?php
namespace FacturaScripts\Core\Lib;
use RecursiveIteratorIterator;
use RecursiveDirectoryIterator;
/**
* @author Daniel Fernández Giménez <hola@danielfg.es>
*/
trait IncludeViewTrait
{
public static function includeView($fileParent): array
{
$files = [];
$fileParentTemp = explode('/', $fileParent);
$fileParent = str_replace('.html.twig', '', end($fileParentTemp));
$path = FS_FOLDER . '/Dinamic/View/Include/';
if (!is_dir($path)) {
return $files;
}
$ficheros = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path));
foreach ($ficheros as $f) {
if ($f->isDir()) {
continue;
}
// buscamos que el archivo empiece por el nombre del fichero padre o sea el nombre del fichero que se está incluyendo
$file = explode('_', $f->getFilename());
if ($file[0] != $fileParent && $file[0] != 'PortalTemplate') {
continue;
}
$pathName = str_replace('\\', '/', $f->getPathname());
$directories = explode('/', $pathName);
$dirPlugin = '';
if ($directories[count($directories) - 2] != 'Include') {
$dirPlugin = $directories[count($directories) - 2] . '/';
}
$arrayName = explode('_', str_replace('.html.twig', '', $f->getFilename()));
$arrayFile = [
'path' => $dirPlugin . $f->getFilename(),
'file' => $arrayName[0],
'position' => $arrayName[1]
];
if (false === isset($arrayName[2])) {
$arrayName[2] = '10';
}
$arrayFile['order'] = str_pad($arrayName[2], 5, "0", STR_PAD_LEFT);;
$files[] = $arrayFile;
}
usort($files,function($a,$b) {
return strcmp($a['file'], $b['file']) // status ascending
?: strcmp($a['position'], $b['position']) // start ascending
?: strcmp($a['order'], $b['order']) // mh ascending
;
});
return $files;
}
}
En el archivo Controller se usa el trait anterior
class Controller
{
use IncludeViewTrait;
}
Ahora se debe crear un macro para twig que deberá estar cargado en cada una de las plantillas twig a las que queramos darle los ganchos para inser código.
Archivo macro IncludeView
{% macro includeView(webIncludes, location, templateVars = {}) %}
{% for file in webIncludes %}
{% if (file.position == location) %}
{% include['Include/' ~ file.path, ''] with templateVars %}
{% endif %}
{% endfor %}
{% endmacro %}
Ahora en la vista final twig se debe importar el macro anterior, obtener los archivos a incluir en cada sección y crear las secciones.
Importamos el macro
{% import "Macro/IncludeView.html.twig" as includeView %}
Obtenemos los archivos a incluir, debemkos pasarle el nombre de la plantilla/archivo donde estamos.
{% set includes = fsc.includeView('AdminPlugins') %}
Ahora en la plantilla twig creamos las secciones (tantas como queramos) donde daremos la opción de poder añadir código.
{{ includeView.includeView(includes, 'header', tempVars) }}
{{ includeView.includeView(includes, 'body', tempVars) }}
{{ includeView.includeView(includes, 'footer', tempVars) }}
Caso de uso desde un plugin El plugin en su carpeta View crea la carpeta Include. Dentro crear tantos archivos como secciones necesites intertar, por ejemplo su quiere añadir código a 3 secciones de un mismo archivo twig padre, tendrá que crear 3 archivos para incluir en cada sección.
Siguiendo en caso de ejemplo que tiene 3 secciones preparadas. Crariamos 3 archivos, donde lo primero es el nombre del archivo twig padre, separado por guión bajo el nombre de la sección, y por último y opcional separado por guión bajo la prioridad.
Archivos a crear dentro de la carpeta View/Include del plugin. AdminPlugins_header.html.twig AdminPlugins_body_3.html.twig AdminPlugins_footer_5.html.twig
La prioridad de los archivos es opcional, si no se pone nada como en el caso 1, se establecerá una prioridad de 10. ¿Para que la prioridad?, varios plugins pueden estar añadiendo código al mismo archivo y la misma sección, pero necesitamos que uno cargue antes que otro por el motivo que sea.
Cada uno de los archivos creados twig se incrustarán en cada sección correspondiente con el código que tengan cada uno.
España, 10 años, nivel 100
Fecha de inicio: 28-01-2023, Fecha de fin: 28-01-2023, Puntos de soporte +5