Commit a80811b0 authored by Bertrand Gauthier's avatar Bertrand Gauthier
Browse files

Nouveau moteur de template 'Twig restreint + WYSIWYG' (Twig sans structures...

Nouveau moteur de template 'Twig restreint + WYSIWYG' (Twig sans structures complexes car éditeur TinyMCE activé).
parent 418b2946
Loading
Loading
Loading
Loading
+48 −13
Original line number Diff line number Diff line
@@ -7,19 +7,35 @@ Description
La bibliothèque `unicaen/renderer` est en charge de la génération de contenus "génériques" basés sur des `templates` et `macros`. 

La version 7.0.0 introduit la notion de _moteur de template_ (engine).
Plusieurs moteurs de template sont proposés, c'est à dire plusieurs formats d'écriture : 
- le moteur par défaut : 
  - c'est le moteur historique et le plus facile pour un utlisateur "métier",
Plusieurs moteurs de template sont proposés, c'est à dire plusieurs formats d'écriture.

### Moteur par défaut : 
  - c'est le moteur historique de la bibliothèque,
  - l'éditeur WYSIWYG TinyMCE est activé pour que l'utilisateur rédige et mette en forme
    presque tout seul le corps et le sujet du template,
  - les macros insérées sont de la forme `VAR[variable#methode]` ;

### Moteur "Laminas" (PhpRenderer) :
  - c'est le moteur standard du framework Lamimas
  - la rédaction du template se fait manuellement au format HTML (i.e. sans éditeur WYSIWYG TinyMCE),
  - les macros insérées sont de la forme `<?php echo $variable->methode() ?>`,
  - vous n'êtes pas limité·e aux macros existantes : si une variable `variable` est injectée,
    vous pouvez utiliser `<?php echo $variable->xxxxx() ?>``xxxx` est une propriété/méthode de cette variable ;

### Moteur "Twig" (https://twig.symfony.com) :
  - la rédaction du template se fait manuellement au format HTML (i.e. sans éditeur WYSIWYG TinyMCE),
  - les macros insérées sont de la forme `{{ variable.methode }}`,
  - vous n'êtes pas limité·e aux macros existantes : si une variable `variable` est injectée, 
    vous pouvez utiliser `{{ variable.xxxx }}``xxxx` est une propriété/méthode de cette variable ;

### Moteur "Twig restreint + WYSIWYG" :
  - l'éditeur WYSIWYG TinyMCE est activé pour que l'utilisateur rédige et mette en forme
    presque tout seul le corps et le sujet du template,
  - les macros insérées sont de la forme `VAR[Aaaaa#bbbbb]` ;
- le moteur Laminas (PhpRenderer) :
  - c'est le moteur standard du wramework Lamimas
  - la rédaction du template se fait manuellement au format HTML,
  - les macros insérées sont de la forme `<?php echo $aaaa->bbbbb() ?>` ;
- le moteur Twig (https://twig.symfony.com) :
  - la rédaction du template se fait manuellement au format HTML,
  - les macros insérées sont de la forme `{{ ... }}` ;
  - par rapport au moteur "Twig" précédent, il n'est pas possible d'utiliser les structures "complexes" de Twig comme 
    les structures de contrôle par exemple (https://twig.symfony.com/doc/3.x/templates.html#control-structure)
    du fait de l'utilisation de l'éditeur WYSIWYG TinyMCE.
  - NB : la ruse consistant à écrire dans la vue "source HTML" de l'éditeur TinyMCE les structures "complexes" Twig est
    déconseillée car elles sont invisibles dans la vue "WYSIWYG".


Dépendances javascript
@@ -35,7 +51,7 @@ Utilisation de la bibliothèque
-----------

Le service `RenduService` fournit une méthode `generateRenduByTemplateCode` en charge de générer un contenu avec le code d'un temmplate et un tableau de variables qui seront exploitées par les macros.
Le troisième paramètre permet de controller l'enregistrement du rendu en base de données.
Le troisième paramètre permet d'activer ou pas l'enregistrement du rendu en base de données.

```php
$vars = ['variable1' => $variable1, ...];
@@ -62,12 +78,15 @@ echo $this->macroInsert();
_Remarque :_
A faire en fin de fichier une seul fois, le JS s'occupe de l'associer aux différents input


Administration
--------------

La biliothèque fournit des interfaces d'administration pour le paramètre des macros et templates et le listing des rendus.
Le fichier `config/unicae-renderer.global.dist.php` contient la déclaration des différents menus d'administration.



Tables et privilèges associés
============================

@@ -121,6 +140,13 @@ Pour les ajouts des macros dans des inputs `Macro-compatible`:
+ texte : VariableName de la macro
+ value : Valeur du TemplateEngine (ie : `VAR[Class#attr]`)

_NB :_
La déclaration des macros en base de données n'est obligatoire que pour le moteur de template par défaut.
Car chaque macro en base de données fournira la correspondance entre le "nom de code" utilisable dans le
template et le couple variable-méthode à évaluer pour obtenir la donnée.
Pour les autres moteurs, dès lors qu'une variable est injectée dans le template, il est possible d'appeler
sur celle-ci n'importe quel·le attribut/méthode existant·e.


Template
----
@@ -137,6 +163,7 @@ Template
| document_corps | $corps       | text         | Le corps ou le contenu du fichier       |
| document_css   | $css         | text         | Un snipet CSS pour la mise en forme     |


Rendu
----

@@ -148,6 +175,7 @@ Rendu
| sujet           | $sujet    | text       | Sujet "généré"                  |
| corps           | $corps    | text       | Corps "généré"                  |


Modification du schéma
----------------------

@@ -172,8 +200,15 @@ insert into unicaen_renderer_macro (code, description, variable_name, methode_na
values ('Log#DateEtHeure', 'Date et heure du jour', '__log', 'getDateEtHeure');
```

**7.1.0**
```sql
-- nouveau moteur de template "Twig restreint + WYSIWYG"
alter type template_engine_enum add value 'twig_wysiwyg';
```


Dépendance à **UnicaenPrivilege**
----------------------------------
===========================

1. Dans **vendor/unicaen/renderer/config/merged/index.config.php**, **vendor/unicaen/renderer/config/merged/macro.config.php**, **vendor/unicaen/renderer/config/merged/rendu.config.php**, **vendor/unicaen/renderer/config/merged/template.config.php** : `UnicaenPrivilege\Guard\PrivilegeController` pour les gardes liées aux actions.
   Peut être directement remplacer par l'equivalent fournit par `unicaen/auth`.
+17 −4
Original line number Diff line number Diff line
@@ -11,15 +11,27 @@ create table unicaen_renderer_macro
create unique index unicaen_document_macro_code_uindex on unicaen_renderer_macro (code);
create unique index unicaen_document_macro_id_uindex on unicaen_renderer_macro (id);

-- macros utilitaires (pas d'injection de variable nécessaire)
insert into unicaen_renderer_macro (code, description, variable_name, methode_name)
values ('Page#SautDePage', 'Saut de page', '__page', 'getSautDePage');
insert into unicaen_renderer_macro (code, description, variable_name, methode_name)
values ('Log#Date', 'Date du jour', '__log', 'getDate');
insert into unicaen_renderer_macro (code, description, variable_name, methode_name)
values ('Log#DateEtHeure', 'Date et heure du jour', '__log', 'getDateEtHeure');



-- TABLE DES TEMPLATES

create type template_engine_enum as enum('default', 'laminas', 'twig', 'twig_wysiwyg');

create table unicaen_renderer_template
(
    id serial not null constraint unicaen_document_template_pk primary key,
    code varchar(256) not null,
    description text,
    namespace varchar(1024),
    engine varchar(64) default 'default' not null,
    engine template_engine_enum default 'default' not null,
    document_type varchar(256) not null,
    document_sujet text not null,
    document_corps text not null,
@@ -28,7 +40,10 @@ create table unicaen_renderer_template
create unique index unicaen_document_template_code_uindex on unicaen_renderer_template (code);
create unique index unicaen_document_template_id_uindex on unicaen_renderer_template (id);

-- TABLE DES RENDU


-- TABLE DES RENDUS

create table unicaen_renderer_rendu
(
    id serial not null constraint unicaen_document_rendu_pk primary key,
@@ -41,5 +56,3 @@ create table unicaen_renderer_rendu
    corps text not null
);
create unique index unicaen_document_rendu_id_uindex on unicaen_renderer_template (id);

+5 −1
Original line number Diff line number Diff line
@@ -32,10 +32,12 @@ class Template implements ResourceInterface
    const TEMPLATE_ENGINE_DEFAULT = 'default';
    const TEMPLATE_ENGINE_LAMINAS = 'laminas';
    const TEMPLATE_ENGINE_TWIG = 'twig';
    const TEMPLATE_ENGINE_TWIG_WYSIWYG = 'twiglight';
    const TEMPLATE_ENGINES = [
        self::TEMPLATE_ENGINE_DEFAULT => "Moteur par défaut",
        self::TEMPLATE_ENGINE_LAMINAS => "Moteur Laminas (PhpRenderer)",
        self::TEMPLATE_ENGINE_TWIG => "Moteur Twig",
        self::TEMPLATE_ENGINE_TWIG_WYSIWYG => "Moteur Twig restreint + WYSIWYG",
    ];

    private ?int $id = null;
@@ -95,7 +97,9 @@ class Template implements ResourceInterface
     */
    public function requiresTextEditing(): bool
    {
        return $this->getEngine() !== Template::TEMPLATE_ENGINE_DEFAULT;
        return
            $this->getEngine() !== Template::TEMPLATE_ENGINE_DEFAULT &&
            $this->getEngine() !== Template::TEMPLATE_ENGINE_TWIG_WYSIWYG;
    }

    public function getDescription(): ?string
+10 −0
Original line number Diff line number Diff line
<?php

namespace UnicaenRenderer\Service\TemplateEngine\TwigWysiwyg;

use UnicaenRenderer\Service\TemplateEngine\Twig\TwigTemplateEngine;

class TwigWysiwygTemplateEngine extends TwigTemplateEngine
{

}
 No newline at end of file
+14 −0
Original line number Diff line number Diff line
<?php

namespace UnicaenRenderer\Service\TemplateEngine\TwigWysiwyg;

use Laminas\ServiceManager\Factory\FactoryInterface;
use Psr\Container\ContainerInterface;

class TwigWysiwygTemplateEngineFactory implements FactoryInterface
{
    public function __invoke(ContainerInterface $container, $requestedName, ?array $options = null): TwigLightTemplateEngine
    {
        return new TwigLightTemplateEngine();
    }
}
 No newline at end of file
Loading