Partage
  • Partager sur Facebook
  • Partager sur Twitter

Progress bar dynamique

Avec les dates

Sujet résolu
    17 mai 2019 à 19:51:48

    Bonjour à  toutes et tous,

    Je planche sur un problème depuis quelques temps, je souhaite créer une progress bar dynamique qui change avec le temps. (c'est pour une app ou je créé des fiches pour des concerts, donc y à des dates : date de création de la fiche ---> date de début du concert et date de fin).

    Pour le moment j'en suis là :

    public function getProgress()
        {
            $crea = strtotime($this->getCreationDate());
            $start = strtotime($this->getDateStart());
            $end = strtotime($this->getDateEnd());
            $now = time();
    
            if ($this->getDateEnd() && $this->getDateStart()) {
                if ($crea > $now) {
                    $percentage = 100;
                    $txt = '<i class="fas fa-exclamation-triangle"></i> | Date créatº > Maitenant | <i class="fas fa-exclamation-triangle"></i>';
                } else if ($start > $end) {
                    $percentage = 100;
                    $txt = '<i class="fas fa-exclamation-triangle"></i> | Date start > Date end | <i class="fas fa-exclamation-triangle"></i>';
                } else {
                    if ($now < $start) {
                        $total = ($start - $now) / 86400;
                        $txt = 'Débute dans ' . round($total) . ' jrs';
                        $percentage = round(($now - $crea) / ($end - $crea) * 100);
                    }
    
                    if ($now >= $start) {
                        $total = ($end - $now) / 86400;
                        $txt = 'Fini dans ' . round($total) . ' jrs';
                        $percentage = round(($now - $crea) / ($end - $crea) * 100);
                    }
    
                    if ($now > $end) {
                        $percentage = 100;
                        $since = ($now - $end) / 86400;
                        $txt = '<i class="fas fa-check"></i> Terminé (+' . round($since) . ' jrs)';
                    }
    
                }
            } else {
                $txt = 'En attente d\'informations';
            }

    Ça fonctionne... un peu ! en gros, le calcul se fait pas de manière précise.

    Voici en gros le fonctionnement :

    Le % de la progress bar est déterminé par la date de fin et now (time())

    Si now est supérieur a la date de fin du concert alors le % égal 100... et je souhaite avoir le % le plus précis possible depuis la date de création de de la fiche du concert.

    Je bloque vraiment et une aide avisée sera plus que la bien venue :)

    Merci d'avance pour vos retours.

    • Partager sur Facebook
    • Partager sur Twitter
      17 mai 2019 à 20:11:16

      Bonsoir.

      Tu définis la variable `$percentage` à trois reprises en lui donnant comme valeur `100`.

      Tu ne crois pas que ce serait mieux d'en faire la définition par défaut avant même la première condition ?

      Ce qui t'évitera déjà une répétition de code inutile.

      • Partager sur Facebook
      • Partager sur Twitter

      Face a quelqu'un pour qui l'on n'éprouve que de l'aversion et du mépris, les yeux d'un homme deviennent extrêmement froids et cruels.

        17 mai 2019 à 20:14:48

        Non mais lit le code mdr !!! il y à une raison et le code est assez propre, tu répond à beaucoup de messages mais constat : cela sert pas à grand chose...

        si tu as une idée pour m'aider ce sera avec plaisir :)

        -
        Edité par Artof 17 mai 2019 à 20:22:24

        • Partager sur Facebook
        • Partager sur Twitter
          17 mai 2019 à 20:23:37

          Je l'ai déjà fait, je ne m'amuses pas à poster dans un sujet sans avoir lu la totalité de son contenu.

          Tu sais ce que c'est au moins de donner une valeur par défaut à une variable au moins ?

          Car j'ai eu beau relire 6 fois ton code et je ne vois pas en quoi c'est nécessaire que tu redéfinisse la variable deux fois de plus pour lui donner la même valeur.

          -
          Edité par Lartak 17 mai 2019 à 20:26:42

          • Partager sur Facebook
          • Partager sur Twitter

          Face a quelqu'un pour qui l'on n'éprouve que de l'aversion et du mépris, les yeux d'un homme deviennent extrêmement froids et cruels.

            17 mai 2019 à 20:31:37

            Si tu l'as déjà fait, tu peux aider du coup sans non plus balancer ton code, mais donner une piste... et si tu as bien lu le code, tu as donc du voir que le % défini à plusieurs reprise l'est car il le faut (c'est des moments ou conditions spéciales (des erreurs par exemple, si la date de début est supérieur a la date de fin alors erreur) ...

            Certes un code peut toujours être optimisé et avec le temps il le sera mais déjà j'aimerai faire fonctionner niquel.

            Si tu as une idée pour optimiser je suis preneur mais comme il est là, il marche, manque juste la manière de faire le calcul correctement pour avoir le bon % aux bons moments ;)

            Petit Up,

            Dans ma réflexion, j'ai penses comme ca :

            $crea = timestamp = 0% (le point d'entré)

            $now = timestamp = ??% (obligatoirement supérieur à $crea mais inférieur à $end)

            $end = timestamp = 100%

            donc je fais ca pour tester :

            $percentage = (100 * $now) / $end;

            mais j'obtiens tout le temps 99,xxx%

            Bref, j'ai beau tourner le truc dans tous les sens, rien ne marche, y aurait-il quelqu'un qui pourrait m'éclairer :/

            Merci d'avance pour tes retour constructifs :)

            -
            Edité par Artof 18 mai 2019 à 8:30:22

            • Partager sur Facebook
            • Partager sur Twitter
              19 mai 2019 à 21:16:28

              Bonsoir,

              Je ne comprends pas quelque chose :

              • Tu veux un pourcentage qui est obligatoirement un entier ?
              • Ou tu n'arrives pas à avoir un pourcentage avec plus de 3 décimales ?

              Parce que dans ton premier code, tu round() à 0 décimal.

              @Lartak Le code peu largement être amélioré tout comme tes interventions :p

              -
              Edité par Foohx 19 mai 2019 à 21:20:53

              • Partager sur Facebook
              • Partager sur Twitter
                19 mai 2019 à 22:29:18

                Bonjour,

                tu parles de dates et tu utilises time() et des timestamp, c'est déjà un problème. On manque un peu d'infos, tu fais ton décompte en quelles unités ? Jours, heures...?

                • Partager sur Facebook
                • Partager sur Twitter
                  20 mai 2019 à 10:29:27

                  @philodick un timestamp via time()en PHP = secondes

                  -
                  Edité par Foohx 20 mai 2019 à 10:29:52

                  • Partager sur Facebook
                  • Partager sur Twitter
                    20 mai 2019 à 11:30:52

                    Donc tu gères  tout à la seconde près ? Quoi qu'il en soit, personnellement j'utiliserais plutôt la classe Datetime, c'est quand même beaucoup plus adapté. Tu pourrais calculer tes différences directement, en secondes si tu veux même si ça me semble un peu inutile.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      21 mai 2019 à 9:40:30

                      Bonjour à toutes et tous,

                      Dans mes précédents msg, j'était dans des phases de tests et je ne suis pas parti dans la bonne direction.

                      Foohx a écrit:

                      • Tu veux un pourcentage qui est obligatoirement un entier ? Non en fait, les decimale passent (eg : 45,4157632% ne pose pas de prob, c'est même plus précit du coup qu'avec round)
                      • Ou tu n'arrives pas à avoir un pourcentage avec plus de 3 décimales ?

                      Parce que dans ton premier code, tu round() à 0 décimal.

                      @Lartak Le code peu largement être amélioré tout comme tes interventions :p ---> Oui c'est sure, mais il a pas tord, après re re re re... lecture mon code a été largement amélioré (beaucoup de { } on sautés par exemple... :) merci quand meme a lui d'avoir rep hé hé hé

                      Ensuite, voici là ou il y avait des problèmes :

                              $crea = strtotime($this->getCreationDate()); // Là c'est un Datetime en base
                              $start = strtotime($this->getDateStart()); // Là c'est un Date en base
                              $end = strtotime($this->getDateEnd()); // Là c'est un Date en base
                              $now = time(); // Là vous savez lol

                      Partant de là, en passant toutes ses variables en Datetime et en faisant un strtotime de chaque, on peut faire se calcul :

                      $percentage = (($now - $crea) / ($end - $crea)) * 100;

                      Cela fonctionne, start est un marqueur (date du debut du concert) dans cette timeline qui est utilisé pour définir des états (Débute dans, à commencé, etc...), bref, Problème Résolu ;)

                      Merci pour vos retour, et éventuellement hésitez à envoyer vos idées, se sujet est assez récurent et je penses que cela aiderai pas mal de monde :)



                      -
                      Edité par Artof 21 mai 2019 à 9:45:06

                      • Partager sur Facebook
                      • Partager sur Twitter

                      Progress bar dynamique

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown