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

Correction Contenu >> Rendu + GenerateTemplateByCode

parent ead4bcb8
Pipeline #11113 passed with stage
in 26 seconds
......@@ -2,14 +2,13 @@
namespace UnicaenRenderer;
use UnicaenRenderer\Controller\ContenuController;
use UnicaenRenderer\Controller\ContenuControllerFactory;
use UnicaenRenderer\Service\Contenu\ContenuService;
use UnicaenRenderer\Service\Contenu\ContenuServiceFactory;
use UnicaenRenderer\Controller\RenduController;
use UnicaenRenderer\Controller\RenduControllerFactory;
use UnicaenRenderer\Service\Rendu\RenduService;
use UnicaenRenderer\Service\Rendu\RenduServiceFactory;
use UnicaenRenderer\Provider\Privilege\DocumentcontenuPrivileges;
use UnicaenPrivilege\Guard\PrivilegeController;
use UnicaenRenderer\View\Helper\ContenuViewHelper;
use UnicaenRenderer\View\Helper\RenduViewHelper;
use Zend\Router\Http\Literal;
use Zend\Router\Http\Segment;
......@@ -18,7 +17,7 @@ return [
'guards' => [
PrivilegeController::class => [
[
'controller' => ContenuController::class,
'controller' => RenduController::class,
'action' => [
'index',
],
......@@ -27,7 +26,7 @@ return [
],
],
[
'controller' => ContenuController::class,
'controller' => RenduController::class,
'action' => [
'afficher',
],
......@@ -36,7 +35,7 @@ return [
],
],
[
'controller' => ContenuController::class,
'controller' => RenduController::class,
'action' => [
'supprimer',
],
......@@ -56,10 +55,10 @@ return [
'pages' => [
'contenu' => [
'pages' => [
'contenu' => [
'rendu' => [
'label' => 'Contenu',
'route' => 'contenu/contenu',
'resource' => PrivilegeController::getResourceId(ContenuController::class, 'index'),
'route' => 'contenu/rendu',
'resource' => PrivilegeController::getResourceId(RenduController::class, 'index'),
'order' => 10003,
],
],
......@@ -75,12 +74,12 @@ return [
'routes' => [
'contenu' => [
'child_routes' => [
'contenu' => [
'rendu' => [
'type' => Literal::class,
'options' => [
'route' => '/contenu',
'route' => '/rendu',
'defaults' => [
'controller' => ContenuController::class,
'controller' => RenduController::class,
'action' => 'index',
],
],
......@@ -89,9 +88,9 @@ return [
'afficher' => [
'type' => Segment::class,
'options' => [
'route' => '/afficher/:contenu',
'route' => '/afficher/:rendu',
'defaults' => [
'controller' => ContenuController::class,
'controller' => RenduController::class,
'action' => 'afficher',
],
],
......@@ -99,9 +98,9 @@ return [
'supprimer' => [
'type' => Segment::class,
'options' => [
'route' => '/supprimer/:contenu',
'route' => '/supprimer/:rendu',
'defaults' => [
'controller' => ContenuController::class,
'controller' => RenduController::class,
'action' => 'supprimer',
],
],
......@@ -115,7 +114,7 @@ return [
'service_manager' => [
'factories' => [
ContenuService::class => ContenuServiceFactory::class,
RenduService::class => RenduServiceFactory::class,
],
],
'form_elements' => [
......@@ -126,12 +125,12 @@ return [
],
'controllers' => [
'factories' => [
ContenuController::class => ContenuControllerFactory::class,
RenduController::class => RenduControllerFactory::class,
]
],
'view_helpers' => [
'invokables' => [
'contenu' => ContenuViewHelper::class,
'rendu' => RenduViewHelper::class,
],
],
];
......@@ -5,9 +5,9 @@ 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.
Ainsi que les rendus générés à partir des templates et macros.
Le module fournit un menu dans Administration > Contenu permettant d'accéder aux instances créées : Macros, Templates et Contenu.
Le module fournit un menu dans Administration > Contenus permettant d'accéder aux instances créées : Macros, Templates et Rendus.
Dans ces menus, il est possible de gérer ceux-ci.
Dépendances
......@@ -20,7 +20,7 @@ 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 reposent sur un code unique permettant au service **RenduService** 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.
......@@ -28,19 +28,21 @@ Les macros font référence à :
Les templates
-------------
Les templates stockent les textes avec macros qui seront transformés en contenu.
Les templates stockent les textes avec macros qui seront transformés en rendu.
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 partie **corps** pour le corps du rendu
- la partie **css** qui est fcaultive qui correpond à un morceau de css qui est apposé au rendu généré
La génération de contenus
La génération de rendus
-------------------------
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
La génération passe par l'utilisation de la méthode `generateRenduByTemplate(Template, array)` qui prend en argument :
1. un template
2. un tableau de variables utilisés par les macros
Alternativement, la fonction `generateRenduByTemplateCode(string, array)` permet la génération avec seulement le code du template et renvoi une exception si le code n'est associé à aucun template.
```php
// Préparation du tableau de variables
......@@ -49,22 +51,22 @@ $vars = [
'machin' => $machin,
'UrlService' => $urlService,
];
// generation du contenu
$contenu = $this->getContenuService()->generateContenu('MON_TEMPLATE', $vars);
// generation du rendu
$rendu = $this->getRenduService()->generateRenduByTemplateCode('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.
L'utilisation du rendu peut être fait directement via l'usage des accésseurs de `Rendu` 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>
<dd> <?php echo $rendu->getSujet(); ?> </dd>
<dt> Sujet </dt>
<dd> <?php echo $contenu->getCorps(); ?> </dd>
<dd> <?php echo $rendu->getCorps(); ?> </dd>
</dl>
```
***Remarque 1 !!!*** Les contenus générés sont sauvegardés en base de données.
***Remarque 1 !!!*** Les rendus 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.
......@@ -74,12 +76,12 @@ Aides de vue founies
```phpregexp
'view_helpers' => [
'invokables' => [
'contenu' => ContenuViewHelper::class,
'rendu' => RenduViewHelper::class,
],
],
```
`$this->contenu($monContenu)` : Affiche un contenu généré avec description à gauche et texte générée à droite.
`$this->rendu($monRendu)` : Affiche un rendu généré avec description à gauche et texte générée à droite.
Configuration
=============
......@@ -113,7 +115,7 @@ Tables pour les données du modules
| 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
3. **unicaen_renderer_rendu** : table stockant les rendus générés
| Column | Type | Obligatoire | Unique | Description |
|---|---|---|---|---|
......@@ -147,7 +149,7 @@ const DOCUMENTTEMPLATE_MODIFIER = 'documenttemplate-documenttemplate_modifie
const DOCUMENTTEMPLATE_SUPPRIMER = 'documenttemplate-documenttemplate_supprimer';
```
3 - Contenu
3 - Rendu
```php
const DOCUMENTCONTENU_INDEX = 'documentcontenu-documentcontenu_index';
......
......@@ -2,54 +2,54 @@
namespace UnicaenRenderer\Controller;
use UnicaenRenderer\Service\Contenu\ContenuServiceAwareTrait;
use UnicaenRenderer\Service\Rendu\RenduServiceAwareTrait;
use Zend\Http\Request;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
class ContenuController extends AbstractActionController {
use ContenuServiceAwareTrait;
class RenduController extends AbstractActionController {
use RenduServiceAwareTrait;
public function indexAction()
{
$contenus = $this->getContenuService()->getContenus();
$rendus = $this->getRenduService()->getRendus();
return new ViewModel([
'contenus' => $contenus,
'rendus' => $rendus,
]);
}
public function afficherAction()
{
$contenu = $this->getContenuService()->getRequestedContenu($this);
$rendu = $this->getRenduService()->getRequestedRendu($this);
return new ViewModel([
'title' => "Affichage du contenu #" . $contenu->getId(),
'contenu' => $contenu,
'title' => "Affichage du contenu #" . $rendu->getId(),
'contenu' => $rendu,
]);
}
public function supprimerAction()
{
$contenu = $this->getContenuService()->getRequestedContenu($this);
$rendu = $this->getRenduService()->getRequestedRendu($this);
/** @var Request $request */
$request = $this->getRequest();
if ($request->isPost()) {
$data = $request->getPost();
if ($data["reponse"] === "oui") {
$this->getContenuService()->delete($contenu);
$this->getRenduService()->delete($rendu);
}
exit();
}
$vm = new ViewModel();
if ($contenu !== null) {
if ($rendu !== null) {
$vm->setTemplate('unicaen-renderer/default/confirmation');
$vm->setVariables([
'title' => "Suppression du contenu [" . $contenu->getId() . "]",
'title' => "Suppression du rendu [" . $rendu->getId() . "]",
'text' => "La suppression est définitive êtes-vous sûr&middot;e de vouloir continuer ?",
'action' => $this->url()->fromRoute('contenu/contenu/supprimer', ["contenu" => $contenu->getId()], [], true),
'action' => $this->url()->fromRoute('contenu/contenu/supprimer', ["rendu" => $rendu->getId()], [], true),
]);
}
return $vm;
......
......@@ -3,19 +3,19 @@
namespace UnicaenRenderer\Controller;
use Interop\Container\ContainerInterface;
use UnicaenRenderer\Service\Contenu\ContenuService;
use UnicaenRenderer\Service\Rendu\RenduService;
class ContenuControllerFactory {
class RenduControllerFactory {
public function __invoke(ContainerInterface $container)
{
/**
* @var ContenuService $contenuService
* @var RenduService $contenuService
*/
$contenuService = $container->get(ContenuService::class);
$contenuService = $container->get(RenduService::class);
$controller = new ContenuController();
$controller->setContenuService($contenuService);
$controller = new RenduController();
$controller->setRenduService($contenuService);
return $controller;
}
}
\ No newline at end of file
<?xml version="1.0" encoding="utf-8" ?>
<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd">
<entity name="UnicaenRenderer\Entity\Db\Contenu" table="unicaen_renderer_contenu">
<entity name="UnicaenRenderer\Entity\Db\Rendu" table="unicaen_renderer_rendu">
<id name="id" column="id" type="integer">
<generator strategy="IDENTITY"/>
......
......@@ -5,9 +5,9 @@ namespace UnicaenRenderer\Entity\Db;
use DateTime;
use Zend\Permissions\Acl\Resource\ResourceInterface;
class Contenu implements ResourceInterface
class Rendu implements ResourceInterface
{
const RESOURCE_ID = 'Contenu';
const RESOURCE_ID = 'Rendu';
/**
* @return string
......@@ -46,9 +46,9 @@ class Contenu implements ResourceInterface
/**
* @param Template $template
* @return Contenu
* @return Rendu
*/
public function setTemplate(Template $template): Contenu
public function setTemplate(Template $template): Rendu
{
$this->template = $template;
return $this;
......@@ -64,9 +64,9 @@ class Contenu implements ResourceInterface
/**
* @param DateTime $date
* @return Contenu
* @return Rendu
*/
public function setDate(DateTime $date): Contenu
public function setDate(DateTime $date): Rendu
{
$this->date = $date;
return $this;
......@@ -82,9 +82,9 @@ class Contenu implements ResourceInterface
/**
* @param string $sujet
* @return Contenu
* @return Rendu
*/
public function setSujet(string $sujet): Contenu
public function setSujet(string $sujet): Rendu
{
$this->sujet = $sujet;
return $this;
......@@ -100,9 +100,9 @@ class Contenu implements ResourceInterface
/**
* @param string $corps
* @return Contenu
* @return Rendu
*/
public function setCorps(string $corps): Contenu
public function setCorps(string $corps): Rendu
{
$this->corps = $corps;
return $this;
......
<?php
namespace UnicaenRenderer\Service\Contenu;
namespace UnicaenRenderer\Service\Rendu;
use DateTime;
use Doctrine\ORM\NonUniqueResultException;
......@@ -8,57 +8,57 @@ use Doctrine\ORM\ORMException;
use Doctrine\ORM\QueryBuilder;
use UnicaenApp\Exception\RuntimeException;
use UnicaenApp\Service\EntityManagerAwareTrait;
use UnicaenRenderer\Entity\Db\Contenu;
use UnicaenRenderer\Entity\Db\Rendu;
use UnicaenRenderer\Entity\Db\Template;
use UnicaenRenderer\Service\Template\TemplateServiceAwareTrait;
use Zend\Mvc\Controller\AbstractActionController;
class ContenuService {
class RenduService {
use EntityManagerAwareTrait;
use TemplateServiceAwareTrait;
/** Gestion des entités *******************************************************************************************/
/**
* @param Contenu $contenu
* @return Contenu
* @param Rendu $contenu
* @return Rendu
*/
public function create(Contenu $contenu) : Contenu
public function create(Rendu $contenu) : Rendu
{
try {
$this->getEntityManager()->persist($contenu);
$this->getEntityManager()->flush($contenu);
} catch (ORMException $e) {
throw new RuntimeException("Un problème est survenue lors de l'enregistrement en BD d'un Contenu.", $e);
throw new RuntimeException("Un problème est survenue lors de l'enregistrement en BD d'un Rendu.", $e);
}
return $contenu;
}
/**
* @param Contenu $contenu
* @return Contenu
* @param Rendu $contenu
* @return Rendu
*/
public function update(Contenu $contenu) : Contenu
public function update(Rendu $contenu) : Rendu
{
try {
$this->getEntityManager()->flush($contenu);
} catch (ORMException $e) {
throw new RuntimeException("Un problème est survenue lors de l'enregistrement en BD d'un Contenu.", $e);
throw new RuntimeException("Un problème est survenue lors de l'enregistrement en BD d'un Rendu.", $e);
}
return $contenu;
}
/**
* @param Contenu $contenu
* @return Contenu
* @param Rendu $contenu
* @return Rendu
*/
public function delete(Contenu $contenu) : Contenu
public function delete(Rendu $contenu) : Rendu
{
try {
$this->getEntityManager()->remove($contenu);
$this->getEntityManager()->flush($contenu);
} catch (ORMException $e) {
throw new RuntimeException("Un problème est survenue lors de l'enregistrement en BD d'un Contenu.", $e);
throw new RuntimeException("Un problème est survenue lors de l'enregistrement en BD d'un Rendu.", $e);
}
return $contenu;
}
......@@ -70,7 +70,7 @@ class ContenuService {
*/
public function createQueryBuilder() : QueryBuilder
{
$qb = $this->getEntityManager()->getRepository(Contenu::class)->createQueryBuilder('contenu')
$qb = $this->getEntityManager()->getRepository(Rendu::class)->createQueryBuilder('contenu')
->leftJoin('contenu.template', 'template')->addSelect('template');
return $qb;
}
......@@ -78,9 +78,9 @@ class ContenuService {
/**
* @param string $champ
* @param string $ordre
* @return Contenu[]
* @return Rendu[]
*/
public function getContenus(string $champ = 'date', string $ordre = 'ASC') : array
public function getRendus(string $champ = 'date', string $ordre = 'ASC') : array
{
$qb = $this->createQueryBuilder()
->orderBy('contenu.' . $champ, $ordre);
......@@ -90,9 +90,9 @@ class ContenuService {
/**
* @param int $id
* @return Contenu|null
* @return Rendu|null
*/
public function getContenu(int $id) : ?Contenu
public function getRendu(int $id) : ?Rendu
{
$qb = $this->createQueryBuilder()
->andWhere('contenu.id = :id')
......@@ -109,39 +109,48 @@ class ContenuService {
/**
* @param AbstractActionController $controller
* @param string $param
* @return Contenu|null
* @return Rendu|null
*/
public function getRequestedContenu(AbstractActionController $controller, string $param='contenu') : ?Contenu
public function getRequestedRendu(AbstractActionController $controller, string $param='contenu') : ?Rendu
{
$id = $controller->params()->fromRoute($param);
$result = $this->getContenu($id);
$result = $this->getRendu($id);
return $result;
}
/** facade ********************************************************************************************************/
/**
* @param Template|string $template
* @param Template $template
* @param array $variables
* @return Contenu
* @return Rendu
*/
public function generateContenu($template, array $variables) : Contenu
public function generateRenduByTemplate(Template $template, array $variables) : Rendu
{
if (is_string($template)) {
$template = $this->getTemplateService()->getTemplateByCode($template);
if ($template === null) throw new RuntimeException("Aucun template trouvé avec le code [".$template."]");
}
$contenu = new Contenu();
$contenu = new Rendu();
$contenu->setTemplate($template);
$contenu->setDate(new DateTime());
$sujet = $this->getTemplateService()->generateSujet($template, $variables);
$contenu->setSujet($sujet);
$corps = $this->getTemplateService()->generateCors($template, $variables);
$corps = $this->getTemplateService()->generateCorps($template, $variables);
$contenu->setCorps($corps);
$this->create($contenu);
return $contenu;
}
/**
* @param string $code
* @param array $variables
* @return Rendu
*/
public function genereateRenduByTemplateCode(string $code, array $variables) : Rendu
{
$template = $this->getTemplateService()->getTemplateByCode($code);
if ($template === null) throw new RuntimeException('Aucun template de trouvé avec le code ['.$code.']');
$rendu = $this->generateRenduByTemplate($template, $variables);
return $rendu;
}
}
<?php
namespace UnicaenRenderer\Service\Contenu;
namespace UnicaenRenderer\Service\Rendu;
trait ContenuServiceAwareTrait {
trait RenduServiceAwareTrait {
/** @var ContenuService */
/** @var RenduService */
private $contenuService;
/**
* @return ContenuService
* @return RenduService
*/
public function getContenuService(): ContenuService
public function getRenduService(): RenduService
{
return $this->contenuService;
}
/**
* @param ContenuService $contenuService
* @return ContenuService
* @param RenduService $contenuService
* @return RenduService
*/
public function setContenuService(ContenuService $contenuService): ContenuService
public function setRenduService(RenduService $contenuService): RenduService
{
$this->contenuService = $contenuService;
return $this->contenuService;
......