Commit 4d78a634 authored by Bertrand Gauthier's avatar Bertrand Gauthier
Browse files

Fichiers : visualisation des détails d'un fichier ; modification d'un fichier...

Fichiers : visualisation des détails d'un fichier ; modification d'un fichier (uniquement l'id permanent)
parent cbd64708
Loading
Loading
Loading
Loading
+47 −0
Original line number Diff line number Diff line
@@ -13,6 +13,10 @@ use Fichier\Controller\FichierController;
use Fichier\Controller\Plugin\UrlFichier;
use Fichier\Exporter\PageFichierIntrouvablePdfExporter;
use Fichier\Exporter\PageFichierIntrouvablePdfExporterFactory;
use Fichier\Form\FichierForm;
use Fichier\Form\FichierFormFactory;
use Fichier\Hydrator\FichierHydrator;
use Fichier\Hydrator\FichierHydratorFactory;
use Fichier\Provider\Privilege\FichierPrivileges;
use Fichier\Search\NatureFichierSearchFilter;
use Fichier\Search\NatureFichierSearchFilterFactory;
@@ -130,6 +134,8 @@ return [
                    'controller' => FichierController::class,
                    'action' => [
                        'televerser-fichiers-communs',
                        'afficher',
                        'modifier',
                        'supprimer',
                    ],
                    'privileges' => [
@@ -160,6 +166,7 @@ return [
                                'fichier' => '[a-zA-Z0-9-]+',
                            ],
                            'defaults' => [
                                /** @see \Fichier\Controller\FichierController::telechargerAction() */
                                'action' => 'telecharger',
                            ],
                        ],
@@ -169,10 +176,37 @@ return [
                        'options' => [
                            'route' => '/telecharger/permanent/:idPermanent',
                            'defaults' => [
                                /** @see \Fichier\Controller\FichierController::telechargerPermanentAction() */
                                'action' => 'telecharger-permanent',
                            ],
                        ],
                    ],
                    'afficher' => [
                        'type' => 'Segment',
                        'options' => [
                            'route' => '/afficher/:fichier',
                            'constraints' => [
                                'fichier' => '[a-zA-Z0-9-]+',
                            ],
                            'defaults' => [
                                /** @see \Fichier\Controller\FichierController::afficherAction() */
                                'action' => 'afficher',
                            ],
                        ],
                    ],
                    'modifier' => [
                        'type' => 'Segment',
                        'options' => [
                            'route' => '/modifier/:fichier',
                            'constraints' => [
                                'fichier' => '[a-zA-Z0-9-]+',
                            ],
                            'defaults' => [
                                /** @see \Fichier\Controller\FichierController::modifierAction() */
                                'action' => 'modifier',
                            ],
                        ],
                    ],
                    'supprimer' => [
                        'type' => 'Segment',
                        'options' => [
@@ -181,6 +215,7 @@ return [
                                'fichier' => '[a-zA-Z0-9-]+',
                            ],
                            'defaults' => [
                                /** @see \Fichier\Controller\FichierController::supprimerAction() */
                                'action' => 'supprimer',
                            ],
                        ],
@@ -190,6 +225,7 @@ return [
                        'options' => [
                            'route' => '/televerser-fichiers-communs',
                            'defaults' => [
                                /** @see \Fichier\Controller\FichierController::televerserFichiersCommunsAction() */
                                'action' => 'televerser-fichiers-communs',
                            ],
                        ],
@@ -199,6 +235,7 @@ return [
                        'options' => [
                            'route' => '/lister-fichiers-communs',
                            'defaults' => [
                                /** @see \Fichier\Controller\FichierController::listerFichiersCommunsAction() */
                                'action' => 'lister-fichiers-communs',
                            ],
                        ],
@@ -256,11 +293,21 @@ return [
            'Application\Controller\Fichier' => FichierController::class,
        ],
    ],
    'form_elements' => [
        'factories' => [
            FichierForm::class => FichierFormFactory::class,
        ],
    ] ,
    'controller_plugins' => [
        'invokables' => [
            'urlFichier' => UrlFichier::class,
        ],
    ],
    'hydrators' => [
        'factories' => [
            FichierHydrator::class => FichierHydratorFactory::class,
        ],
    ],
    'view_helpers' => [
        'invokables' => [
            'fichier' => FichierViewHelper::class,
+6 −1
Original line number Diff line number Diff line
@@ -4,6 +4,7 @@ namespace Fichier\Controller\Factory;

use Application\Search\SearchServicePluginManager;
use Fichier\Controller\FichierController;
use Fichier\Form\FichierForm;
use Fichier\Service\Fichier\FichierService;
use Fichier\Service\Fichier\FichierStorageService;
use Fichier\Service\Fichier\Search\FichierSearchService;
@@ -31,6 +32,10 @@ class FichierControllerFactory
        $fileService = $container->get(SearchServicePluginManager::class)->get(FichierSearchService::class);
        $service->setSearchService($fileService);

        /** @var FichierForm $fichierForm */
        $fichierForm = $container->get('FormElementManager')->get(FichierForm::class);
        $service->setFichierForm($fichierForm);

        return $service;
    }
}
 No newline at end of file
+60 −30
Original line number Diff line number Diff line
@@ -15,6 +15,7 @@ use DoctrineORMModule\Paginator\Adapter\DoctrinePaginator;
use Exception;
use Fichier\Entity\Db\Fichier;
use Fichier\Entity\Db\NatureFichier;
use Fichier\Form\FichierFormAwareTrait;
use Fichier\Provider\Privilege\FichierPrivileges;
use Fichier\Service\Fichier\FichierServiceAwareTrait;
use Fichier\Service\Fichier\FichierStorageServiceAwareTrait;
@@ -33,6 +34,7 @@ class FichierController extends AbstractController implements SearchControllerIn
    use SearchServiceAwareTrait;
    use SearchControllerTrait;

    use FichierFormAwareTrait;
    use FichierStorageServiceAwareTrait;
    use FichierServiceAwareTrait;

@@ -50,7 +52,7 @@ class FichierController extends AbstractController implements SearchControllerIn
        return new ViewModel([
            'paginator' => $paginator,
            'filters' => $this->filters(),
            'urlFichierPlugin' => $this->urlFichier(),
            'fichierUrlPlugin' => $this->urlFichier(),
        ]);
    }

@@ -78,8 +80,6 @@ class FichierController extends AbstractController implements SearchControllerIn

    /**
     * Surcharge de la méthode {@see SearchControllerTrait::filtersAction()}.
     *
     * @return ViewModel
     */
    public function filtersAction(): ViewModel
    {
@@ -87,14 +87,12 @@ class FichierController extends AbstractController implements SearchControllerIn

        $filters = $this->filters();

        $model = new ViewModel([
        return new ViewModel([
            'filters' => $filters,
        ]);

        return $model;
    }

    public function listerFichiersCommunsAction()
    public function listerFichiersCommunsAction(): Response|ViewModel
    {
        /**
         * Application des filtres et tris par défaut.
@@ -121,7 +119,8 @@ class FichierController extends AbstractController implements SearchControllerIn
            ->join('f.histoCreateur', 'hc')
            ->join('hc.individu', 'i')
            ->join('f.nature', 'n', Join::WITH, 'n.code = :code')
            ->setParameter('code', NatureFichier::CODE_COMMUNS);
            ->setParameter('code', NatureFichier::CODE_COMMUNS)
            ->andWhereNotHistorise('f');

        foreach (explode('+', $sort) as $sortProp) {
            $qb->addOrderBy($sortProp, $dir);
@@ -141,7 +140,7 @@ class FichierController extends AbstractController implements SearchControllerIn
        return $vm;
    }

    public function televerserFichiersCommunsAction()
    public function televerserFichiersCommunsAction(): Response
    {
        if (!$this->getRequest()->isPost()) {
            return $this->redirect()->toUrl($this->urlFichier()->listerFichiersCommuns());
@@ -159,7 +158,7 @@ class FichierController extends AbstractController implements SearchControllerIn
        return $this->redirect()->toUrl($this->urlFichier()->listerFichiersCommuns());
    }

    public function telechargerAction()
    public function telechargerAction(): void
    {
        $fichier = $this->requestFichier();

@@ -174,7 +173,7 @@ class FichierController extends AbstractController implements SearchControllerIn
        $this->uploader()->download($fichier);
    }

    public function telechargerPermanentAction()
    public function telechargerPermanentAction(): void
    {
        $idPermanent = $this->params()->fromRoute('idPermanent');
        /** @var Fichier|null $fichier */
@@ -195,40 +194,71 @@ class FichierController extends AbstractController implements SearchControllerIn
        $this->uploader()->download($fichier);
    }

    public function supprimerAction()
    public function afficherAction(): Response|ViewModel
    {
        $fichier = $this->requestFichier();

        if (! $this->isAllowed($fichier, FichierPrivileges::privilegeTeleverserFor($fichier->getNature()))) {
            throw new UnAuthorizedException("Suppression non autorisée.");
        if (!$this->isAllowed($fichier, FichierPrivileges::privilegeTelechargerFor($fichier->getNature()))) {
            throw new UnAuthorizedException("Visualisation non autorisée.");
        }

        $result = $this->confirm()->execute();
        $viewModel = new ViewModel();
        $viewModel->setVariables([
            'fichier' => $fichier,
            'fichierUrlPlugin' => $this->urlFichier(),
        ]);

        // si un tableau est retourné par le plugin Confirm, l'opération a été confirmée
        if (is_array($result)) {
            $this->fichierService->supprimerFichiers([$fichier]);
        return $viewModel;
    }

            $this->flashMessenger()->addSuccessMessage("Fichier '{$fichier->getNomOriginal()}' supprimé avec succès.");
    public function modifierAction(): Response|ViewModel
    {
        $fichier = $this->requestFichier();

            return $this->redirect()->toUrl($this->urlFichier()->listerFichiersCommuns());
        if (!$this->isAllowed($fichier, FichierPrivileges::privilegeTeleverserFor($fichier->getNature()))) {
            throw new UnAuthorizedException("Modification non autorisée.");
        }

        $viewModel = $this->confirm()->getViewModel();
        $this->fichierForm->bind($fichier);

        if ($this->getRequest()->isPost()) {
            $data = $this->getRequest()->getPost();
            $this->fichierForm->setData($data);
            if ($this->fichierForm->isValid()) {
                $this->fichierService->saveEntities([$fichier]);
                $this->flashMessenger()->addSuccessMessage("Fichier '{$fichier->getNom()}' modifié avec succès.");

                return $this->redirect()->toUrl($this->urlFichier()->afficherFichier($fichier));
            }
        }

        $this->fichierForm->setAttribute('action', $this->urlFichier()->modifierFichier($fichier));

        $viewModel = new ViewModel();
        $viewModel->setVariables([
            'title'   => "Suppression d'un fichier",
            'fichier' => $fichier,
            'form' => $this->fichierForm,
            'fichierUrlPlugin' => $this->urlFichier(),
        ]);

        return $viewModel;
    }

    public function supprimerAction(): Response
    {
        $fichier = $this->requestFichier();

        if (!$this->isAllowed($fichier, FichierPrivileges::privilegeTeleverserFor($fichier->getNature()))) {
            throw new UnAuthorizedException("Suppression non autorisée.");
        }

        $this->fichierService->supprimerFichiers([$fichier]);

        $this->flashMessenger()->addSuccessMessage("Fichier '{$fichier->getNomOriginal()}' supprimé avec succès.");

        return $this->redirect()->toUrl($this->urlFichier()->listerFichiersCommuns());
    }

    /**
     * @return Fichier
     */
    private function requestFichier()
    private function requestFichier(): Fichier
    {
        /** @var RouteMatch $routeMatch */
        $routeMatch = $this->getEvent()->getRouteMatch();
+2 −48
Original line number Diff line number Diff line
@@ -2,8 +2,6 @@

namespace Fichier\Controller\Plugin\Uploader;

use DateTime;

/**
 * Interface décrivant les caractéristiques obligatoires d'un fichier 
 * ayant fait l'objet d'un dépôt (upload).
@@ -13,51 +11,7 @@ use DateTime;
interface UploadedFileInterface extends \UnicaenApp\Controller\Plugin\Upload\UploadedFileInterface
{
    /**
     * Retourne le contenu du fichier.
     *
     * @return string 
     */
    public function getContenu();

    /**
     * Retourne le nom du fichier, ex: "image.png".
     *
     * @return string 
     */
    public function getNom();

    /**
     * Retourne la taille exacte du fichier au format numérique.
     *
     * @return float 
     */
    public function getTaille();

    /**
     * Retourne la taille du fichier dans un format lisible, ex: "1,12 Mo".
     *
     * @return string 
     */
    public function getTailleToString();

    /**
     * Retourne l'identifiant unique du fichier.
     *
     * @return mixed 
     */
    public function getId();

    /**
     * Retourne le type MIME du fichier, ex: "image/png".
     *
     * @return string
     */
    public function getTypeMime();

    /**
     * Retourne la date de dépôt du fichier.
     *
     * @return DateTime
     * Retourne la date de dépôt du fichier au format lisible.
     */
    public function getDate();
    public function getDateToString(): string;
}
 No newline at end of file
+23 −9
Original line number Diff line number Diff line
@@ -2,15 +2,15 @@

namespace Fichier\Controller\Plugin;

use Fichier\Entity\Db\Fichier;
use Application\Filter\IdifyFilterAwareTrait;
use Fichier\Entity\Db\Fichier;
use Laminas\Mvc\Controller\Plugin\Url as UrlPlugin;

class UrlFichier extends UrlPlugin
{
    use IdifyFilterAwareTrait;

    public function telechargerFichier(Fichier $fichier)
    public function telechargerFichier(Fichier $fichier): string
    {
        return $this->fromRoute('fichier/telecharger', [
            'fichier' => $this->idify($fichier),
@@ -18,21 +18,35 @@ class UrlFichier extends UrlPlugin
        ], [], true);
    }

    public function telechargerPermanentFichier(Fichier $fichier)
    public function telechargerPermanentFichier(Fichier $fichier): string
    {
        return $this->fromRoute('fichier/telecharger-permanent', [
            'idPermanent' => $fichier->getIdPermanent(),
        ], [], true);
    }

    public function telechargerPermanentId($idPermanent)
    public function telechargerPermanentId($idPermanent): string
    {
        return $this->fromRoute('fichier/telecharger-permanent', [
            'idPermanent' => $idPermanent,
        ], [], true);
    }

    public function supprimerFichier(Fichier $fichier)
    public function afficherFichier(Fichier $fichier): string
    {
        return $this->fromRoute('fichier/afficher', [
            'fichier' => $fichier->getUuid(),
        ], [], true);
    }

    public function modifierFichier(Fichier $fichier): string
    {
        return $this->fromRoute('fichier/modifier', [
            'fichier' => $fichier->getUuid(),
        ], [], true);
    }

    public function supprimerFichier(Fichier $fichier): string
    {
        return $this->fromRoute('fichier/supprimer', [
            'fichier' => $this->idify($fichier),
@@ -40,12 +54,12 @@ class UrlFichier extends UrlPlugin
        ], [], true);
    }

    public function listerFichiersCommuns()
    public function listerFichiersCommuns(): string
    {
        return $this->fromRoute('fichier/lister-fichiers-communs', [], [], true);
    }

    public function televerserFichiersCommuns()
    public function televerserFichiersCommuns(): string
    {
        return $this->fromRoute('fichier/televerser-fichiers-communs', [], [], true);
    }
Loading