Bonjour, bonsoir,
je suis actuellement en train de travailler au boulot sur une application web (sous Laravel 5.2) pour un client et j'ai quelques interrogations concernant l'algo (et le reste).

Pour faire simple:

  • client fait faire des programmes à une entreprise
  • l'entreprise doit me up les programmes quand ils sont fait, un programme = un user = une semaine
  • l'utilisateur se connecte, va dans sa page de "programmes" et voit donc un listage de ces fichiers PDF (et uniquement les siens) dans l'ordre du plus récent au plus ancien
  • le nom du fichier va être du genre "31122016_1234.pdf" avec la date du programme et le numéro id de l'user.
Le problème

Je me pose la question de la méthode ! Le mieux serait de faire passer cela vers une BDD mais bon, pour cela il faut déjà pouvoir trier les fichiers...
J'ai utilisé la fonction Glob pour faire un tri et ne garder que les fichiers de l'user.

$userNumber = Auth::user()->number;
        $dir = "programmes/*_$userNumber.pdf";
        // Open a known directory, and proceed to read its contents
        foreach (glob($dir) as $file) {
            $filename = basename($file);
            echo "<a href='programmes/$filename' target='_blank'>Date: $filename</a><br />";
        } 

Bref, au final j'arrive à obtenir une liste propre à l'user, mais pas dans un très bon ordre etc... Un bon bordel et je trouve cela vraiment indigeste...

Des avis sur l'algo pour se faire et sur les façons de mettre tout cela en place ?

Merci d'avance pour les avis

5 réponses


Bonsoir.
Si tu peux modifier le nom des fichiers, il serait préférable d'inverser l'ordre de la date, soit sous le format : YYYYMMDD (20161231).
De cette manière, tu pourras faire :

$files = glob($dir);
$files = arsort($files);
foreach ($files as $file) {
    // ...
}

La fonction arsort permet de trier un tableau dans l'ordre décroissant, ce qui fait que si tu peut modifier le nom des fichiers dans le format que j'ai montré, tu pourras récupérer les fichiers du plus récent au plus ancien.

znne
Auteur

Bien vu pour la fonction, je ne connaissais pas :)
Reste à savoir maintenant si tout cela est bien viable... J'ai horreur de travailler sur des fichiers !

Normalement je devrais aussi notifier l'administrateur si quelqu'un n'a pas lu le programme... Quel bordel !

Un peu HS, mais pour t'éviter des soucis, tu devrais gérer les dates par dossier. Tous les serveurs GNU/Linux ont une limite dans la quantité de fichiers que peut contenir un dossier. Et c'est typiquement le genre de chose que tu ne veux pas avoir à gérer quand le problème est bien installé.

Sinon à ta place, pour gérer ça, je le ferais en base de données, comme tu le suggères. Imagine un peu le jour où tu découvres que ta convention de nommage a sautée pour telle ou telle raison, tu vas pleurer.

znne
Auteur

Je reviens un peu là dessus:
Au final, je vais classer les documents par années et par numéro de semaine afin de limiter le nombre de fichiers par dossier, puis je nome les fichiers comme cela: 20161231_numeroid.pdf

Salut

Pour notifier l'administrateur tu devrais regarder les events. Cela permet de ne pas surcharger le code de ton controller. Cela permet aussi de déporter des traitement qui peuvent etre long et ainsi améliorer les perfs de ton appli
https://laravel.com/docs/5.2/events