[php] - calendrier de présences de la semaine - Manager de raids pour wow :)

Yop tout le monde. Les habitués du forum ont déjà participé à plusieurs sujets à propos de mon cher WoW Orga Evolution, voici une nouvelle question :wink:

Pour mémoire, il s’agit d’un gestionnaire de “sorties” (raids) pour le mmorpg World of Warcraft. Ca consiste à créer des sorties et à chaque joueur d’annoncer sa disponibilité pour cette dernière : Présente, Incertain ou Absent.

Dans ma base de données j’ai une table des “dispos” :
id_raid (le raid concerné)
id_joueur (le joueur qui donne sa dispo)
id_dispo (la dispo en question).

Avec ces trois éléments, je peux lister dans la page de gestion d’un raid les dispos de tout le monde :slight_smile:

Maintenant je voudrais faire un truc plus facile à lire quand on gère les raids sur une semaine…

afficher la liste complète des joueurs, avec en colonnes :

Pseudo - Classe - Raid de Lundi - Raid de Mardi - Raid de Mercredi - Raid de Mecredi N°2 - Raid de jeudi…

Et donc pour chaque raid en colonne, j’affiche : dispo / incertain / absent ou éventuellement “pas de réponse” si il n’a rien dit…

La question donc : comment faire ca ? Doit falloir faire des array de ouf non ? Mon autre difficulté est clairement de gérer la reconnaissance du lundi… Ok je pourrais tricher et afficher les 10 prochains raids par exemple (on devrait pas en faire plus que ca dans une semaine) mais c’est pas gégé :confused:

Merci par avance pour votre aide, car là je rame gravos :frowning:

Je te conseillerais de faire un tableau $raidParJour (de 0 à 6) où tu stockes le(s) raid(s) du jour de la semaine concerné. (Pour le 0= lundi ou dimanche c’est toi qui voit ce qui t’arrange).
Ensuite il faut trouver le premier jour de la semaine en cours. Donc regarde la doc de getdate. En gros tu fais getdate() et tu récupères le “wday” du jour actuel, une petite soustraction te donne la date du premier jour de la semaine, et là avec un petit for tu remplis $raidParJour avec les ids des raids et donc récupérer la disponibilté des joueurs
Ensuite il reste plus qu’à afficher tout ça.

Heu vouais…

Alors voyons…

Sur le principe choper les raids de la semaine c’est ok. Je chope le premier jour, je chope tous les raids sur la période data_raid comprise entre cette date et la dernière de la semaine… en gros je fais un SELECT^/ between quoi :slight_smile:

Je compte le nombre de raids également… important ca :slight_smile:

Jusque là dans l’idée pas de soucis.

ca me donnerait :

<td>nom du joueur</td><td>Classe du joueur</td>for (nombre de raids) {<td>$dispo[joueur$x][raid^$i]]</td>}
Un truc dans ce genre ?

Le blem c’est que j’ai un mal de chien à manipuler les array, leur logique me reste très obscure…

Dans le principe je dois faire correspondre dans mon tableau une id joueur, une id raid, et à partir de ca choper la dispo :slight_smile:

PS : je posterais bien un screen de ce que je cherche, mais j’ai pas ma clef usb :confused: nerf !

Ouais le coup du $dispo[id_joueur][id_raid] c’est pas mal. Si tu arrive à le remplir à partir de tes données c’est bon. Je sais pas ce qui te gène avec les tableaux mais à partir de ce tableau tu peux utiliser par exemple:
foreach ($dispo as $dispoJoueur) pour récupérer le tableau des raids du joueur et ensuite encore un foreach pour récupérer sa disposition pour les différents raids.

Après je sais pas si $dispo ne concerne qu’un jour de la semaine ou alors toute la semaine, dans le second cas faudra séparer si tu veux une colonne par jour. Ou alors rajouter une dimension à dispo du genre $dispo[‘id_jour’][‘jour’][‘id_raid’]

Premièrement : merci de ton assistance ! Là je gallère grave :frowning: :confused:

En fait peut importe les jours… le truc c’était d’arriver à choper les “limites” virtuelles de ma semaine pour ne sélectionner que les raids dont les dates sont comprises dans cette période

Voici un “diagramme” des mes deux tables importantes pour cette affaire, ainsi qu’un dessin du résultat que je voudrais avoir.

http://img299.imageshack.us/img299/6446/woedisposchartob5.th.gif

Table de gauche : la table des raids : id du raid, une liaison avec une autre table pour savoir de quel type de donjon il s’agit (peu importe ici) et la date de début du raid.

La seconde : la dispo des joueurs :wink:

id_dispo pour les identifier de manière unique, id_raid pour faire la liaison avec la table précédente, id_joueur pour lier au pseudo (peu importe ici) et type_dispo pour savoir quelle est la nature de la disponibilité (présente, incertain, absent).

En gros si t’es Présent au raid N°1 et que t’es le joueur N°5 de la base, ca donne : id_dispos = autoincrement, id_raid = 1, id_joueur = 5, type_dispo = Présent.

Donc je voudrais les dispos de tous les joueurs, pour tous les raids de la période concernée. Je pense qu’il faut faire les calculs pour fixer les limites de ma période à partir de ce que tu m’as dit, ensuite :

SELECT id_raid, date_raid FROM ‘raids’ where ‘date_raid’ between X and Y;

Et après je fais une sélection des dispos qui contiennent une idée de RAID qui correspond aux précédentes réponses :
SELECT id_joueur, type_dispo, id_raid FROM dispos WHERE id_raid IN (ma liste d’avant);

Ensuite, comment je formate les tableaux ? c’est ca que j’arrive pas à “conceptualiser” en fait :confused:

ROTFL : j’aime bien faire compliqué quand c’est simple :

$RecapDispo[$dataDispo[‘id_raid’]][$dataDispo[‘id_joueur’]] = $dataDispo[‘type_dispo’];

haha ^^ bon ben ya plus qu’à :slight_smile: Enfin t’inquiète, je vais revenir pour un autre problème dans 5 minutes je sens :stuck_out_tongue:

ce genre de structure, c’est tjrs super clair quand tu la code … par contre pour l’expliquer :ane:

Edit: pour trouver le premier lundi, soit tu fait une boucle à partir de la date actuel, et tu analyses le résultat de strftime(’%w’, $timestamp) … 0 > dimanche, 1 > lundi, etc …
(tu peux aussi essayer avec strftime(’%u’, $timestamp), mais dans ce cas 1> lundi … 7> dimanche)

Ha vouais kiss :stuck_out_tongue:

Là je fais joujou avec les fonctions dates :stuck_out_tongue:

Admettons aujourd’hui jour 2 :
$currentday = getdate();
echo $currentday[‘wday’]; // vaut 2 pour mardi

Mes dates de raids sont sauvées sous la forme time();

Comment je fais pour déterminer le timestamp de lundi dernier dans ces conditions ?

euh … procédons par étape :
1/ t’as le numéro du jour dans la semaine
2/ tu calcul l’écart avec lundi (la différence entre ton numéro et 1)

puis (théorie)
3/ tu multiplies cette différence par le nombre de secondes d’une journée
4/ tu as le timestamp différentiel :o

ou (pratique)
3/ tu fais un strtotime("-différence_calcule_en_2 day"); :ane:

easy, isn’t it ? :o

y’a plus qu’à attendre que S/N vienne tout foutre par terre :paf:

haha trouvé :slight_smile: je sais pas si c’est propre, mais bon :slight_smile:
$CurrentDay = getdate();
$day = date(d) - ($CurrentDay[‘wday’] - 1);
echo mktime (0,0,0,date(m),$day,date(Y));

Ca nous donne donc le timestamp du "début de semaine".

Correct ? Pas trop caca ?

Reste à faire pareil pour la fin de semaine :slight_smile: et SELECT between les deux :smiley:

je préfère le strtotime :o

… qui peut se traduire directement dans la requète SQL avec des DATE_SUB et DATE_ADD :sarcastic:

je vais tester alors :slight_smile: Pendant ce temps j’ai trouvé mon timestamp de fin de semaine :

$enddate = mktime (0,0,0,date(m),$day+6,date(Y));

tadaaaa :smiley: :ane:

Encore plus simple en fait :

strtotime("last monday") :smiley:
strtotime("next sunday")

!!

ah oué, spacon [:paysan] :ane:

Bourrins ! :o

putain je quote celle là !!

Aujourd’hui est un grand jour mes frères !!!! :ane: :MDR

[:eveden]

te fache pas ^^ Tiens pour la peine je pose une question noobesque :smiley:

EDIT : en fait non, j’ai rajouté un JOIN dans ma seconde requête pour sélectionner que les raids between ‘’ and ‘’ :slight_smile: oubliez ma question :ane:

Je stocke mes id de raid quand je fais un select, dans un array…

Comment je fais pour faire un "SELECT * FROM table WHERE id_raid IN ($array)" ?

Ca marche en faisant ca cochon :

$array = 9,10,11

Mais si je fais un vrai array, et pas juste une string, ca chie dans la colle :frowning:

Une idée ?

1/explode(), vers la lumière, te mêneras, jeune padawan :jap:

:ane:

Plutôt implode je dirais… parce que explode c’est pour casser un tableau selon un motif…