IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

EDI, CMS, Outils, Scripts et API PHP Discussion :

[Calendrier] Dynamique avec passage de date en paramètre


Sujet :

EDI, CMS, Outils, Scripts et API PHP

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 181
    Points : 47
    Points
    47
    Par défaut [Calendrier] Dynamique avec passage de date en paramètre
    Bonjour, voilà mon souci.
    Je souci afficher un calendrier sous la forme d'un tableau (en tout cas c'est le seul moyen assez facile, enfin si on veux) qui n'affiche que les dates du mois à partir de la date passé en paramètre de ma fonction php.
    De plus, la première ligne de mon tableau correspond au jour de la semaine dans l'ordre L,M,M,J,V,S,D.
    J'ai réussi à trouvé un algorithme qui fonctionne mais il fonctionne seulement pour le mois de Mai 2014

    Connaissez-vous un moyen de réaliser cela.

    Je vous montre ma fonction au cas il y aurait peu de choses à modifier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    function calendrier ($date)
    {
        list($j, $m, $y)=explode('/', $date);
        $j = '01';$m = '05';$y = '2014';
        $tab = array ();
        $dlj = date('w', mktime(1, 1, 1, $m, 01,$y));echo $dlj;
        $nbj = cal_days_in_month(CAL_GREGORIAN, $m, $y);
        if($dlj == 0)
                $dlj = 7;
        $pos = $dlj - 1;
        $nbj_rest = $nbj - (7-$pos);
        $nbl = ceil($nbj_rest / 7) + 1;
        for($i = 0; $i<$nbl; $i++)
        {
            if($j < 7* ($i+1))
            {
                for($c = 0; $c<7; $c++)
                {
                    if((((7* ($i+1)) - 9 + $c) <= $nbj) and ($c >= $pos))
                    {
                        $tab [$i][$c] = (7* ($i+1)) - 9 + $c;
                        if($c == 6)
                            $pos = 0;
                        $jour = (7* ($i+1)) - 9 + $c;
                        if(strlen($jour) == 1)
                            $jour = "0".$jour;
                        $req = "SELECT jour FROM jours_feries WHERE jour = '$jour/$m/$y'";echo $req;
                        $res = mysql_query($req);
                        $donnees = mysql_fetch_assoc($res);
                        if($donnees != false)
                            $tab[$i][$c] = '';
                    }
                    else $tab[$i][$c] = ''; 
                }
            }
            else 
            {
                    for($c = 0; $c<7; $c++)
                    {
                            $tab[$i][$c] = '';
                    }
            }
        }var_dump($tab);
        return $tab;
    }

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Connaissez-vous un moyen de réaliser cela.
    Oui, dés que tu nous auras dit ce que tu veux faire

    Tu nous dis qu'il ne fonctionne que pour le moi de mai, il se passe quoi si tu mets une autre date ?

    le "passage de paramètre en date" est déjà ecrit dans la fonction, il y a juste une date fixe qui a été ajoutée en ligne 4 par dessus.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    Ton script m'a l'air bien compliqué.

    En voici un en version beaucoup plus simple si j'ai bien compris ce que tu souhaite faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    <?php
     
    function calendrier ($date) {
        $date = strtotime($date);
     
        $j = date('j',$date);
        $m = date('m',$date);
        $y = date('Y',$date);
     
        $jour = date('w',$date);
     
        $tab = array();
        $week = date('W',$date)-date('W',strtotime($y.'-'.$m.'-01'));
        $nbDaysMonth = cal_days_in_month(CAL_GREGORIAN, $m, $y);
        for ($i = $j; $i <= $nbDaysMonth;$i++) {
            $tab[$week][$jour] = $i;
            $jour++;
            if ($jour%7 == 0) {
                $week++;
                $jour=0;
            }
     
        }
        return $tab;
    }
     
    $cal = calendrier('2015-05-05');
     
    print_r($cal);
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

  4. #4
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 181
    Points : 47
    Points
    47
    Par défaut
    Merci Spartacusply, ta fonction semble très bien répondre à ce que je souhaite faire.
    J'aurai deux petites questions supplémentaires au sujet de cette fonction :

    Premièrement, j'ai essayé d'afficher ce tableau avec ce code et il me répond Undefined offset: 0 et cela pour plusieurs valeurs d'offset. Peux-tu me dire ou se situe mon erreur pour l'affichage ? Voilà le code que j'utilise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    <html>
    	<head>
     
    	</head>
    	<body>
    		<table>
    			<tr>
    				<th>L</th>
    				<th>M</th>
    				<th>M</th>
    				<th>J</th>
    				<th>V</th>
    				<th>S</th>
    				<th>D</th>
    			</tr>
    			<?php
    				for ($a=0; $a <= $i; $a++)
    				{
    					echo '<tr>';
    					for ($b=0; $b <= $j-1; $b++)
    					{	
    						echo '<td>'.$tab[$a][$b].'</td>';
    					}
    					echo '</tr>';
    				} ?>
    		</table>
    	</body>
    </html>
    Deuxièmement, j'ai une table mysql contenant les jours fériés de l'année ainsi que ceux rajoutés par un utilisateur. Je souhaiterais vérifié si le jour n'est pas dans la table jours_feries pour réaliser une condition pour savoir si je dois mettre la date dans le tableau ou non.
    Pourrais-tu me montrer un exemple stp ?
    Enfin si je suis assez clair bien-sur.

  5. #5
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    Il te suffit de faire un test sur l'existense (avec la fonction isset) pour enlever toutes ces erreurs de type notice. J'ai rajouté aussi le code nécessaire pour tester les jours fériés :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    <?php
    //Tu fais ta requête SQL pour récupérer les jours fériés dans le mois et tu stockes le résultat dans un tableau du genre :
    // $feries = array(1,15,23,27);
    ?>
    <html>
        <head>
     
        </head>
        <body>
            <table>
                <tr>
                    <th>L</th>
                    <th>M</th>
                    <th>M</th>
                    <th>J</th>
                    <th>V</th>
                    <th>S</th>
                    <th>D</th>
                </tr>
                <?php
                for ($a = 0; $a <= 5; $a++) {
                    echo '<tr>';
                    for ($b = 0; $b <= 6; $b++) {
                        echo '<td>';
                        if (isset($tab[$a][$b]) AND !in_array($tab[$a][$b],$feries)) echo $tab[$a][$b];
                        echo '</td>';
                    }
                    echo '</tr>';
                }
                ?>
            </table>
        </body>
    </html>
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

  6. #6
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 181
    Points : 47
    Points
    47
    Par défaut
    Merci. Seul souci lorsque l'on choisi par exemple le 01 Janvier, tout le calendrier est décalé de 1.
    Par exemple, le 1 Janvier 2011 qui normalement tombe un samedi et qui est férié, devient le dimanche et n'est plus férié puisqu'il s'affiche.
    Je te redonne mon code au cas où je me serais trompé quelque part :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    <?php
    	$date = strtotime('01/01/2011');
     
        $j = date('j',$date);
        $m = date('m',$date);
        $y = date('Y',$date);
     
        $jour = date('w',$date);
     
        $tab = array();
        $week = date('W',$date)-date('W',strtotime($y.'-'.$m.'-01'));
        $nbDaysMonth = cal_days_in_month(CAL_GREGORIAN, $m, $y);
        for ($i = $j; $i <= $nbDaysMonth;$i++) {
            $tab[$week][$jour] = $i;
            $jour++;
            if ($jour%7 == 0) {
                $week++;
                $jour=0;
            }
        }
    	mysql_connect('localhost', 'root', '') or die (mysql_error ());
    	mysql_select_db('uia_tarek') or die ("Erreur de connexion à uia_tarek");
    	$req = "SELECT jour FROM jours_feries WHERE jour LIKE '%/$y'";echo $req;
    	$res = mysql_query($req);
    	$feries = mysql_fetch_assoc($res);
    	print_r($feries);
        //print_r ($tab);
    	?>
    	<html>
    	<head>
     
    	</head>
    	<body>
    		<table>
    			<tr>
    				<th>L</th>
    				<th>M</th>
    				<th>M</th>
    				<th>J</th>
    				<th>V</th>
    				<th>S</th>
    				<th>D</th>
    			</tr>
    			<?php
    				for ($a = 0; $a <= 5; $a++) {
                    echo '<tr>';
                    for ($b = 0; $b <= 6; $b++) {
                        echo '<td>';
                        if (isset($tab[$a][$b]) AND !in_array($tab[$a][$b],$feries)) echo $tab[$a][$b];
                        echo '</td>';
                    }
                    echo '</tr>';
                }?>
    		</table>
    	</body>
    </html>
    Paux-tu aussi regarder si quelque chose cloche dans ma requête pour les jours feries car je ne récupère que le 01/01/2011 alors que j'ai plusieurs date qui finissent par /2011.

  7. #7
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    En fait, j'avais pas fait gaffe mais tout est décalé d'un jour parce que quand on fait date('w'), le 0 signifie dimanche (et non lundi).

    Rien de bien grave mais il faut adapter le code en conséquence :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $jour = date('N',$date);
    $tab = array();
    $week = date('W',$date)-date('W',strtotime($y.'-'.$m.'-01'));
    $nbDaysMonth = cal_days_in_month(CAL_GREGORIAN, $m, $y);
    for ($i = $j; $i <= $nbDaysMonth;$i++) {
        $tab[$week][$jour-1] = $i;
        $jour++;
        if ($jour%7 == 1) {
            $week++;
            $jour=1;
         }
    }
    Pour ta requête des jours fériés, utilise des vrais fonctions de date proposés par mysql (http://dev.mysql.com/doc/refman/5.0/...functions.html) ou lieu de bidouiller avec le LIKE.

    Au passage, je te poste une fonction que j'ai déjà utilisé pour récupérer les jours fériés (français j'entends bien sur) par rapport à un mois et une année :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    <?php
     
    function listJourFeries($year, $month) {
     
        $res = array();
     
        switch ($month) {
            case 1:
                $res[] = 1;
                break;
            case 5:
                $res[] = 1;
                $res[] = 8;
            case 7:
                $res[] = 14;
                break;
            case 8:
                $res[] = 15;
                break;
            case 11:
                $res[] = 1;
                $res[] = 11;
                break;
            case 12:
                $res[] = 25;
                break;
        }
     
     
        // Déclaration de la fonction easter_date() si php ne la connaît pas
        if (!function_exists('easter_date')) {
            function easter_date($year) {
                /*
                  G is the Golden Number-1
                  H is 23-Epact (modulo 30)
                  I is the number of days from 21 March to the Paschal full moon
                  J is the weekday for the Paschal full moon (0=Sunday,
                  1=Monday, etc.)
                  L is the number of days from 21 March to the Sunday on or before
                  the Paschal full moon (a number between -6 and 28)
                 */
                $G = $year % 19;
                $C = (int) ($year / 100);
                $H = (int) ($C - (int) ($C / 4) - (int) ((8 * $C + 13) / 25) + 19 * $G +
                        15) % 30;
                $I = (int) $H - (int) ($H / 28) * (1 - (int) ($H / 28) * (int) (29 /
                        ($H +
                        1)) * ((int) (21 - $G) / 11));
                $J = ($year + (int) ($year / 4) + $I + 2 - $C + (int) ($C / 4)) % 7;
                $L = $I - $J;
                $m = 3 + (int) (($L + 40) / 44);
                $d = $L + 28 - 31 * ((int) ($m / 4));
                $y = $year;
                $E = mktime(0, 0, 0, $m, $d, $y);
                return $E;
            }
     
        }
     
        //Calcul pour les dates variables
        $secJours = 60 * 60 * 24;
     
        $paques = easter_date($year) + 1 * $secJours;
        if (date('m', $paques) == $month) {
            $res[] = date('d', $paques);
        }
     
        $ascencion = easter_date($year) + 39 * $secJours;
        if (date('m', $ascencion) == $month) {
            $res[] = date('d', $ascencion);
        }
     
        $pentecote = easter_date($year) + 50 * $secJours;
        if (date('m', $pentecote) == $month) {
            $res[] = date('d', $pentecote);
        }
     
        // Retour du tableau des jours fériés pour l'année et le mois demandé
        return $res;
    }
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

  8. #8
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 181
    Points : 47
    Points
    47
    Par défaut
    Effectivement l'ordre des jours étant anglais ça change tout ^^.
    Pour récupérer les jours fériés, je suis obligé de les récupérer dans une requête sql car l'administrateur peut ajouter des jours non travaillé.
    Je ne vois pas ou je me trompe dans cette requête.
    De plus, avec le code que tu m'as donné, si $feries est vide, donc égal à false, la condition in_array fait une erreur puisqu'on lui passe un boolean en paramètre.

  9. #9
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    J'espère que ta colonne 'jour' est bien de type date dans ta base de données. Dans ce cas là c'est facile, regarde du côté des fonctions que je t'ai posté, en particulier les fonctions "MONTH()" et "YEAR()".

    Sinon, il va te falloir tester l'année, et le mois également...

    De plus, c'est normal que les fériés soit false s'il n'y a pas de résultat car c'est ce que retourne "mysql_fetch_assoc" dans ce cas là.
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

  10. #10
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 181
    Points : 47
    Points
    47
    Par défaut
    Malheureusement, les jours sont inscrits sous forme de varchar(15) au format jj/mm/aaaa.
    Normalement ma requête récupère tous les jours finissant par /2011 sauf que je n'ai que le 01/01/2011.

    Je comprends bien que mysql_fetch_assoc renvoie false si la requête retourne un résultat vide mais comment éviter que la condition fasse une erreur dans ce cas là ?

  11. #11
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 181
    Points : 47
    Points
    47
    Par défaut
    J'ai modifié un pti peu le code et il fonctionne parfaitement bien.

    Dernier souci pour moi, l'affichage de ce tableau avec symfony

Discussions similaires

  1. Passage de date en paramètre avec JSF
    Par opium1er dans le forum JSF
    Réponses: 8
    Dernier message: 14/08/2013, 12h12
  2. [Prototype] Tutoriel : "Développer un calendrier dynamique avec AJAX et PHP"
    Par brutos dans le forum Bibliothèques & Frameworks
    Réponses: 2
    Dernier message: 08/06/2013, 16h35
  3. Réponses: 3
    Dernier message: 31/08/2012, 10h48
  4. Calendrier Dynamique avec JSON
    Par milkchocolat92 dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 19/08/2008, 13h37
  5. Calendrier Dynamique avec input txt
    Par HWICE dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 31/01/2008, 21h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo