Skip to content
Snippets Groups Projects
Commit 4667d596 authored by Alexandre Zvenigorosky's avatar Alexandre Zvenigorosky
Browse files

Merge branches 'Centres-cout' and 'master' of git.unicaen.fr:open-source/OSE into Centres-cout

# Conflicts:
#	composer.json
#	composer.lock
parent aa116d0a
No related branches found
No related tags found
2 merge requests!15Centres cout,!13Centres cout corrigés avec les bons droits
Showing
with 6 additions and 741 deletions
...@@ -98,12 +98,12 @@ return [ ...@@ -98,12 +98,12 @@ return [
[ [
'controller' => 'Application\Controller\CentreCout', 'controller' => 'Application\Controller\CentreCout',
'action' => ['index'], 'action' => ['index'],
'privileges' => Privileges::DROIT_PRIVILEGE_EDITION, 'privileges' => Privileges::CENTRES_COUTS_ADMINISTRATION_VISUALISATION,
], ],
[ [
'controller' => 'Application\Controller\CentreCout', 'controller' => 'Application\Controller\CentreCout',
'action' => ['saisie', 'delete','saisie-structure','delete-structure'], 'action' => ['saisie', 'delete','saisie-structure','delete-structure'],
'privileges' => Privileges::ODF_CENTRES_COUT_EDITION, 'privileges' => Privileges::CENTRES_COUTS_ADMINISTRATION_EDITION,
], ],
], ],
], ],
......
<?php
namespace Application;
use Application\Provider\Privilege\Privileges;
use UnicaenAuth\Guard\PrivilegeController;
return [
'router' => [
'routes' => [
'groupe-type-formation' => [
'type' => 'Literal',
'options' => [
'route' => '/groupe-type-formation',
'defaults' => [
'controller' => 'Application\Controller\GroupeTypeFormation',
'action' => 'index',
],
],
'may_terminate' => true,
'child_routes' => [
'delete' => [
'type' => 'Segment',
'options' => [
'route' => '/delete/:groupe-type-formation',
'constraints' => [
'groupe-type-formation' => '[0-9]*',
],
'defaults' => [
'action' => 'delete',
],
],
],
'saisie' => [
'type' => 'Segment',
'options' => [
'route' => '/saisie/[:groupe-type-formation]',
'constraints' => [
'groupe-type-formation' => '[0-9]*',
],
'defaults' => [
'action' => 'saisie',
],
],
],
'type-formation-delete' => [
'type' => 'Segment',
'options' => [
'route' => '/type-formation-delete/:type-formation',
'constraints' => [
'type-formation' => '[0-9]*',
],
'defaults' => [
'action' => 'type-formation-delete',
],
],
],
'type-formation-saisie' => [
'type' => 'Segment',
'options' => [
'route' => '/type-formation-saisie/:groupe-type-formation[/:type-formation]',
'constraints' => [
'groupe-type-formation' => '[0-9]*',
'type-formation' => '[0-9]*',
],
'defaults' => [
'action' => 'type-formation-saisie',
],
],
],
],
],
],
],
'navigation' => [
'default' => [
'home' => [
'pages' => [
'administration' => [
'pages' => [
'groupe-type-formation' => [
'label' => 'Diplômes',
'icon' => 'fa fa-graduation-cap',
'route' => 'groupe-type-formation',
'resource' => PrivilegeController::getResourceId('Application\Controller\GroupeTypeFormation', 'index'),
'order' => 80,
'border-color' => '#BBCF55',
],
],
],
],
],
],
],
'bjyauthorize' => [
'guards' => [
PrivilegeController::class => [
[
'controller' => 'Application\Controller\GroupeTypeFormation',
'action' => ['index'],
'privileges' => Privileges::DROIT_PRIVILEGE_EDITION,
],
[
'controller' => 'Application\Controller\GroupeTypeFormation',
'action' => ['saisie', 'delete', 'type-formation-saisie', 'type-formation-delete'],
'privileges' => Privileges::DROIT_PRIVILEGE_VISUALISATION,
],
],
],
],
'controllers' => [
'invokables' => [
'Application\Controller\GroupeTypeFormation' => Controller\GroupeTypeFormationController::class,
],
],
'service_manager' => [
'invokables' => [
Service\GroupeTypeFormationService::class => Service\GroupeTypeFormationService::class,
Service\GroupeTypeFormationService::class => Service\TypeFormationService::class,
],
],
'view_helpers' => [
],
'form_elements' => [
'invokables' => [
Form\GroupeTypeFormation\TypeFormationSaisieForm::class => Form\GroupeTypeFormation\TypeFormationSaisieForm::class,
Form\GroupeTypeFormation\GroupeTypeFormationSaisieForm::class => Form\GroupeTypeFormation\GroupeTypeFormationSaisieForm::class,
],
],
];
<?php
namespace Application\Controller;
use Application\Entity\Db\GroupeTypeFormation;
use Application\Service\Traits\GroupeTypeFormationServiceAwareTrait;
use Application\Entity\Db\TypeFormation;
use Application\Service\Traits\TypeFormationServiceAwareTrait;
use Application\Exception\DbException;
use Application\Form\GroupeTypeFormation\Traits\GroupeTypeFormationSaisieFormAwareTrait;
use Application\Form\GroupeTypeFormation\Traits\TypeFormationSaisieFormAwareTrait;
use UnicaenApp\View\Model\MessengerViewModel;
class GroupeTypeFormationController extends AbstractController
{
use GroupeTypeFormationServiceAwareTrait;
use TypeFormationServiceAwareTrait;
use GroupeTypeFormationSaisieFormAwareTrait;
use TypeFormationSaisieFormAwareTrait;
public function indexAction()
{
$this->em()->getFilters()->enable('historique')->init([
GroupeTypeFormation::class,
]);
$this->em()->getFilters()->enable('historique')->init([
TypeFormation::class,
]);
$groupeTypeFormations = $this->getServiceGroupeTypeFormation()->getList();
$typeFormations = $this->getServiceTypeFormation()->getList();
return compact('groupeTypeFormations', 'typeFormations');
}
public function saisieAction()
{
/* @var $groupeTypeFormation GroupeTypeFormation */
$groupeTypeFormation = $this->getEvent()->getParam('groupe-type-formation');
$form = $this->getFormGroupeTypeFormationSaisie();
if (empty($groupeTypeFormation)) {
$title = 'Création d\'une nouvelle GroupeTypeFormation';
$groupeTypeFormation = $this->getServiceGroupeTypeFormation()->newEntity();
} else {
$title = 'Édition d\'une GroupeTypeFormation';
}
$form->bindRequestSave($groupeTypeFormation, $this->getRequest(), function (GroupeTypeFormation $fr) {
try {
$this->getServiceGroupeTypeFormation()->save($fr);
$this->flashMessenger()->addSuccessMessage('Enregistrement effectué');
} catch (\Exception $e) {
$e = DbException::translate($e);
$this->flashMessenger()->addErrorMessage($e->getMessage() . ':' . $fr->getId());
}
});
return compact('form', 'title');
}
public function deleteAction()
{
$groupeTypeFormation = $this->getEvent()->getParam('groupe-type-formation');
try {
$this->getServiceGroupeTypeFormation()->delete($groupeTypeFormation);
$this->flashMessenger()->addSuccessMessage("GroupeTypeFormation supprimée avec succès.");
} catch (\Exception $e) {
$this->flashMessenger()->addErrorMessage(DbException::translate($e)->getMessage());
}
return new MessengerViewModel(compact('groupeTypeFormation'));
}
public function typeFormationSaisieAction()
{
/* @var $groupeTypeFormation GroupeTypeFormation */
/* @var $typeFormation TypeFormation */
$groupeTypeFormation = $this->getEvent()->getParam('groupe-type-formation');
$typeFormation = $this->getEvent()->getParam('type-formation');
$form = $this->getFormTypeFormationSaisie();
if (empty($typeFormation)) {
$title = 'Création d\'un nouveau type de formation';
$typeFormation = $this->getServiceTypeFormation()->newEntity()
->setGroupe($groupeTypeFormation);
$typeFormation->setServiceStatutaire(true);
} else {
$title = 'Édition d\'un Type de Formation';
}
$form->bindRequestSave($typeFormation, $this->getRequest(), function (TypeFormation $tf) {
try {
$this->getServiceTypeFormation()->save($tf);
$this->flashMessenger()->addSuccessMessage('Enregistrement effectué');
} catch (\Exception $e) {
$e = DbException::translate($e);
$this->flashMessenger()->addErrorMessage($e->getMessage() . ':' . $tf->getId());
}
});
return compact('form', 'title');
}
public function typeFormationDeleteAction()
{
/* @var $typeFormation TypeFormation */
$typeFormation = $this->getEvent()->getParam('type-formation');
try {
$this->getServiceTypeFormation()->delete($typeFormation);
$this->flashMessenger()->addSuccessMessage("Type de Formation supprimée avec succès.");
} catch (\Exception $e) {
$this->flashMessenger()->addErrorMessage(DbException::translate($e)->getMessage());
}
return new MessengerViewModel(compact('type de formation'));
}
}
...@@ -138,7 +138,7 @@ class CentreCoutStructureHydrator implements HydratorInterface ...@@ -138,7 +138,7 @@ class CentreCoutStructureHydrator implements HydratorInterface
$object->setStructure($this->getServiceStructure()->get($data['structure'])); $object->setStructure($this->getServiceStructure()->get($data['structure']));
} }
$object->setSourceCode($data['code']); $object->setSourceCode($data['code']);
$object->setCentreCout($this->getServiceCentreCout()->getById($data['centre-cout'])); $object->setCentreCout($this->getServiceCentreCout()->get($data['centre-cout']));
$object->setSource($this->getServiceSource()->getOse()); $object->setSource($this->getServiceSource()->getOse());
$object->setUniteBudgetaire($data['unite-budgetaire']); $object->setUniteBudgetaire($data['unite-budgetaire']);
......
<?php
namespace Application\Form\GroupeTypeFormation\Traits;
use Application\Form\GroupeTypeFormation\GroupeTypeFormationSaisieForm;
/**
* Description of GroupeTypeFormationSaisieFormAwareTrait
*
* @author UnicaenCode
*/
trait GroupeTypeFormationSaisieFormAwareTrait
{
/**
* @var GroupeTypeFormationSaisieForm
*/
private $formGroupeTypeFormationSaisie;
/**
* @param GroupeTypeFormationSaisieForm $formGroupeTypeFormationSaisie
*
* @return self
*/
public function setFormGroupeTypeFormationSaisie(GroupeTypeFormationSaisieForm $formGroupeTypeFormationSaisie)
{
$this->formGroupeTypeFormationSaisie = $formGroupeTypeFormationSaisie;
return $this;
}
/**
* Retourne un nouveau formulaire ou fieldset systématiquement, sauf si ce dernier a été fourni manuellement.
*
* @return GroupeTypeFormationSaisieForm
*/
public function getFormGroupeTypeFormationSaisie()
{
if (!empty($this->formGroupeTypeFormationSaisie)) {
return $this->formGroupeTypeFormationSaisie;
}
return \Application::$container->get('FormElementManager')->get(GroupeTypeFormationSaisieForm::class);
}
}
<?php
namespace Application\Form\GroupeTypeFormation\Traits;
use Application\Form\GroupeTypeFormation\TypeFormationSaisieForm;
/**
* Description of TypeFormationSaisieFormAwareTrait
*
* @author UnicaenCode
*/
trait TypeFormationSaisieFormAwareTrait
{
/**
* @var TypeFormationSaisieForm
*/
private $formTypeFormationSaisie;
/**
* @param TypeFormationSaisieForm $formTypeFormationSaisie
*
* @return self
*/
public function setFormTypeFormationSaisie(TypeFormationSaisieForm $formTypeFormationSaisie)
{
$this->formTypeFormationSaisie = $formTypeFormationSaisie;
return $this;
}
/**
* Retourne un nouveau formulaire ou fieldset systématiquement, sauf si ce dernier a été fourni manuellement.
*
* @return TypeFormationSaisieForm
*/
public function getFormTypeFormationSaisie()
{
if (!empty($this->formTypeFormationSaisie)) {
return $this->formTypeFormationSaisie;
}
return \Application::$container->get('FormElementManager')->get(TypeFormationSaisieForm::class);
}
}
<?php
namespace Application\Form\GroupeTypeFormation;
use Application\Form\AbstractForm;
use Zend\Form\Element\Csrf;
use Zend\Stdlib\Hydrator\HydratorInterface;
use Application\Service\Traits\SourceServiceAwareTrait;
use Application\Service\Traits\GroupeTypeFormationServiceAwareTrait;
/**
* Description of TypeFormationSaisieForm
*
* @author ZVENIGOROSKY Alexandre <alexandre.zvenigorosky@unicaen.fr>
*/
class TypeFormationSaisieForm extends AbstractForm
{
use SourceServiceAwareTrait;
use GroupeTypeFormationServiceAwareTrait;
public function init()
{
$hydrator = new TypeFormationHydrator();
$this->setHydrator($hydrator);
$this->setAttribute('action', $this->getCurrentUrl());
$this->add([
'name' => 'groupe-type-formation',
'options' => [
'label' => "Groupe de type de formation",
],
'type' => 'Hidden',
]);
$this->add([
'name' => 'libelle-court',
'options' => [
'label' => "Libelle Court",
],
'type' => 'Text',
]);
$this->add([
'name' => 'libelle-long',
'options' => [
'label' => "Libelle Long",
],
'type' => 'Text',
]);
$this->add([
'name' => 'source-code',
'options' => [
'label' => "Source Code",
],
'type' => 'Text',
]);
$this->add([
'name' => 'statutaire',
'options' => [
'label' => "Service statutaire",
"checked_value" => 'true',
"unchecked_value" => 'false',
],
'type' => 'Checkbox',
]);
$this->add(new Csrf('security'));
$this->add([
'name' => 'submit',
'type' => 'Submit',
'attributes' => [
'value' => "Enregistrer",
'class' => 'btn btn-primary',
],
]);
return $this;
}
/**
* Should return an array specification compatible with
* {@link Zend\InputFilter\Factory::createInputFilter()}.
*
* @return array
*/
public function getInputFilterSpecification()
{
return [
'libelle-court' => [
'required' => true,
],
'libelle-long' => [
'required' => true,
],
'statutaire' => [
'required' => true,
],
];
}
}
class TypeFormationHydrator implements HydratorInterface
{
use SourceServiceAwareTrait;
use GroupeTypeFormationServiceAwareTrait;
/**
* Hydrate $object with the provided $data.
*
* @param array $data
* @param \Application\Entity\Db\TypeFormation $object
*
* @return object
*/
public function hydrate(array $data, $object)
{
$object->setGroupe($this->getServiceGroupeTypeFormation()->getById($data['groupe-type-formation']));
$object->setLibelleCourt($data['libelle-court']);
$object->setLibelleLong($data['libelle-long']);
$object->setSourceCode($data['source-code']);
$object->setSource($this->getServiceSource()->getOse());
$object->setServiceStatutaire($data['statutaire']=='true');
return $object;
}
/**
* Extract values from an object
*
* @param \Application\Entity\Db\TypeFormation $object
*
* @return array
*/
public function extract($object)
{
$data = [
'id' => $object->getId()
, 'groupe-type-formation' => $object->getGroupe()->getId()
, 'libelle-court' => $object->getLibelleCourt()
, 'libelle-long' => $object->getLibelleLong()
, 'statutaire' => $object->isServiceStatutaire()?'true':'false'
, 'source-code' => $object->getSourceCode()
, 'source' => ($s = $object->getSource()) ? $s->getId() : null,
];
return $data;
}
}
...@@ -26,6 +26,8 @@ class Privileges extends \UnicaenAuth\Provider\Privilege\Privileges { ...@@ -26,6 +26,8 @@ class Privileges extends \UnicaenAuth\Provider\Privilege\Privileges {
const BUDGET_TYPE_DOTATION_EDITION = 'budget-type-dotation-edition'; const BUDGET_TYPE_DOTATION_EDITION = 'budget-type-dotation-edition';
const BUDGET_TYPE_DOTATION_VISUALISATION = 'budget-type-dotation-visualisation'; const BUDGET_TYPE_DOTATION_VISUALISATION = 'budget-type-dotation-visualisation';
const BUDGET_VISUALISATION = 'budget-visualisation'; const BUDGET_VISUALISATION = 'budget-visualisation';
const CENTRES_COUTS_ADMINISTRATION_EDITION = 'centres-couts-administration-edition';
const CENTRES_COUTS_ADMINISTRATION_VISUALISATION = 'centres-couts-administration-visualisation';
const CHARGENS_DEPASSEMENT_CSV = 'chargens-depassement-csv'; const CHARGENS_DEPASSEMENT_CSV = 'chargens-depassement-csv';
const CHARGENS_EXPORT_CSV = 'chargens-export-csv'; const CHARGENS_EXPORT_CSV = 'chargens-export-csv';
const CHARGENS_FORMATION_ACTIF_EDITION = 'chargens-formation-actif-edition'; const CHARGENS_FORMATION_ACTIF_EDITION = 'chargens-formation-actif-edition';
......
...@@ -95,36 +95,4 @@ class CentreCoutService extends AbstractEntityService ...@@ -95,36 +95,4 @@ class CentreCoutService extends AbstractEntityService
return $result; return $result;
} }
/**
* Retourne une entité à partir de son code
* Retourne null si le code est null
*
* @param string|string[] $code
* @return mixed|null
*/
public function getById($id)
{
if(is_array($id)){
list($qb,$alias) = $this->initQuery();
$qb->andWhere($alias.'.id IN (:'.$alias.'_id)')->setParameter($alias.'_id', $id);
return $this->getList( $qb );
}elseif ($id){
return $this->getRepo()->findOneBy(['id' => $id]);
}else{
return null;
}
}
/**
* Retourne la liste des types de modulateurs
*
* @param QueryBuilder|null $qb
* @param string|null $alias
* @return CentreCout[]
*/
public function getList( QueryBuilder $qb=null, $alias=null ){
list($qb,$alias) = $this->initQuery($qb,$alias);
$qb->addOrderBy("$alias.parent");
return parent::getList($qb, $alias);
}
} }
\ No newline at end of file
...@@ -9,7 +9,7 @@ use Application\Provider\Privilege\Privileges; ...@@ -9,7 +9,7 @@ use Application\Provider\Privilege\Privileges;
$this->headTitle()->append("Centres de cout"); $this->headTitle()->append("Centres de cout");
$canEdit = $this->isAllowed(Privileges::getResourceId(Privileges::ODF_CENTRES_COUT_EDITION)); $canEdit = $this->isAllowed(Privileges::getResourceId(Privileges::CENTRES_COUTS_ADMINISTRATION_EDITION));
?> ?>
<h1 class="page-header">Centres de coûts</h1> <h1 class="page-header">Centres de coûts</h1>
......
<?php
/**
* @var $this \Application\View\Renderer\PhpRenderer
* @var $groupeTypeFormations \Application\Entity\Db\GroupeTypeFormation[]
*/
/* @var $groupeTypeFormations \Application\Entity\Db\groupeTypeFormation[]
* @var $typeFormations \Application\Entity\Db\typeFormation[]
*/
use Application\Provider\Privilege\Privileges;
$this->headTitle()->append("Formations classées par type");
$canEdit = $this->isAllowed(Privileges::getResourceId(Privileges::DROIT_PRIVILEGE_VISUALISATION));
?>
<h1 class="page-header">Groupe de Types de Formations</h1>
<?php foreach ($groupeTypeFormations
as $fr) {
$noActions = true;
foreach ($typeFormations as $tf) {
if ($tf->getGroupe()->getId() == $fr->getId()) {
if ($fr->getSource()->getLibelle() == 'OSE') $noActions = false;
}
}
$nbCol = 6; ?>
<div class="panel panel-default">
<div class="panel-heading">
<div class="panel-title"><?= $fr->getLibelleLong() ?>
<span style="position:absolute; left: 400px"><?= $fr->getLibelleCourt() ?></span>
<?php if (($canEdit) && ($fr->getSource()->getLibelle() == 'OSE')) { ?>
<span style="position:absolute; right:50px; ">
<a class="ajax-modal" data-event="groupe-type-formation-saisie"
href="<?= $this->url('groupe-type-formation/saisie', ['groupe-type-formation' => $fr->getId()]) ?>"
title="Modifier la Groupe de Type de Formation">
<span class="glyphicon glyphicon-edit"></span></a>
<a class="pop-ajax"
href="<?= $this->url('groupe-type-formation/delete', ['groupe-type-formation' => $fr->getId()]) ?>"
title="Supprimer la GroupeTypeFormation"
data-content="<p class='lead text-danger'><strong>Attention!</strong> Confirmez-vous cette suppression ?</p>"
data-confirm="true"
data-confirm-button="Oui"
data-cancel-button="Non"
data-submit-reload="true"
>
<span class="glyphicon glyphicon-remove"></span>
</a>
</span>
<?php } ?>
</div>
</div>
<div class="panel-body">
<div class="row">
<div class="col-md-3">
<div class="panel-body">
<div class="row">
<div class="col-md-3">
Source:
</div>
<div class="col-md-1"><?= $fr->getSource() ?>
</div>
</div>
<div class="row">
<div class="col-md-3">
Ordre:
</div>
<div class="col-md-1"><?= $fr->getOrdre() ?>
</div>
</div>
<div class="row">
<div class="col-md-3">
Niveau:
</div>
<div class="col-md-1"><?= $fr->getPertinenceNiveau() ?>
</div>
</div>
</div>
</div>
<div class="col-md-9">
<h3 style="margin-top:0.3em; margin-bottom:-0.2em;">Types de formations dans le groupe</h3><br/>
<table class="table table-bordered table-condensed table-extra-condensed table-sort">
<thead>
<th>Libelle court</th>
<th>Libelle</th>
<th>Source</th>
<th>Source code</th>
<th>Service</th>
<?php if (($canEdit) && (!$noActions)) echo '<th>Actions</th>' ?>
</thead>
<tbody>
<?php foreach ($typeFormations
as $tf) {
if ($tf->getGroupe()->getId() == $fr->getId()) { ?>
<tr>
<td>
<?= $tf->getLibelleCourt() ?>
</td>
<td>
<?= $tf->getLibelleLong() ?>
</td>
<td>
<?= $tf->getSource() ?>
</td>
<td>
<?= $tf->getSourceCode() ?>
</td>
<td>
<?php echo($tf->isServiceStatutaire() ? "Statutaire" : "non statutaire") ?>
</td>
<?php if (($canEdit) && ($tf->getSource()->getLibelle() == 'OSE')) { ?>
<td style="text-align:center;width:1px;white-space: nowrap">
<a class="ajax-modal" data-event="groupe-type-formation-saisie"
href="<?= $this->url('groupe-type-formation/type-formation-saisie', ['groupe-type-formation' => $fr->getId(), 'type-formation' => $tf->getId()]) ?>"
title="Modifier le Type de Formation">
<span class="glyphicon glyphicon-edit"></span></a>
<a class="pop-ajax"
href="<?= $this->url('groupe-type-formation/type-formation-delete', ['type-formation' => $tf->getId()]) ?>"
title="Supprimer le Type de Formation"
data-content="<p class='lead text-danger'><strong>Attention!</strong> Confirmez-vous cette suppression ?</p>"
data-confirm="true"
data-confirm-button="Oui"
data-cancel-button="Non"
data-submit-reload="true"
>
<span class="glyphicon glyphicon-remove"></span>
</a>
</td>
</tr>
<?php } elseif (!$noActions) echo '<td></td>' ?>
<?php } ?>
<?php } ?>
</tbody>
</table>
<?php if (($canEdit) && ($fr->getSource()->getLibelle() == 'OSE')): ?>
<a class="btn btn-xs btn-primary ajax-modal" style="margin-top:0.5em; "
data-event="groupe-type-formation-saisie"
href="<?= $this->url('groupe-type-formation/type-formation-saisie', ['groupe-type-formation' => $fr->getId()]) ?>"
title="Ajouter un type de formation">
<span class="glyphicon glyphicon-edit"></span>
Ajouter un type de formation</a>
<?php endif ?>
</div>
</div>
</div>
</div>
<?php } ?>
<?php if ($canEdit): ?>
<a class="btn btn-primary ajax-modal" data-event="groupe-type-formation-saisie"
href="<?= $this->url('groupe-type-formation/saisie') ?>"
title="Ajouter un type de formation">
<span class="glyphicon glyphicon-edit"></span>
Ajouter un groupe de type de formation</a>
<script type="text/javascript">
$(function () {
$("body").on("groupe-type-formation-saisie", function (event, data) {
window.location.reload();
});
});
</script>
<?php endif ?>
<?php
/**
* @var $this \Application\View\Renderer\PhpRenderer
* @var $form \Application\Form\GroupeTypeFormation\GroupeTypeFormationSaisieForm
*/
echo $this->messenger()->addCurrentMessagesFromFlashMessenger();
echo $this->form($form);
<?php
/**
* @var $this \Application\View\Renderer\PhpRenderer
* @var $form \Application\Form\GroupeTypeFormation\GroupeTypeFormationSaisieForm
*/
echo $this->messenger()->addCurrentMessagesFromFlashMessenger();
echo $this->form($form);
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment