Commit 12bc7326 authored by Jean-Philippe Metivier's avatar Jean-Philippe Metivier
Browse files

Maj + documentation (README.md)

parent 77a49052
Pipeline #11031 passed with stage
in 26 seconds
......@@ -2,21 +2,14 @@
create table unicaen_renderer_macro
(
id serial not null constraint unicaen_renderer_macro_pk primary key,
id serial not null constraint unicaen_document_macro_pk primary key,
code varchar(256) not null,
description text,
variable_name varchar(256) not null,
methode_name varchar(256) not null,
histo_creation timestamp not null,
histo_createur_id integer not null constraint unicaen_renderer_macro_user_id_fk references "user",
histo_modification timestamp not null,
histo_modificateur_id integer not null constraint unicaen_renderer_macro_user_id_fk_2 references "user",
histo_destruction timestamp,
histo_destructeur_id integer constraint unicaen_renderer_macro_user_id_fk_3 references "user"
);
create unique index unicaen_renderer_macro_id_uindex on unicaen_renderer_macro (id);
create unique index unicaen_renderer_macro_code_uindex on unicaen_renderer_macro (code);
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);
-- TABLE DES CONTENUS
......
INSERT INTO public.unicaen_privilege_categorie (code, libelle, ordre, namespace)
VALUES ('documentcontent', 'UnicaenDocument - Gestion des contenus', 11020, 'UnicaenRenderer\\Provider\\Privilege');
\ No newline at end of file
-- MACRO
INSERT INTO unicaen_privilege_categorie (id ,code, libelle, ordre, namespace) VALUES (next_val('unicaen_privilege_categorie_id_seq'), 'documentmacro', 'UnicaenRenderer - Gestion des macros', 11010, 'UnicaenRenderer\Provider\Privilege');
INSERT INTO unicaen_privilege_privilege (id, categorie_id, code, libelle, ordre) VALUES (next_val('unicaen_privilege_privilege_id_seq'), current_val('unicaen_privilege_categorie_id_seq'), 'documentmacro_index', 'Afficher l''index des macros', 1);
INSERT INTO unicaen_privilege_privilege (id, categorie_id, code, libelle, ordre) VALUES (next_val('unicaen_privilege_privilege_id_seq'), current_val('unicaen_privilege_categorie_id_seq'), 'documentmacro_ajouter', 'Ajouter une macro', 10);
INSERT INTO unicaen_privilege_privilege (id, categorie_id, code, libelle, ordre) VALUES (next_val('unicaen_privilege_privilege_id_seq'), current_val('unicaen_privilege_categorie_id_seq'), 'documentmacro_modifier', 'Modifier une macro', 20);
INSERT INTO unicaen_privilege_privilege (id, categorie_id, code, libelle, ordre) VALUES (next_val('unicaen_privilege_privilege_id_seq'), current_val('unicaen_privilege_categorie_id_seq'), 'documentmacro_historiser', 'Historiser/Restaure une macro', 30);
INSERT INTO unicaen_privilege_privilege (id, categorie_id, code, libelle, ordre) VALUES (next_val('unicaen_privilege_privilege_id_seq'), current_val('unicaen_privilege_categorie_id_seq'), 'documentmacro_supprimer', 'Supprimer une macro', 40);
-- TEMPLATE
INSERT INTO unicaen_privilege_categorie (id, code, libelle, ordre, namespace) VALUES (next_val('unicaen_privilege_categorie_id_seq'), 'documenttemplate', 'UnicaenRenderer - Gestion des templates', 11020, 'UnicaenRenderer\Provider\Privilege');
INSERT INTO unicaen_privilege_privilege (id, categorie_id, code, libelle, ordre) VALUES (next_val('unicaen_privilege_privilege_id_seq'), current_val('unicaen_privilege_categorie_id_seq'), 'documenttemplate_index', 'Afficher l''index des contenus', 1);
INSERT INTO unicaen_privilege_privilege (id, categorie_id, code, libelle, ordre) VALUES (next_val('unicaen_privilege_privilege_id_seq'), current_val('unicaen_privilege_categorie_id_seq'), 'documenttemplate_modifier', 'Modifier un contenu', 20);
INSERT INTO unicaen_privilege_privilege (id, categorie_id, code, libelle, ordre) VALUES (next_val('unicaen_privilege_privilege_id_seq'), current_val('unicaen_privilege_categorie_id_seq'), 'documenttemplate_historiser', 'Historiser/Restaurer un contenu', 30);
INSERT INTO unicaen_privilege_privilege (id, categorie_id, code, libelle, ordre) VALUES (next_val('unicaen_privilege_privilege_id_seq'), current_val('unicaen_privilege_categorie_id_seq'), 'documenttemplate_supprimer', 'Supprimer un contenu', 40);
INSERT INTO unicaen_privilege_privilege (id, categorie_id, code, libelle, ordre) VALUES (next_val('unicaen_privilege_privilege_id_seq'), current_val('unicaen_privilege_categorie_id_seq'), 'documenttemplate_ajouter', 'Ajouter un contenu', 15);
INSERT INTO unicaen_privilege_privilege (id, categorie_id, code, libelle, ordre) VALUES (next_val('unicaen_privilege_privilege_id_seq'), current_val('unicaen_privilege_categorie_id_seq'), 'documenttemplate_afficher', 'Afficher un template', 10);
-- CONTENU
INSERT INTO unicaen_privilege_categorie (id, code, libelle, ordre, namespace) VALUES (next_val('unicaen_privilege_categorie_id_seq'), 'documentcontenu', 'UnicaenRenderer - Gestion des contenus', 11030, 'UnicaenRenderer\Provider\Privilege');
INSERT INTO unicaen_privilege_privilege (id, categorie_id, code, libelle, ordre) VALUES (next_val('unicaen_privilege_privilege_id_seq'), current_val('unicaen_privilege_categorie_id_seq'), 'documentcontenu_index', 'Accès à l''index des contenus', 10);
INSERT INTO unicaen_privilege_privilege (id, categorie_id, code, libelle, ordre) VALUES (next_val('unicaen_privilege_privilege_id_seq'), current_val('unicaen_privilege_categorie_id_seq'), 'documentcontenu_afficher', 'Afficher un contenu', 20);
INSERT INTO unicaen_privilege_privilege (id, categorie_id, code, libelle, ordre) VALUES (next_val('unicaen_privilege_privilege_id_seq'), current_val('unicaen_privilege_categorie_id_seq'), 'documentcontenu_supprimer', 'Supprimer un contenu ', 30);
\ No newline at end of file
Module Unicaen Renderer
=======================
------------------------
Description
-----------
Le module **unicaen/renderer** est en charge du stockage des templates et des macros associées.
Ainsi que les contenus générés à partir des templates et macros.
Deux tables sont utilisées pour stocker les données :
- unicaen_renderer_content
- unicaen_renderer_macro
Les scripts associées à la création est trouvable dans [ModuleRenderer\SQL\001_table.sql]
Le module fournit un menu dans Administration > Contenu permettant d'accéder aux instances créées : Macros, Templates et Contenu.
Dans ces menus, il est possible de gérer ceux-ci.
Deux catégories de privileges sont utilisées pour la gestion des accés aux interfaces
La liste des pribvilèges est enregistré dans les providers et l'insertion de ceux-ci dans le fichier
Dépendances
-----------
Utilisation de tinyMCE (v4.+) pour la partie WYSIWYG (qualité de vie).
Utilisation de tinyMCE (v4.+) pour la partie WYSIWYG
\ No newline at end of file
Description du fonctionnement
============================
Les macros
----------
Les macros reposent sur un code unique permettant au service **ContenuService** de les substituer plus tard dans le texte.
Les macros font référence à :
- une **variable** qui doit être passé au préalable dans un tableau
- une **méthode** (retournant une chaine de caratères) que doit possèder cette variable.
Les templates
-------------
Les templates stockent les textes avec macros qui seront transformés en contenu.
On retrouve trois blocs de textes :
- la partie **sujet** pour le sujet du courrier ou le titre d'un document (et le nom du fichier)
- la partie **corps** pour le corps du contenu
- la partie **css** qui est fcaultive qui correpond à un morceau de css qui est apposé au contenu généré
La génération de contenus
-------------------------
La génération passe par l'utilisation de la méthode `generateContenu(Template|string, array)` qui prend en argument :
1. un template ou le code d'un template
2. un tableau de variables utilisés par les macros
```php
// Préparation du tableau de variables
$vars = [
'truc' => $truc,
'machin' => $machin,
'UrlService' => $urlService,
];
// generation du contenu
$contenu = $this->getContenuService()->generateContenu('MON_TEMPLATE', $vars);
```
L'utilisation du contenu peut être fait directement via l'usage des accésseurs de `Contenu` que cela soit pour : un affichage directe, un export PDF ou la génération d'un courrier électronique.
```phtml
<dl>
<dt> Sujet </dt>
<dd> <?php echo $contenu->getSujet(); ?> </dd>
<dt> Sujet </dt>
<dd> <?php echo $contenu->getCorps(); ?> </dd>
</dl>
```
***Remarque 1 !!!*** Les contenus générés sont sauvegardés en base de données.
***Remarque 2 !!!*** La génération d'URLs, passant par l'appel d'helpers particuliers, la méthode la plus simple est de fournir un service générant celles-ci.
Tables pour les données du modules
==================================
**N.B.** Le script permettant de créer les tables est fourni dans le fichier [renderer/SQL/001_tables.sql]
1. **unicaen_renderer_macro** : table stockant les macros
| Column | Type | Obligatoire | Unique | Description |
|---|---|---|---|---|
| id | int | true | true | identifiant numerique de la macro |
| code | varchar(256)| true | true | identifiant texte de la macro |
| description | text | false | false | description associée à la macro |
| variable_name | varchar(256)| true | false | variable utilisée par la macro |
| methode_name | varchar(256)| true | false | méthode utilisée par la macro |
2. **unicaen_renderer_template** : table stockant les templates
| Column | Type | Obligatoire | Unique | Description |
|---|---|---|---|---|
| id | int | true | true | identifiant numerique de la macro |
| code | varchar(256)| true | true | identifiant texte de la macro |
| description | text | false | false | description associée à la macro |
| document_type | varchar(256) | true | false | description du type de document généré |
| document_sujet | text | true | false | template de l'élément 'sujet' |
| document_corps | text | true | false | template de l'élément 'corps' |
| document_css | text | false | false | css associé au template |
3. **unicaen_renderer_contenu** : table stockant les contenus générés
| Column | Type | Obligatoire | Unique | Description |
|---|---|---|---|---|
| id | int | true | true | identifiant numerique de la macro |
| template_id | int | false | false | identifiant du template utilisé pour la génération |
| date_generation | timestamp | true | false | date de génération |
| sujet | text | true | false | sujet généré |
| corps | text | true | false | corps généré |
Privilèges associés au module
=============================
**N.B.** Le script permettant de créer les tables est fourni dans le fichier [renderer/SQL/002_privileges.sql]
1 - Macro
```php
const DOCUMENTMACRO_INDEX = 'documentmacro-documentmacro_index';
const DOCUMENTMACRO_AJOUTER = 'documentmacro-documentmacro_ajouter';
const DOCUMENTMACRO_MODIFIER = 'documentmacro-documentmacro_modifier';
const DOCUMENTMACRO_HISTORISER = 'documentmacro-documentmacro_historiser';
const DOCUMENTMACRO_SUPPRIMER = 'documentmacro-documentmacro_supprimer';
```
2 - Template
```php
const DOCUMENTTEMPLATE_INDEX = 'documenttemplate-documenttemplate_index';
const DOCUMENTTEMPLATE_AFFICHER = 'documenttemplate-documenttemplate_afficher';
const DOCUMENTTEMPLATE_AJOUTER = 'documenttemplate-documenttemplate_ajouter';
const DOCUMENTTEMPLATE_MODIFIER = 'documenttemplate-documenttemplate_modifier';
const DOCUMENTTEMPLATE_HISTORISER = 'documenttemplate-documenttemplate_historiser';
const DOCUMENTTEMPLATE_SUPPRIMER = 'documenttemplate-documenttemplate_supprimer';
```
3 - Contenu
```php
const DOCUMENTCONTENU_INDEX = 'documentcontenu-documentcontenu_index';
const DOCUMENTCONTENU_AFFICHER = 'documentcontenu-documentcontenu_afficher';
const DOCUMENTCONTENU_SUPPRIMER = 'documentcontenu-documentcontenu_supprimer';
```
***Attention !!!*** Penser à donner les privilèges aux rôles adéquats.
......@@ -31,7 +31,7 @@ class Contenu implements ResourceInterface
/**
* @return int
*/
public function getId(): int
public function getId(): ?int
{
return $this->id;
}
......
......@@ -2,14 +2,10 @@
namespace UnicaenRenderer\Entity\Db;
use UnicaenUtilisateur\Entity\HistoriqueAwareInterface;
use UnicaenUtilisateur\Entity\HistoriqueAwareTrait;
use Zend\Permissions\Acl\Resource\ResourceInterface;
class Macro implements HistoriqueAwareInterface , ResourceInterface
class Macro implements ResourceInterface
{
use HistoriqueAwareTrait;
const RESOURCE_ID = 'Macro';
/**
......@@ -60,7 +56,7 @@ class Macro implements HistoriqueAwareInterface , ResourceInterface
/**
* @return string
*/
public function getVariable()
public function getVariable() : ?string
{
return $this->variable;
}
......@@ -69,7 +65,7 @@ class Macro implements HistoriqueAwareInterface , ResourceInterface
* @param string $variable
* @return Macro
*/
public function setVariable($variable) : Macro
public function setVariable(string $variable) : Macro
{
$this->variable = $variable;
return $this;
......
......@@ -11,20 +11,5 @@
<field name="variable" column="variable_name" type="string" length="256" nullable="false" />
<field name="methode" column="methode_name" type="string" length="256" nullable="false" />
<!-- HISTORISATION ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
<field name="histoCreation" type="datetime" column="histo_creation" nullable="false"/>
<field name="histoModification" type="datetime" column="histo_modification" nullable="false"/>
<field name="histoDestruction" type="datetime" column="histo_destruction" nullable="true"/>
<many-to-one target-entity="UnicaenUtilisateur\Entity\Db\User" field="histoCreateur">
<join-column name="histo_createur_id" referenced-column-name="id"/>
</many-to-one>
<many-to-one target-entity="UnicaenUtilisateur\Entity\Db\User" field="histoModificateur">
<join-column name="histo_modificateur_id" referenced-column-name="id"/>
</many-to-one>
<many-to-one target-entity="UnicaenUtilisateur\Entity\Db\User" field="histoDestructeur">
<join-column name="histo_destructeur_id" referenced-column-name="id"/>
</many-to-one>
</entity>
</doctrine-mapping>
\ No newline at end of file
......@@ -9,24 +9,9 @@
<field name="code" column="code" type="string" length="256" nullable="false" />
<field name="description" column="description" type="string" length="4096" nullable="false" />
<field name="type" column="document_type" type="string" length="256" nullable="false" />
<field name="complement" column="document_complement" type="string" length="4096" nullable="false" />
<field name="content" column="document_content" type="string" length="4096" nullable="false" />
<field name="sujet" column="document_sujet" type="string" length="4096" nullable="false" />
<field name="corps" column="document_corps" type="string" length="4096" nullable="false" />
<field name="css" column="document_css" type="string" length="4096" nullable="false" />
<!-- HISTORISATION ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
<field name="histoCreation" type="datetime" column="histo_creation" nullable="false"/>
<field name="histoModification" type="datetime" column="histo_modification" nullable="false"/>
<field name="histoDestruction" type="datetime" column="histo_destruction" nullable="true"/>
<many-to-one target-entity="UnicaenUtilisateur\Entity\Db\User" field="histoCreateur">
<join-column name="histo_createur_id" referenced-column-name="id"/>
</many-to-one>
<many-to-one target-entity="UnicaenUtilisateur\Entity\Db\User" field="histoModificateur">
<join-column name="histo_modificateur_id" referenced-column-name="id"/>
</many-to-one>
<many-to-one target-entity="UnicaenUtilisateur\Entity\Db\User" field="histoDestructeur">
<join-column name="histo_destructeur_id" referenced-column-name="id"/>
</many-to-one>
</entity>
</doctrine-mapping>
\ No newline at end of file
......@@ -2,14 +2,10 @@
namespace UnicaenRenderer\Entity\Db;
use UnicaenUtilisateur\Entity\HistoriqueAwareInterface;
use UnicaenUtilisateur\Entity\HistoriqueAwareTrait;
use Zend\Permissions\Acl\Resource\ResourceInterface;
class Template implements HistoriqueAwareInterface, ResourceInterface
class Template implements ResourceInterface
{
use HistoriqueAwareTrait;
const RESOURCE_ID = 'Template';
/**
......@@ -33,9 +29,9 @@ class Template implements HistoriqueAwareInterface, ResourceInterface
/** @var string */
private $type;
/** @var string */
private $complement;
private $sujet;
/** @var string */
private $content;
private $corps;
/** @var string */
private $css;
......@@ -114,36 +110,36 @@ class Template implements HistoriqueAwareInterface, ResourceInterface
/**
* @return string
*/
public function getComplement() : ?string
public function getSujet(): ?string
{
return $this->complement;
return $this->sujet;
}
/**
* @param string|null $complement
* @param string $sujet
* @return Template
*/
public function setComplement(?string $complement) : Template
public function setSujet(?string $sujet): Template
{
$this->complement = $complement;
$this->sujet = $sujet;
return $this;
}
/**
* @return string
*/
public function getTemplate() : ?string
public function getCorps(): ?string
{
return $this->content;
return $this->corps;
}
/**
* @param string|null $content
* @param string $corps
* @return Template
*/
public function setTemplate(?string $content) : Template
public function setCorps(?string $corps): Template
{
$this->content = $content;
$this->corps = $corps;
return $this;
}
......
......@@ -2,7 +2,6 @@
namespace UnicaenRenderer\Provider\Privilege;
use UnicaenPrivilege\Entity\Db\Privilege;
use UnicaenPrivilege\Provider\Privilege\Privileges;
class DocumentcontenuPrivileges extends Privileges
......
......@@ -136,9 +136,9 @@ class ContenuService {
$contenu->setTemplate($template);
$contenu->setDate(new DateTime());
$sujet = $this->getTemplateService()->generateTitre($template, $variables);
$sujet = $this->getTemplateService()->generateSujet($template, $variables);
$contenu->setSujet($sujet);
$corps = $this->getTemplateService()->generateContenu($template, $variables);
$corps = $this->getTemplateService()->generateCors($template, $variables);
$contenu->setCorps($corps);
$this->create($contenu);
......
......@@ -4,6 +4,7 @@ namespace UnicaenRenderer\Service\Contenu;
use Doctrine\ORM\EntityManager;
use Interop\Container\ContainerInterface;
use UnicaenRenderer\Service\Template\TemplateService;
class ContenuServiceFactory {
......@@ -15,11 +16,14 @@ class ContenuServiceFactory {
{
/**
* @var EntityManager $entityManager
* @var TemplateService $templateService
*/
$entityManager = $container->get('doctrine.entitymanager.orm_default');
$templateService = $container->get(TemplateService::class);
$service = new ContenuService();
$service->setEntityManager($entityManager);
$service->setTemplateService($templateService);
return $service;
}
}
\ No newline at end of file
......@@ -53,7 +53,6 @@ class MacroService {
public function historise(Macro $macro) : Macro
{
try {
$macro->historiser();
$this->getEntityManager()->flush($macro);
} catch (ORMException $e) {
throw new RuntimeException("Un problème est survenue lors de l'enregistrement en BD.", $e);
......@@ -68,7 +67,6 @@ class MacroService {
public function restore(Macro $macro) : Macro
{
try {
$macro->dehistoriser();
$this->getEntityManager()->flush($macro);
} catch (ORMException $e) {
throw new RuntimeException("Un problème est survenue lors de l'enregistrement en BD.", $e);
......@@ -99,8 +97,6 @@ class MacroService {
public function createQueryBuilder() : QueryBuilder
{
$qb = $this->getEntityManager()->getRepository(Macro::class)->createQueryBuilder('macro')
->addSelect('createur')->join('macro.histoCreateur', 'createur')
->addSelect('modificateur')->join('macro.histoModificateur', 'modificateur')
;
return $qb;
......
......@@ -26,8 +26,8 @@ class TemplateService {
public function create(Template $template) : Template
{
try {
$this->getEntityManager()->persist($content);
$this->getEntityManager()->flush($content);
$this->getEntityManager()->persist($template);
$this->getEntityManager()->flush($template);
} catch (ORMException $e) {
throw new RuntimeException("Un problème est survenue lors de l'enregistrement en BD du Template.", $e);
}
......@@ -55,7 +55,6 @@ class TemplateService {
public function historise(Template $template) : Template
{
try {
$template->historiser();
$this->getEntityManager()->flush($template);
} catch (ORMException $e) {
throw new RuntimeException("Un problème est survenue lors de l'enregistrement en BD du Template.", $e);
......@@ -70,7 +69,6 @@ class TemplateService {
public function restore(Template $template) : Template
{
try {
$template->dehistoriser();
$this->getEntityManager()->flush($template);
} catch (ORMException $e) {
throw new RuntimeException("Un problème est survenue lors de l'enregistrement en BD du Template.", $e);
......@@ -200,22 +198,12 @@ class TemplateService {
* @param array $variables
* @return string
*/
public function generateComplement(Template $template, array $variables) : string
{
return $this->replaceMacros($template->getComplement(), $variables);
}
/**
* @param Template $template
* @param array $variables
* @return string
*/
public function generateContenu(Template $template, array $variables) : string
public function generateCors(Template $template, array $variables) : string
{
$texte = "<style>";
$texte .= $template->getCss();
$texte .= "</style>";
$texte .= $this->replaceMacros($template->getContent(), $variables);
$texte .= $this->replaceMacros($template->getCorps(), $variables);
return $texte;
}
......@@ -224,9 +212,9 @@ class TemplateService {
* @param array $variables
* @return string
*/
public function generateTitre(Template $template, array $variables) : string
public function generateSujet(Template $template, array $variables) : string
{
return $this->replaceMacros($template->getComplement(), $variables);
return $this->replaceMacros($template->getSujet(), $variables);
}
}
\ No newline at end of file
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment