Bonjour,

Suite à l'étude d'un super tuto sur ce site, je suis en train de personnaliser le code pour obtenir ce dont j'ai besoin.
J'ai donc :

<table>
                <tr>
                    <?php foreach ($semaines as $W->$w);?>
                        <td><?php echo $W;?></td>
                    <?php endforeach; ?>
                    </tr>
                </tbody>
            </table>

$W correspond à une fonction qui me retourne les numéros de semaines.
Avec ce code, j'obtiens bien les numéros de semaine de l'année, mais ils ont dans une colonne. Or, j'aimerai 8 colonnes et 7 lignes.
Avez vous une idée??

Merci d'avance

30 réponses


Xtr3me
Réponse acceptée

Je comprends pas ta démarche en faisant un array_chunk tu sépares le tableau en plusieurs tableaux de 8 index...
Normal aussi que tu n'es rien puisque tu vas récupérais la valeur de chaque élément du tableau avec $row dont S01 etc... donc dans $data il n'y a rien puisqu'au delà de de S01 etc tu n'as rien.

Essayes de comprendre comment fonctionne la méthode foreach avant de te lancer je ne sais où ;) .

Je ne vois aucun endroit où $m est définis dans ton code dans la fonction getAll, quelle est le but de ta démarche qu'on puisse y voir plus clair car là ça devient fouillis de chez fouillis ^^ .

En attendant tu peux faire ça comme le propose 2b3ez:
Il manquait une accolade et c'est la valeur que tu veux récupérer pas la clé.

$semaines = array('S01', 'S02', 'S03', 'S04', 'S05', 'S06', 'S07', 'S08', 'S09', 'S10', 'S11', 'S12', 'S13', 'S14', 'S15', 'S16', 'S17', 'S18', 'S19', 'S20', 'S21', 'S22', 'S23', 'S24', 'S25', 'S26', 'S27', 'S28', 'S29', 'S30', 'S31', 'S32', 'S33', 'S34', 'S35', 'S36', 'S37', 'S38', 'S39', 'S40', 'S41', 'S42', 'S43', 'S44','S45','S46','S47','S48','S49','S50','S51','S52','S01');
    echo '<table>';
$i=1;
echo '<tr>';
    foreach($semaines as $week){
        echo '<td>'.$week.'</td>';
        if($i%8==0){echo '</tr><tr>';}
        $i++;
    }
    echo'</tr>';
 echo '</table>';

Ou tu peux faire ça:

<?php 
$semaines = array('S01', 'S02', 'S03', 'S04', 'S05', 'S06', 'S07', 'S08', 'S09', 'S10', 'S11', 'S12', 'S13', 'S14', 'S15', 'S16', 'S17', 'S18', 'S19', 'S20', 'S21', 'S22', 'S23', 'S24', 'S25', 'S26', 'S27', 'S28', 'S29', 'S30', 'S31', 'S32', 'S33', 'S34', 'S35', 'S36', 'S37', 'S38', 'S39', 'S40', 'S41', 'S42', 'S43', 'S44','S45','S46','S47','S48','S49','S50','S51','S52','S01');
    echo '<table>';
    $semaines = array_chunk($semaines, 8);
    for($s = 0; $s <= 6; $s++){
        echo '<tr>';
        foreach($semaines$s] as $week){
            echo '<td>'.$week.'</td>';
        }
        echo'</tr>';
    } 
 echo '</table>';
 ?>

J'ai bien fait de te demander comment était ton tableau je pensais qu'il était déjà découpé ;) .

Xtr3me
Réponse acceptée

Dans ce cas-là tu récupères l'index du tableau donc tu récupères bien 0 pour S01, 1 pour S02 et ainsi de suite.
Etant donné que tu récupères le tout sous la forme S01,S02 et que tu veux seulement le 01 tu peux faire un str_replace.

echo str_replace("S","",$week);

Il me semble que c'est dans cette ordre là les paramètres en gros au lieu de faire un echo de $week tu fais vas faire l'echo juste au dessus en prenant soin de supprimer le => $w dans le foreach ;) .

Du coup:

<?php $semaines = array('S01', 'S02', 'S03', 'S04', 'S05', 'S06', 'S07', 'S08', 'S09', 'S10', 'S11', 'S12', 'S13', 'S14', 'S15', 'S16', 'S17', 'S18', 'S19', 'S20', 'S21', 'S22', 'S23', 'S24', 'S25', 'S26', 'S27', 'S28', 'S29', 'S30', 'S31', 'S32', 'S33', 'S34', 'S35', 'S36', 'S37', 'S38', 'S39', 'S40', 'S41', 'S42', 'S43', 'S44','S45','S46','S47','S48','S49','S50','S51','S52');
         echo '<table>';
        $i=1;
        echo '<tr>';
    foreach($semaines as $d){
        $week = str_replace("S","",$d); 
        echo '<td><div class="day">'.$week.'</div>
              <div class="daytitle">
                          Semaine&nbsp'.$week.
              '</div>';
        echo '<ul class="events">';
        if(isset($events$time])): foreach($events$time] as $e){
            echo '<li>'.$e.'</li>'; 
        }
        echo '</ul></td>';
        if($i%8==0){echo '</tr><tr>';}
        $i++;
    }
    echo'</tr>';
 echo '</table>';
?>

Rien de bien compliqué ;) .

Bonjour,

<!-- ...] -->
<!--
Pour que ton code fonctionne, utilises « => » au lieu de « -> ».
Ensuite, il ne faut éviter d'utiliser des variables à une seule lettre
dans le but de mieux comprendre le code. L'utilisateur d'une variable avec 
une case (majuscule/minuscule) est à éviter. Quand tu utilises une boucle
de type foreach, c'est que tu as forcément un tableau. Si tu n'as pas besoin
de la variable $key, tu peux écrire ceci : 
    foreach ($variables as $variable)
-->
<?php foreach ($variables as $key => $variable): ?>
    <td><?php echo $key; ?></td> <!-- Affichera la clé ($key) -->
    <td><?php echo $variable; ?></td> <!-- Affichera la valeur relié à la clé -->
<?php endforeach; ?>
<!-- ...] -->

Si je comprend bien, tu devrais stocker tes 7 lignes dans $semaines puis ensuite faire quelque chose du genre :

<table>
    <?php foreach ($semaines as $key => $semaine): ?>
        <tr>
            <td><?php echo $semaine'colonne1']; ?></td>
            <td><?php echo $semaine'colonne2']; ?></td>
            <td><?php echo $semaine'colonne3']; ?></td>
            <td><?php echo $semaine'colonne4']; ?></td>
            <td><?php echo $semaine'colonne5']; ?></td>
            <td><?php echo $semaine'colonne6']; ?></td>
            <td><?php echo $semaine'colonne7']; ?></td>
            <td><?php echo $semaine'colonne8']; ?></td>
        </tr>
    <?php endforeach; ?>
</table>

Bonne chance,
Ramz.

Ton code ne répond pas au besoin Ramz1994... Tu vas pour chaque clé du tableau $semaines afficher une colonne et 8 cellule.
Faudrait-il déjà voir comment est conçu le tableau $semaines. Si c'est un tableau non associatif je verrai plutôt un for en utilisation.
Pourquoi 8 colonnes ?
Peux-tu nous donner le contenu de $semaines afin d'y voir plus clair ?

Tu peux essayer ça:

<?php 
for ($i = 0; $i <= 8; $i++) { 
   echo '<tr>';
    foreach($semaines as $week => $w){
        echo '<td>'.$week.'</td>';
    }
   echo '</tr>';
} 
?>

Avec ça tu auras 8 colonnes ayant 7 cellules contenant chaque clés du tableaux $semaines.

cela devrait marché

<?php 
$i=1;
   echo '<tr>';
    foreach($semaines as $week => $w){
        echo '<td>'.$week.'</td>';
        if($i%8==0){echo '</tr><tr>';
        $i++;
    }
   echo '</tr>';
} 
?>

Il te suffit de jouer avec le modulo et le $i

+++

creabip6
Auteur

Merci pour vos réponse, mais rien ne fonctionne... Je vous donne le détail de mes fonctions: [code]$week = $date->format('W'); $w = $date->format('w'); $r[$y][$week] = $w;/code] Mon tableau $semaines est conçu comme ça: [code]var $semaines = array('S01', 'S02', 'S03', 'S04', 'S05', 'S06', 'S07', 'S08', 'S09', 'S10', 'S11', 'S12', 'S13', 'S14', 'S15', 'S16', 'S17', 'S18', 'S19', 'S20', 'S21', 'S22', 'S23', 'S24', 'S25', 'S26', 'S27', 'S28', 'S29', 'S30', 'S31', 'S32', 'S33', 'S34', 'S35', 'S36', 'S37', 'S38', 'S39', 'S40', 'S41', 'S42', 'S43', 'S44','S45','S46','S47','S48','S49','S50','S51','S52','S01');[/code] Merci d'avance pour votre coup de pouce

creabip6
Auteur

Pour que vous puissiez tout comprendre, je vous mets tout mon code, cela pourra peut-être en aider d'autres aussi!

Mon fichier index.php:

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <title>Calendrier</title>
        <link rel="stylesheet" type="text/css" href="style.css" />
        <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js"></script>
        <script type="text/javascript">

        </script>
    </head>
    <body>
        <?php
        require('date.php');
        $date = new Date();
        $year = date('Y');
        $dates = $date->getAll($year);
        ?>

        <div class="periods">
            <div class="year"><?php echo $year; ?></div>
         </div>

        <?php $dates = current($dates); ?>
        <?php foreach ($dates as $week=>$semaines): ?>
        <div class="semaines" id="semaines<?php echo $m; ?>">
            <table>
                    <tr>
                    <?php foreach ($semaines as $week->$w);?>
                        <td><?php echo $week;?></td>
                    <?php endforeach; ?>
                    </tr>
                </tbody>
            </table>
            </div>
        <pre><?php print_r($dates); ?></pre>
    </body>
</html>

Mon fichier date.php:

<?php
class Date{
var $semaines = array('S01', 'S02', 'S03', 'S04', 'S05', 'S06', 'S07', 'S08', 'S09', 'S10', 'S11', 'S12', 'S13', 'S14', 'S15', 'S16', 'S17', 'S18', 'S19', 'S20', 'S21', 'S22', 'S23', 'S24', 'S25', 'S26', 'S27', 'S28', 'S29', 'S30', 'S31', 'S32', 'S33', 'S34', 'S35', 'S36', 'S37', 'S38', 'S39', 'S40', 'S41', 'S42', 'S43', 'S44','S45','S46','S47','S48','S49','S50','S51','S52','S01');

    function getAll($year){
        $r = array();

        $date = new DateTime($year.'-01-01');
        while($date->format('Y') <= $year){
            // Ce que je veux => $r[ANEEE][semaine] = numéro DE LA SEMAINE
            $y = $date->format('Y');
            $week = $date->format('W');
            $w = $date->format('w');
            $r$y]$m] = $w;
            $date->add(new DateInterval('P1W'));
        }
        return $r; 
    }
}

mon fichier styles.css:

body{ background:#EEEEEE; letter-spacing:1px; font-family:Helvetica; padding:10px;}
.year{ color:#D90000; font-size:85px;}
.relative{ position:relative;}
.semaines{}
.semaines{ margin-top:12px;}
.semaines ul{ list-style:none; margin:0px; padding:0px;}
.semaines ul li a{ float:left; margin:-1px; padding:0px 15px 0px 0px; color:#888888; text-decoration:none; font-size:35px; font-weight:bold; text-transform:uppercase;}
.semaines ul li{ display:inline-table;}
.semaines ul li a:hover, .semaines ul li a.active{ color:#D90000;}
table{ border-collapse:collapse;}
table td{ border:1px solid #A3A3A3; width:80px; height:80px;}
table td.today{ border:2px solid #D90000; width:80px; height:80px;}
table td.padding{ border:none;}
table td:hover{ background:#DFDFDF; cursor:pointer;}
table th{ font-weight:normal; color:#A8A8A8;}
table td .semaines{ color:#8C8C8C; bottom:-40px; right:5px; font-weight:bold; font-size:24.3pt;}
table td .events{ position:relative; width:79px; height:0px; margin:-39px 0px 0px; padding:0px;}
table td .events li{ width:10px; height:10px; float:left; background:#000; /*+border-radius:10px;*/ -moz-border-radius:10px; -webkit-border-radius:10px; -khtml-border-radius:10px; border-radius:10px 10px 10px 10px; margin-left:6px; overflow:hidden; text-indent:-3000px;}
table td:hover .events{ position:absolute; left:582px; top:66px; width:442px; list-style:none; margin:0px; padding:11px 0px 0px;}
table td:hover .events li{ height:40px; line-height:40px; font-weight:bold; border-bottom:1px solid #D6D6D6; padding-left:41px; text-indent:0; background:none; width:500px;}
table td:hover .events li:first-child{ border-top:1px solid #D6D6D6;}
table td .daytitle{ display:none;}
table td:hover .daytitle{ position:absolute; left:582px; top:21px; width:442px; list-style:none; margin:0px 0px 0px 16px; padding:0px; color:#D90000; font-size:41px; display:block; font-weight:bold;}
.clear{ clear:both;}
creabip6
Auteur

J'ai trouvé cette solution en cherchant:

<table>
<?php foreach (array_chunk($semaines, 8) as $row) { ?>
    <tr>
    <?php foreach ($row as $date) { ?>
        <td><?php echo htmlentities($week); ?></td>
    <?php } ?>
    </tr>
<?php } ?>
</table>

Mon tableau est structuré comme je le voudrais, mais le seul problème est qu'il ne me retourne aucune valeur... toutes les cases sont vides...
Je suis sûre que c'est tout bête, mais je ne trouve pas...

creabip6
Auteur

Super, merci beaucoup Xtr3me !!!
J'ai pris la première solution, et c'est nickel!

De rien les deux fonctionnes aussi bien l'une que l'autre je les ai essayés en local parce que ton tableau n'était pas construit de la même manière que pensé au début ^^ . Je pensais dans ton tableau semaines tu avais en faites les 7 jours de la semaine d'où ma proposition plus haut qui affichais 8 colonnes avec les 7 valeurs dans chaque colonne ^^ .

creabip6
Auteur

en fait, j'affiche tous les numéros de semaine de l'année, et pour que ça ne me fasse pas 52 ligne ou 52 colonnes, je voulais les agencer dans un tableau! Voilà qui est fait :)

Oui j'ai compris en voyant ton tableau que tu voulais compter chaque semaine de l'année ^^ . Mais tu recommences à S01 à la toute fin c'est voulu ?

creabip6
Auteur

non non, je l'ai enlevé.
Mais je me rends compte que j'ai encore un souci avec le style. Avant que le tableau soit mis en forme, j'avais mis des div, comme dans le tuto de départ, avec des styles, pour récupérer les données des événements de la base de données, au survol de la souris.
Là, je n'arrives plus à les remettre, bon, j'ai quelques soucis de syntaxe avec les balises html dans le php...

Avant, c'était ça:

<table>
                <tr>
                    <?php foreach ($semaines as $week->$w);?>
                        <td><div class="day"><?php echo $week; ?></div>
                                </div>
                               <div class="daytitle">
                                   <?php echo ('Semaine '); ?><?php echo $week; ?>
                               </div>
                               <ul class="events">
                                   <?php if(isset($events$time])): foreach($events$time] as $e): ?>
                                        <li><?php echo $e; ?></li>
                                   <?php endforeach; endif; ?>
                               </ul>
                       </td>
                    <?php endforeach; ?>
                    </tr>
                </tbody>
            </table>

et maintenant, je ne sais plus où les placer dans ce code :

<?php $semaines = array('S01', 'S02', 'S03', 'S04', 'S05', 'S06', 'S07', 'S08', 'S09', 'S10', 'S11', 'S12', 'S13', 'S14', 'S15', 'S16', 'S17', 'S18', 'S19', 'S20', 'S21', 'S22', 'S23', 'S24', 'S25', 'S26', 'S27', 'S28', 'S29', 'S30', 'S31', 'S32', 'S33', 'S34', 'S35', 'S36', 'S37', 'S38', 'S39', 'S40', 'S41', 'S42', 'S43', 'S44','S45','S46','S47','S48','S49','S50','S51','S52');
         echo '<table>';
        $i=1;
        echo '<tr>';
    foreach($semaines as $d){
        echo '<td class="day">'.$d.'</td>';
        if($i%8==0){echo '</tr><tr>';}
        $i++;
    }
    echo'</tr>';
 echo '</table>';
                ?>

Ton code d'avant fonctionne ?
A mon humble avis non en fait il faut que tu comprennes comment sont formés les tableaux je te montre.
Un extrait de ton tableau semaines:
array(
[0] => S01
[1] => S02
[2] => S03
[3] => S04
)
Donc ton tableau est formé ainsi les chiffres 0,1,2,3 sont les clés du tableaux parfois appelées index/offset, S01,S02,S03,S04 sont les valeurs correspondantes aux clés.

En faisant un foreach tu vas décomposer ton tableau et faire une récursivité pour chaque index.
En mettant un

foreach ($semaines as $week => $w){
}

Tu décomposes ton tableau en deux variables, une variable $week correspondant à la clé en cours (récursivité attention) et une variable $w contenant la valeur de la clé donc S01 la 1ère, S02 la seconde fois et ainsi de suite tandis que $week symbolise la clé donc 0,1,2,3.
Si tu fais un foreach et tu décomposes le tableau en une seule variable tu récupèreras à chaque fois la valeur seule donc S01,S02 et ainsi de suite.

Voilà déjà c'était un cours sur la méthode foreach qui est utile dans de nombreux cas ^^ , foreach voulant bien sûr dire "pour chaque".

Donc tu devrais avoir quelque chose du genre:

<?php $semaines = array('S01', 'S02', 'S03', 'S04', 'S05', 'S06', 'S07', 'S08', 'S09', 'S10', 'S11', 'S12', 'S13', 'S14', 'S15', 'S16', 'S17', 'S18', 'S19', 'S20', 'S21', 'S22', 'S23', 'S24', 'S25', 'S26', 'S27', 'S28', 'S29', 'S30', 'S31', 'S32', 'S33', 'S34', 'S35', 'S36', 'S37', 'S38', 'S39', 'S40', 'S41', 'S42', 'S43', 'S44','S45','S46','S47','S48','S49','S50','S51','S52');
         echo '<table>';
        $i=1;
        echo '<tr>';
    foreach($semaines as $d){
        echo '<td><div class="day">'.$d.'</div></td>';
        if($i%8==0){echo '</tr><tr>';}
        $i++;
    }
    echo'</tr>';
 echo '</table>';
                ?>

Enfin que veux tu afficher concrètement ? Là je vois que tu veux afficher la semaine mais tu appelles tes classes day etc...

creabip6
Auteur

En fait, j'ai repris ce tuto qui est super : http://www.grafikart.fr/tutoriels/php/calendrier-php-157
et je le relooke à ma sauce, sauf que c'est pas aussi simple que ce que je pensais!!

Je ne veux pas les dates des jours précis avec les mois, etc..., mais je voudrais afficher les numéros de semaines avec le même style que les jours, et garder l'interactions avec les différents événements. Sauf que tout doit se baser sur les numéros de semaine (événements, etc...), et là aussi, je galère un peu avec la base de données, pour faire une conversion de la date en numéro de semaine.

Mon code d'avant fonctionne, oui (survol, styles, etc...), mais sa présentation n'était juste "pas comme il faut", étant donné que j'avais tout sur une colonne.

Je peux t'envoyer mon dossier si tu veux, pour que tu comprennes mieux. En tout cas, merci beaucoup de ton aide.

Ok donc tu ne veux plus une présentation en jour mais en semaine si j'ai compris ta demande.
Mais quelle information veux-tu afficher dans chaque div exactement ?

creabip6
Auteur

Oui, je souhaite avoir un affichage en semaines à la place des jours.
Au hover des semaines, j'aimerai, (sur le même principe que ce qui s'affiche quand on va sur les jours), qu'il s'affiche le titre "semaine 01", puis en dessous, une liste des événements qui auraient été entrés, avec leur date de mise à jour.

J'ai créé ma table "event", avec les champs id,date,title, et datemaj. Dans la liste de ce qui s'affichera au survol des cases, je souhaite donc récupérer de la base de donnée, le champ "date"(qui doit être converti en numéro de semaine pour que ça puisse être lié aux semaines de mon tableau),mais qui n'a pas besoin de s'afficher. Pour l'affichage des infos de la semaine survolée, je voudrais récupérer ce qu'il y aura dans title, sachant qu'il n'y aura que 4 possibilités d'événements (qui seront entrés par formulaire dans le back office). Je voudrais qu'à côté de chaque élément importé de title, figure la date de mise à jour de l'info.

Puis après, si c'est possible, je voudrais que chacun des 4 types d'informations d'événement (title) corresponde à une couleur qui puisse colorier la case de la semaine en question. La couleur correspondra toujours à celle de la dernière mise à jour d'info.

creabip6
Auteur
<?php foreach ($semaines as $week->$w);?>
                        <td><div class="day"><?php echo $week; ?></div>
                                </div>
                               <div class="daytitle">
                                   <?php echo ('Semaine '); ?><?php echo $week; ?>
                               </div>
                               <ul class="events">
                                   <?php if(isset($events$time])): foreach($events$time] as $e): ?>
                                        <li><?php echo $e; ?></li>
                                   <?php endforeach; endif; ?>
                               </ul>
                       </td>
                    <?php endforeach; ?>

En fait, la première div (class="day") contient le numéro de la semaine qui s'affiche dans la case du tableau (affiche 01) par exemple.
La deuxième div (class="daytitle"), correspond au titre qui s'affiche au survol de la case d'une semaine donnée (exemple : Semaine 01).
La liste qui est juste en dessous de ce titre contient la liste des événements, repris de la base de donnée.

Est-ce que ça te paraît compréhensible?
J'étais encore dessus toute la matinée, mais je n'arrives pas à inclure tout ça dans le code que tu m'as donné :(

creabip6
Auteur

Super, c'est presque bon! :)
Maintenant que je fais mon hover sur les semaines, j'obtiens mon titre de la semaine sur laquelle je suis. Merci beaucoup pour le coup de pouce!
J'ai un souci maintenant avec tout ce code :

if(isset($events$time])): foreach($events$time] as $e){
            echo '<li>'.$e.'</li>'; 
        }

Je pense que c'est à cause de la variable $time. Je ne sais carrément pas comment la définir. D'après ce que j'ai compris, c'est une variable qui permet de récupérer le format de date lié aux événements entrés dans la base de données. A l'origine donc, elle est codée comme ça :

<?php $time = strtotime("$year-$m-$d"); ?>

Mais moi il n'y a que le numéro de semaine qui m'intéresse, du coup, je ne sais pas comment adapter ça. J'ai essayé

<?php $time = strtotime("$d"); ?>

étant donné que

$d = $date->format('W');

, mais quand je regarde ce que ça donne, j'ai une jolie page blanche!

J'ai fait mon formulaire pour mon back office, pour écrire dans la base de donnée. Là aucun souci, je maîtrise. Mais je me demande en quel format je dois mettre mes numéros de semaine pour que tout soit synchro... j'ai trouvé une requête SQL qui marche pour convertir la date (qui est de type DATE dans ma base de données, format aaaa-mm-jj), et ça fonctionne en mettant la requête directement au niveau de phpmyadmin. Mais l'idéal, ce serait que j'écrive en numéro de semaine directement, et que mysql le reconnaisse comme tel. Mais comment est-ce qu'il faut paramétrer ça? Varchar? ou un type de date?

J'ai regardé tu essayes de récupérer la date sous forme de timestamp si tu la veux sous forme du numéro de la semaine n'utilises pas

$time = strtotime("$d);

Fait un echo de $d et tu verras que tu récupères la semaine ;) .

P.S: Pense à valider les réponses qui t'ont été utiles.

creabip6
Auteur

J'ai enlevé tous les timestamp.

Voici mes deux principaux fichiers liés (il manque juste le style.css et le fichier de config à la base de données)

mon index.php:

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <title>Calendrier</title>
        <link rel="stylesheet" type="text/css" href="style.css" />
        <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js"></script>
        <script type="text/javascript">

        </script>
    </head>
    <body>
        <?php
        require('config.php');
        require('date.php');
        $date = new Date();
        $year = date('Y');
        $events = $date->getEvents($year);
        $dates = $date->getAll($year);
        ?>
        <div class="periods">
            <div class="year"><?php echo $year; ?></div>

         <?php $dates = current($dates); ?>

         <?php $semaines = array('S01', 'S02', 'S03', 'S04', 'S05', 'S06', 'S07', 'S08', 'S09', 'S10', 'S11', 'S12', 'S13', 'S14', 'S15', 'S16', 'S17', 'S18', 'S19', 'S20', 'S21', 'S22', 'S23', 'S24', 'S25', 'S26', 'S27', 'S28', 'S29', 'S30', 'S31', 'S32', 'S33', 'S34', 'S35', 'S36', 'S37', 'S38', 'S39', 'S40', 'S41', 'S42', 'S43', 'S44','S45','S46','S47','S48','S49','S50','S51','S52');
            echo '<table>';
                    $i=1;
                        echo '<tr>';
                            foreach($semaines as $d){
                            echo '<td><div class="day">'.$d.'</div>
                            <div class="daytitle">
                            Semaine&nbsp'.$d.
                            '</div>';
                            echo '<ul class="events"><li>Test</li>';
                            echo '</ul></td>';
                            if($i%8==0){echo '</tr><tr>';}
                            $i++;
                            }
                        echo'</tr>';
            echo '</table>';
        ?>    

               </div>

        </div>
        <div class="clear"></div>
        <pre><?php print_r($events); ?></pre>
    </body>
</html>

et mon date.php:

<?php
class Date{
    var $semaines = array('S01', 'S02', 'S03', 'S04', 'S05', 'S06', 'S07', 'S08', 'S09', 'S10', 'S11', 'S12', 'S13', 'S14', 'S15', 'S16', 'S17', 'S18', 'S19', 'S20', 'S21', 'S22', 'S23', 'S24', 'S25', 'S26', 'S27', 'S28', 'S29', 'S30', 'S31', 'S32', 'S33', 'S34', 'S35', 'S36', 'S37', 'S38', 'S39', 'S40', 'S41', 'S42', 'S43', 'S44','S45','S46','S47','S48','S49','S50','S51','S52');
    function getEvents($year){
        global $DB;
        $req = $DB->query('SELECT id,title,datemaj,DATE_FORMAT(date, "%U") AS numSemaine FROM events WHERE YEAR(date)='.$year);

        $r = array();

        while($d = $req->fetch(PDO::FETCH_OBJ)){

             $r$d->numSemaine]$d->id]$d->datemaj]= $d->title;
        }
        return $r;
    }
    function getAll($year){
        $r = array();

        $date = new DateTime($year.'01');
        while($date->format('Y') <= $year){

            $y = $date->format('Y');
            $d = $date->format('W');
            $w = $date->format('W');
            $r$y]$d] = $w;
            $date->add(new DateInterval('P1W'));
        }
        return $r; 
    }
}

Dans mon fichier date.php:

Je suis arrivée à convertir sans problème la date entrée en format "date" (aaaa-mm-jj) dans la base de données.
Par contre, ça ne m'arrange pas, parce que j'aimerai récupérer une date déjà formatée en numéro de semaine de mon formulaire de mise à jour, vers ma base de données.

Dans ma boucle while, j'arrive aussi à récupérer le numéro de semaine généré.

Dans mon fichier index.php:
J'ai inséré un <li>Test</li> à l'endroit où je voudrais récupérer les événements de la base de données, donc ça fonctionne sur le principe.

Par contre, j'ai tourné dans tous les sens le code

if(isset($events$time])): foreach($events$time] as $e){
            echo '<li>'.$e.'</li>'; 
        }

J'ai défini $time = echo $d; mais ça me fait une erreur.
J'ai enlevé $time pour mettre numSemaine, et ça ne fonctionne pas non plus...
Comment dois-je m'y prendre pour faire ce lien?

Je t'ai dit de mettre echo $d; pour que tu vois que tu récupères la semaine pas d'initialiser une variable avec un echo ;) .
Donc $time = $d;
Dans ta bdd au lieu de mettre un champ en date,datetime etc... mets un champ en varchar dans lequel tu vas enregistrer le numéro de la semaine avec une fonction comme date(); ou strftime();.
Admettons que tu veuilles connaître la semaine du 27 juin 2013 il te faut calculer le timestamp puis utiliser strftime pour connaître ce que tu veux je te montre comment je fais moi.

$timestamp = mktime(0,0,0,'06','27','2013');
$week = strftime("%W",$timestamp);

Tu récupères ainsi la semaine correspondant au timestamp définis qui ici correspond au 27 juin 2013.
La fonction mktime prends ses arguments ainsi:

mktime(heure,minutes,secondes,mois,jour,année);
creabip6
Auteur

J'ai pas tout compris, donc il faut que dans mon formulaire de mise à jour, j'écrive dans la base de donnée en récupérant la valeur avec date() ou strftime? Ou est-ce que dans mon formulaire, j'insère simplement en varchar et je définis le mktime dans index.php?

Mais en fait, je ne parle pas du tout des jours et des mois, alors est-ce que je suis obligée de reprendre des fonctions de temps comme timestamp? Parce qu'en fait, j'intègre mon numéro de semaine en varchar dans ma base, j'arrive à le récupérer dans mon fichier date avec la requête :

function getEvents($year){
        global $DB;
        $req = $DB->query('SELECT id,title,datemaj,semaine FROM events');

        $r = array();

        while($d = $req->fetch(PDO::FETCH_OBJ)){

             $r$d->semaine]$d->id]$d->datemaj]= $d->title;
        }
        return $r;
    }

et il faut juste que je traduise ça dans

<?php if(isset($events$time])): foreach($events$time] as $e): ?>
                                        <li><?php echo $e; ?></li>

non?

Tu dois enregistrer dans la base de données le numéro de la semaine donc au lieu d'enregistrer la date comme tu le faisais tu utilises mktime pour calculer le timestamp d'une date ensuite avec strftime() tu retrouves à quelle semaine cela correspond.
Tu peux essayer autrement mais c'est de cette façon que je te recommande de faire.
Parce que là tu te casses la tête à vouloir stocker ça dans un tableau.
En gros tu fais ça:
Tu stockes dans $events$time] = $d->title;
De quel forme est ton $d->semaine ? Admettons que ce soit un nombre sur deux chiffres représentant la semaine.
function getEvents($year){
global $DB;
$req = $DB->query('SELECT id,title,datemaj,semaine FROM events');
$r = array();
while($d = $req->fetch(PDO::FETCH_OBJ)){
$r$d->semaine]= $d->title;
}
return $r;
}
Tu vas donc mettre que $events= getEvents($year); (à part dans les arguments je vois pas de variable $year donc je fais avec ce que tu me passes et n'ayant pas suivi le tutoriel ça devient vraiment casse tête).
Admettons que tu aies récupérais ton tableau dans $events, te reste plus qu'à faire ta boucle pour la semaine concernée.

creabip6
Auteur

OK, je préfère procéder comme tu me le conseilles.
Donc si j'ai bien compris,il faut donc qu'on entre une date dans mon formulaire, et que je récupère ensuite cette date pour la transformer en n° de semaine avec les fonctions que tu m'as données?

donc:

$timestamp = mktime(valeur récupérée du formulaire);
$week = strftime("%W",$timestamp);

C'est ça en gros?

Exact en prenant en compte que mktime prend 6 arguments comme je te l'ai dit plus haut. Ensuite tu insères le numéro de semaine dans ta base de données dans le champ voulu et tu récupères ça quand nécessaire ;) .

creabip6
Auteur

ok super, je vais continuer à plancher là dessus.
Je suis désolée pour toutes ces questions, mais j'apprends et je trouve pas toujours tout logique!
Est-ce que je peux continuer à t'embêter si j'ai encore une question? ;)
Je fais ça pour mon boulot, mais je cherche quelqu'un qui pourrait éventuellement me donner un coup de pouce de temps en temps, parce que je perds beaucoup de temps à chercher!! Est-ce que ça t'intéresserait?
Merci en tout cas pour ta patience.

Bah là j'ai déjà des projets je passe de temps en temps sur le forum pour aider lorsque j'ai le temps.
Je suis déjà en train de galérer avec Imagine qui est pas du tout logique... Gd qui me fout une erreur de mémoire insuffisante lorsque je fais appel directement à la fonction thumbnail mais si je fais d'abord un return de quelque chose aucun soucis... logique quand tu nous tiens.

creabip6
Auteur

Ah ok, bon, c'est pas grave! Mais j'aurais bien voulu te montrer tout ce projet sur lequel je travaille, je ne t'aurai pas pris beaucoup de temps, j'ai besoin d'à peu près 2-3 coups de pouces par an en moyenne. Je suis pas chiante, mais je cherche juste quelqu'un qui pourrait me rassurer ou me guider dans mes formulations en php. Bien entendu, ce serait rémunéré! Ce projet, c'est rien d'énorme, quand on maîtrise le php, c'est facile.

Là, j'ai converti ma date récupérée du formulaire (format "2013-08-08") en numéro de semaine dans un champ qui s'appelle semaine, en varchar à 2 chiffres. C'est bon, ça roule.

Avec tout ça:

function getEvents($year){
        global $DB;
        $req = $DB->query('SELECT id,title,datemaj,semaine FROM events');

        $r = array();

        while($d = $req->fetch(PDO::FETCH_OBJ)){

             $r$d->semaine]$d->datemaj]= $d->title;
        }
        return $r;
    }

Je récupère tout de ma base, car avec le

<pre><?php print_r($events); ?></pre>

je vois que j'obtiens:

Array
(
    [32] => Array
        (
            [2013-08-08 14:34:28] => Test événement

        )
)

Donc ça devrait être bon... j'ai modifié la récup des données de la base en:

if(isset($events$time])) foreach($events$time] = $d->title as $e){
            echo '<li>'.$e.'</li>'; }

j'ai plein d'infos d'erreurs qui arrivent sur chaque case de mes mois, ça doit être en bonne voie, mais qu'est-ce qui cloche encore? Je comprends pas.
Les erreurs me disent "Notice: Undefined variable: time in C:\wamp\www\tests\index.php on line 35". Mais en fait, time, doit renvoyer au numéro de semaine qui correspond à ce qu'il y a dans le champ semaine de la base de données je pense...mais je n'ai pas de variable spécifique à part $d, mais si je mets $time = $d;, il me dit qu'il ne connaît pas d...

$time n'est plus définies j'ai l'impression tu pars un peu en vrille ;) .
Je vais tenter de t'expliquer comment le tout fonctionne n'ayant pas vu le tutoriel et n'ayant pas le temps de le regarder ça sera plus simple ainsi.
Tu enregistres la semaine dans ta bdd avec le

$timestamp = mktime(0,0,0,$month,$day,$year);

tu récupères le timestamp en ayant définis bien entendu les variables $month,$day,$year qui correspondront aux valeurs entrées dans ton formulaire par exemple.
Tu convertis ce timestamp en semaine avec la fonction strftime(); :
Ainsi:

$week = strftime("%W",$timestamp);

Tu enregistres le résultat de $week dans ta bdd où tu veux dans un champ week par exemple et tu gardes ta date au format 2013-05-12 par exemple comme définis dans le tutoriel.
Tu récupères par la suite chaque évènements correspondant à l'année en cours c'est à dire:

$req = $DB->query('SELECT id,title,datemaj,semaine FROM events WHERE YEAR(date)='.$year);

Ensuite tu définis $time:

$time = $week; (ce qu'on avait fait au tout début lorsqu'on parcourait le tableau $semaines)

J'ai mis $ week mais peut être que tu l'as renommé donc remplace par ce que tu as mis et ensuite ta boucle sur $events$time] fonctionnera tu vas chercher si dans $events tu as un évenements correspond à $time qui prend à chaque passage une valeur du tableau $semaines.

Et au lieu de:

$r$d->semaine]$d->datemaj]= $d->title;

Mets ça:

$r$d->semaine]$d->id]= $d->title;