Skip to content
Snippets Groups Projects
Commit 8f3f4bfe authored by Jean-Philippe Metivier's avatar Jean-Philippe Metivier
Browse files

WIP

parent a65c34d7
Branches
Tags
No related merge requests found
Pipeline #29719 failed
Showing
with 452 additions and 57 deletions
...@@ -50,6 +50,7 @@ return [ ...@@ -50,6 +50,7 @@ return [
'controller' => ApplicationController::class, 'controller' => ApplicationController::class,
'action' => [ 'action' => [
'modifier', 'modifier',
'associer-categories',
], ],
'privileges' => [ 'privileges' => [
ApplicationPrivileges::APPLICATION_MODIFIER, ApplicationPrivileges::APPLICATION_MODIFIER,
...@@ -122,6 +123,16 @@ return [ ...@@ -122,6 +123,16 @@ return [
], ],
], ],
], ],
'associer-categories' => [
'type' => Segment::class,
'options' => [
'route' => '/associer-categories/:application',
'defaults' => [
/** @see ApplicationController::associerCategoriesAction() */
'action' => 'associer-categories',
],
],
],
'historiser' => [ 'historiser' => [
'type' => Segment::class, 'type' => Segment::class,
'options' => [ 'options' => [
......
...@@ -4,6 +4,10 @@ namespace Application; ...@@ -4,6 +4,10 @@ namespace Application;
use Application\Controller\CategorieController; use Application\Controller\CategorieController;
use Application\Controller\CategorieControllerFactory; use Application\Controller\CategorieControllerFactory;
use Application\Form\AssocierCategories\AssocierCategoriesForm;
use Application\Form\AssocierCategories\AssocierCategoriesFormFactory;
use Application\Form\AssocierCategories\AssocierCategoriesHydrator;
use Application\Form\AssocierCategories\AssocierCategoriesHydratorFactory;
use Application\Form\Categorie\CategorieFormFactory; use Application\Form\Categorie\CategorieFormFactory;
use Application\Form\Categorie\CategorieHydrator; use Application\Form\Categorie\CategorieHydrator;
use Application\Form\Categorie\CategorieHydratorFactory; use Application\Form\Categorie\CategorieHydratorFactory;
...@@ -168,11 +172,13 @@ return [ ...@@ -168,11 +172,13 @@ return [
], ],
'form_elements' => [ 'form_elements' => [
'factories' => [ 'factories' => [
AssocierCategoriesForm::class => AssocierCategoriesFormFactory::class,
CategorieServiceFactory::class => CategorieFormFactory::class, CategorieServiceFactory::class => CategorieFormFactory::class,
], ],
], ],
'hydrators' => [ 'hydrators' => [
'factories' => [ 'factories' => [
AssocierCategoriesHydrator::class => AssocierCategoriesHydratorFactory::class,
CategorieHydrator::class => CategorieHydratorFactory::class, CategorieHydrator::class => CategorieHydratorFactory::class,
], ],
], ],
......
...@@ -9,6 +9,8 @@ ...@@ -9,6 +9,8 @@
namespace Application; namespace Application;
use Application\Controller\ApplicationController;
use Application\Controller\CategorieController;
use Application\Controller\IndexController; use Application\Controller\IndexController;
use Application\Controller\IndexControllerFactory; use Application\Controller\IndexControllerFactory;
use Doctrine\ORM\Mapping\Driver\XmlDriver; use Doctrine\ORM\Mapping\Driver\XmlDriver;
...@@ -60,6 +62,37 @@ return [ ...@@ -60,6 +62,37 @@ return [
], ],
], ],
'navigation' => [
'default' => [
'home' => [
'pages' => [
'ressources' => [
'order' => 1000,
'label' => 'Ressources',
'title' => "ressources",
'route' => 'home',
'pages' => [
'application' => [
'label' => 'Gestion des applications',
'route' => 'application',
'resource' => PrivilegeController::getResourceId(ApplicationController::class, 'index'),
'order' => 1000,
'icon' => 'fas fa-angle-right',
],
'categorie' => [
'label' => 'Gestion des catégories',
'route' => 'categorie',
'resource' => PrivilegeController::getResourceId(CategorieController::class, 'index'),
'order' => 1000,
'icon' => 'fas fa-angle-right',
],
],
],
],
],
],
],
'router' => [ 'router' => [
'routes' => [ 'routes' => [
'home' => [ 'home' => [
......
...@@ -5,6 +5,7 @@ namespace Application\Controller; ...@@ -5,6 +5,7 @@ namespace Application\Controller;
use Application\Entity\Db\Application; use Application\Entity\Db\Application;
use Application\Form\Application\ApplicationFormAwareTrait; use Application\Form\Application\ApplicationFormAwareTrait;
use Application\Form\AssocierCategories\AssocierCategoriesFormAwareTrait;
use Application\Service\Application\ApplicationServiceAwareTrait; use Application\Service\Application\ApplicationServiceAwareTrait;
use Laminas\Http\Response; use Laminas\Http\Response;
use Laminas\Mvc\Controller\AbstractActionController; use Laminas\Mvc\Controller\AbstractActionController;
...@@ -13,7 +14,7 @@ use Laminas\View\Model\ViewModel; ...@@ -13,7 +14,7 @@ use Laminas\View\Model\ViewModel;
class ApplicationController extends AbstractActionController { class ApplicationController extends AbstractActionController {
use ApplicationServiceAwareTrait; use ApplicationServiceAwareTrait;
use ApplicationFormAwareTrait; use ApplicationFormAwareTrait;
//use AssocierCategoriesFormAwareTrait; use AssocierCategoriesFormAwareTrait;
public function indexAction(): ViewModel public function indexAction(): ViewModel
{ {
...@@ -130,31 +131,30 @@ class ApplicationController extends AbstractActionController { ...@@ -130,31 +131,30 @@ class ApplicationController extends AbstractActionController {
return $vm; return $vm;
} }
// public function associerAction() public function associerCategoriesAction(): ViewModel
// { {
// $application = $this->getApplicationService()->getRequestedApplication($this); $application = $this->getApplicationService()->getRequestedApplication($this);
// $form = $this->getAssocierCategoriesForm(); $form = $this->getAssocierCategoriesForm();
// $form->setAttribute('action', $this->url()->fromRoute('application/associer', ['application' => $application->getId()], [], true)); $form->setAttribute('action', $this->url()->fromRoute('application/associer-categories', ['application' => $application->getId()], [], true));
// $form->bind($application); $form->bind($application);
//
// /** @var Request $request */ $request = $this->getRequest();
// $request = $this->getRequest(); if ($request->isPost()) {
// if ($request->isPost()) { $data = $request->getPost();
// $data = $request->getPost(); if (!isset($data['categories'])) $data['categories'] = [];
// if (!isset($data['categories'])) $data['categories'] = []; $form->setData($data);
// $form->setData($data); if ($form->isValid()) {
// if ($form->isValid()) { $this->getApplicationService()->update($application);
// $this->getApplicationService()->update($application); exit();
// //return $this->redirect()->toRoute('application', [], [], true); }
// } }
// }
// $vm = new ViewModel();
// $vm = new ViewModel(); $vm->setTemplate('default/default-form');
// $vm->setTemplate('application/default/default-form'); $vm->setVariables([
// $vm->setVariables([ 'title' => "Associer des catégories à une application",
// 'title' => "Associer des catégories à une application", 'form' => $form,
// 'form' => $form, ]);
// ]); return $vm;
// return $vm; }
// }
} }
\ No newline at end of file
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
namespace Application\Controller; namespace Application\Controller;
use Application\Form\Application\ApplicationForm; use Application\Form\Application\ApplicationForm;
use Application\Form\AssocierCategories\AssocierCategoriesForm;
use Application\Service\Application\ApplicationService; use Application\Service\Application\ApplicationService;
use Interop\Container\ContainerInterface; use Interop\Container\ContainerInterface;
use Psr\Container\ContainerExceptionInterface; use Psr\Container\ContainerExceptionInterface;
...@@ -19,17 +20,17 @@ class ApplicationControllerFactory { ...@@ -19,17 +20,17 @@ class ApplicationControllerFactory {
/** /**
* @var ApplicationService $applicationService * @var ApplicationService $applicationService
* @var ApplicationForm $applicationForm * @var ApplicationForm $applicationForm
// * @var AssocierCategoriesForm $associerCategorieForm * @var AssocierCategoriesForm $associerCategorieForm
*/ */
$applicationService = $container->get(ApplicationService::class); $applicationService = $container->get(ApplicationService::class);
$applicationForm = $container->get('FormElementManager')->get(ApplicationForm::class); $applicationForm = $container->get('FormElementManager')->get(ApplicationForm::class);
// $associerCategorieForm = $container->get('FormElementManager')->get(AssocierCategoriesForm::class); $associerCategorieForm = $container->get('FormElementManager')->get(AssocierCategoriesForm::class);
$controller = new ApplicationController(); $controller = new ApplicationController();
$controller->setApplicationService($applicationService); $controller->setApplicationService($applicationService);
$controller->setApplicationForm($applicationForm); $controller->setApplicationForm($applicationForm);
// $controller->setAssocierCategoriesForm($associerCategorieForm); $controller->setAssocierCategoriesForm($associerCategorieForm);
return $controller; return $controller;
} }
} }
\ No newline at end of file
...@@ -56,9 +56,10 @@ class Categorie implements HistoriqueAwareInterface { ...@@ -56,9 +56,10 @@ class Categorie implements HistoriqueAwareInterface {
$this->ordre = $ordre; $this->ordre = $ordre;
} }
public function getApplications(): ArrayCollection /** @return Application[] */
public function getApplications(): array
{ {
return $this->applications; return $this->applications->toArray();
} }
public function clearApplications(): void public function clearApplications(): void
......
<?php
namespace Application\Form\AssocierCategories;
use Application\Service\Categorie\CategorieServiceAwareTrait;
use Laminas\Form\Element\Button;
use Laminas\Form\Element\Select;
use Laminas\Form\Form;
use Laminas\InputFilter\Factory;
class AssocierCategoriesForm extends Form {
use CategorieServiceAwareTrait;
public function init(): void
{
//parent
$this->add([
'type' => Select::class,
'name' => 'categories',
'options' => [
'label' => "Categories à associer :",
//'empty_option' => "Aucune categorie",
'value_options' => $this->getCategorieService()->getCategoriesAsOptions(),
],
'attributes' => [
'id' => 'categories',
'multiple' => true,
],
]);
//submit
$this->add([
'type' => Button::class,
'name' => 'bouton',
'options' => [
'label' => '<i class="fas fa-save"></i> Enregistrer',
'label_options' => [
'disable_html_escape' => true,
],
],
'attributes' => [
'type' => 'submit',
'class' => 'btn btn-primary',
],
]);
$this->setInputFilter((new Factory())->createInputFilter([
'categories' => [
'name' => 'categories',
'required' => false,
],
]));
}
}
\ No newline at end of file
<?php
namespace Application\Form\AssocierCategories;
trait AssocierCategoriesFormAwareTrait {
private AssocierCategoriesForm $associerCategoriesForm;
public function getAssocierCategoriesForm(): AssocierCategoriesForm
{
return $this->associerCategoriesForm;
}
public function setAssocierCategoriesForm(AssocierCategoriesForm $associerCategoriesForm): void
{
$this->associerCategoriesForm = $associerCategoriesForm;
}
}
\ No newline at end of file
<?php
namespace Application\Form\AssocierCategories;
use Application\Service\Categorie\CategorieService;
use Interop\Container\ContainerInterface;
use Psr\Container\ContainerExceptionInterface;
use Psr\Container\NotFoundExceptionInterface;
class AssocierCategoriesFormFactory {
/**
* @throws ContainerExceptionInterface
* @throws NotFoundExceptionInterface
*/
public function __invoke(ContainerInterface $container): AssocierCategoriesForm
{
/**
* @var CategorieService $categorieService
* @var AssocierCategoriesHydrator $hydrator
*/
$categorieService = $container->get(CategorieService::class);
$hydrator = $container->get('HydratorManager')->get(AssocierCategoriesHydrator::class);
$form = new AssocierCategoriesForm();
$form->setCategorieService($categorieService);
$form->setHydrator($hydrator);
return $form;
}
}
\ No newline at end of file
<?php
namespace Application\Form\AssocierCategories;
use Application\Entity\Db\Application;
use Application\Service\Categorie\CategorieServiceAwareTrait;
use Laminas\Hydrator\HydratorInterface;
class AssocierCategoriesHydrator implements HydratorInterface {
use CategorieServiceAwareTrait;
public function extract(object $object): array
{
/** @var Application $object */
$categoriesId = [];
foreach ($object->getCategories() as $categorie) $categoriesId[] = $categorie->getId();
$data = [
'categories' => $categoriesId,
];
return $data;
}
public function hydrate(array $data, object $object): object
{
$categories = [];
foreach ($data['categories'] as $categorieId) $categories[] = $this->getCategorieService()->getCategorie($categorieId);
$object->clearCategories();
/** @var Application $object */
foreach ($categories as $categorie) $object->addCategorie($categorie);
return $object;
}
}
\ No newline at end of file
<?php
namespace Application\Form\AssocierCategories;
use Application\Service\Categorie\CategorieService;
use Interop\Container\ContainerInterface;
use Psr\Container\ContainerExceptionInterface;
use Psr\Container\NotFoundExceptionInterface;
class AssocierCategoriesHydratorFactory {
/**
* @throws ContainerExceptionInterface
* @throws NotFoundExceptionInterface
*/
public function __invoke(ContainerInterface $container): AssocierCategoriesHydrator
{
/**
* @var CategorieService $categorieService
*/
$categorieService = $container->get(CategorieService::class);
$hydrator = new AssocierCategoriesHydrator();
$hydrator->setCategorieService($categorieService);
return $hydrator;
}
}
\ No newline at end of file
...@@ -8,9 +8,7 @@ ...@@ -8,9 +8,7 @@
use Application\Entity\Db\Application; use Application\Entity\Db\Application;
use Application\Entity\Db\Categorie; use Application\Entity\Db\Categorie;
use Application\Provider\Privileges\ApplicationPrivileges; use Application\Provider\Privileges\ApplicationPrivileges;
use Application\Provider\Privileges\CategoriePrivileges;
$canCategorieIndex = $this->isAllowed(CategoriePrivileges::getResourceId(CategoriePrivileges::CATEGORIE_INDEX));
$canApplicationAfficher = $this->isAllowed(ApplicationPrivileges::getResourceId(ApplicationPrivileges::APPLICATION_AFFICHER)); $canApplicationAfficher = $this->isAllowed(ApplicationPrivileges::getResourceId(ApplicationPrivileges::APPLICATION_AFFICHER));
$canApplicationAjouter = $this->isAllowed(ApplicationPrivileges::getResourceId(ApplicationPrivileges::APPLICATION_AJOUTER)); $canApplicationAjouter = $this->isAllowed(ApplicationPrivileges::getResourceId(ApplicationPrivileges::APPLICATION_AJOUTER));
...@@ -58,7 +56,8 @@ $this->headTitle('Application'); ...@@ -58,7 +56,8 @@ $this->headTitle('Application');
<td> <td>
<?php echo $application->getLibelle(); ?> <?php echo $application->getLibelle(); ?>
<?php if ($application->getDescription()) : ?> <?php if ($application->getDescription()) : ?>
<span class="icon icon-information text-info" data-bs-toggle="tooltip" data-bs-html="true" title="<?php echo htmlentities($application->getDescription()); ?>"> <span class="icon icon-information text-info" data-bs-toggle="tooltip" data-bs-html="true"
title="<?php echo htmlentities($application->getDescription()); ?>">
</span> </span>
<?php endif; ?> <?php endif; ?>
<?php if ($application->getLien()) : ?> <?php if ($application->getLien()) : ?>
...@@ -69,7 +68,9 @@ $this->headTitle('Application'); ...@@ -69,7 +68,9 @@ $this->headTitle('Application');
<td> <td>
<?php <?php
$categories = $application->getCategories(); $categories = $application->getCategories();
usort($categories, function(Categorie $a, Categorie $b) {return $a->getLibelle() <=> $b->getLibelle();}); usort($categories, function (Categorie $a, Categorie $b) {
return $a->getLibelle() <=> $b->getLibelle();
});
?> ?>
<?php if (empty($categories)) : ?> <?php if (empty($categories)) : ?>
<em> Aucune catégorie </em> <em> Aucune catégorie </em>
......
<?php
/**
* @see \Application\Controller\CategorieController::afficherAction()
* @var Categorie $categorie
*/
use Application\Entity\Db\Categorie;
$this->headTitle($categorie->getLibelle());
?>
<span class="todo">...</span>
\ No newline at end of file
<?php
/**
* @see \Application\Controller\CategorieController::indexAction()
* @var Categorie[] $categories
*/
use Application\Entity\Db\Application;
use Application\Entity\Db\Categorie;
use Application\Provider\Privileges\CategoriePrivileges;
$canCategorieAfficher = $this->isAllowed(CategoriePrivileges::getResourceId(CategoriePrivileges::CATEGORIE_AFFICHER));
$canCategorieAjouter = $this->isAllowed(CategoriePrivileges::getResourceId(CategoriePrivileges::CATEGORIE_AJOUTER));
$canCategorieModifier = $this->isAllowed(CategoriePrivileges::getResourceId(CategoriePrivileges::CATEGORIE_MODIFIER));
$canCategorieHistoriser = $this->isAllowed(CategoriePrivileges::getResourceId(CategoriePrivileges::CATEGORIE_HISTORISER));
$canCategorieSupprimer = $this->isAllowed(CategoriePrivileges::getResourceId(CategoriePrivileges::CATEGORIE_SUPPRIMER));
$this->headTitle('Catégorie');
?>
<br>
<div class="row">
<div class="col-md-8">
<h1 class="page-header">
Catégorie
</h1>
</div>
<?php if ($canCategorieAjouter) : ?>
<div class="col-md-4">
<div class="float-end">
<?php /** @see \Application\Controller\CategorieController::ajouterAction() */ ?>
<a href="<?php echo $this->url('categorie/ajouter', [], [], true); ?>"
class="btn btn-primary ajax-modal" data-event="modification">
<span class="icon icon-ajouter"></span>
Ajouter une catégorie
</a>
</div>
</div>
<?php endif; ?>
</div>
<table class="table table-condensed datatable">
<thead>
<tr>
<th> Libellé</th>
<th> Application·s</th>
<th> Ordre</th>
<th> Dernière modification</th>
<th class="action"> Action</th>
</tr>
</thead>
<tbody>
<?php foreach ($categories as $categorie) : ?>
<tr>
<td>
<?php echo $categorie->getLibelle(); ?>
<?php if ($categorie->getDescription()) : ?>
<span class="icon icon-information text-info" data-bs-toggle="tooltip" data-bs-html="true"
title="<?php echo htmlentities($categorie->getDescription()); ?>">
</span>
<?php endif; ?>
</td>
<td>
<?php
$applications = $categorie->getApplications();
usort($applications, function (Application $a, Application $b) {
return $a->getLibelle() <=> $b->getLibelle();
});
?>
<?php if (empty($applications)) : ?>
<em> Aucune application </em>
<?php else : ?>
<ul>
<?php foreach ($applications as $application) : ?>
<li> <?php echo $application->getLibelle(); ?></li>
<?php endforeach; ?>
</ul>
<?php endif; ?>
</td>
<td>
<?php echo $categorie->getOrdre(); ?>
</td>
<td>
<?php echo $categorie->getHistoModification()->format('d/m/Y à H:i'); ?> <br>
<?php echo $categorie->getHistoModificateur()->getDisplayName(); ?>
</td>
<td class="action">
<?php if ($canCategorieAfficher) : ?>
<?php /** @see \Application\Controller\CategorieController::afficherAction() */ ?>
<a href="<?php echo $this->url('categorie/afficher', ['categorie' => $categorie->getId()], [], true); ?>"
class="ajax-modal"
>
<span class="icon icon-voir"></span> Afficher
</a>
<?php endif; ?>
<?php if ($canCategorieModifier) : ?>
<br>
<?php /** @see \Application\Controller\CategorieController::modifierAction() */ ?>
<a href="<?php echo $this->url('categorie/modifier', ['categorie' => $categorie->getId()], [], true); ?>"
class="ajax-modal" data-event="modification"
>
<span class="icon icon-editer"></span> Modifier
</a>
<br>
<?php /** @see \Application\Controller\CategorieController::associerApplicationsAction() */ ?>
<a href="<?php //echo $this->url('categorie/associer-applications', ['categorie' => $categorie->getId()], [], true); ?>"
class="ajax-modal" data-event="modification"
>
<span class="icon icon-lier"></span> Associer applications
</a>
<?php endif; ?>
<?php if ($canCategorieHistoriser) : ?>
<br>
<?php if ($categorie->estNonHistorise()) : ?>
<?php /** @see \Application\Controller\CategorieController::historiserAction() */ ?>
<a href="<?php echo $this->url('categorie/historiser', ['categorie' => $categorie->getId()], [], true); ?>"
>
<span class="icon icon-historiser"></span> Historiser
</a>
<?php else: ?>
<?php /** @see \Application\Controller\CategorieController::restaurerAction() */ ?>
<a href="<?php echo $this->url('categorie/restaurer', ['categorie' => $categorie->getId()], [], true); ?>"
>
<span class="icon icon-restaurer"></span> Restaurer
</a>
<?php endif; ?>
<?php endif; ?>
<?php if ($canCategorieSupprimer) : ?>
<br>
<?php /** @see \Application\Controller\CategorieController::supprimerAction() */ ?>
<a href="<?php echo $this->url('categorie/supprimer', ['categorie' => $categorie->getId()], [], true); ?>"
class="ajax-modal" data-event="modification"
>
<span class="text-danger">
<span class="icon icon-unchecked"></span> Supprimer
</span>
</a>
<?php endif; ?>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<script>
$(function () {
$("body").on("modification", function (event) {
event.div.modal('hide');
window.location.reload();
});
});
$(function () {
$("table").DataTable({
'paging': false,
'info': false,
});
});
</script>
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment