Activiteitenplanning
Ik zou graag een tool ontwikkelen waarmee personen voor een bepaald evenement de nodige activiteiten kunnen aanduiden.
Er moet echter mee rekening gehouden worden dat sommige activiteiten kunnen overlappen.
Hier een simpele tabelstructuur
Met deze tabellen bouw ik deze tabel op: klik hier
De tabel moet ipv kruisjes checkboxes bevatten die de persoon kan aanduiden. jQuery moet dan gebruikt worden om na elke klik na te kijken welke andere activiteit nog kan aangeduid worden. (bijvoorbeeld als activiteit 7 aangeduid wordt, die loopt tijdens de eerste 2 uurblokken, dan mogen andere activiteiten tijdens deze uurblokken NIET worden aangeduid. en worden inactive)
Heeft iemand de tijd om mij mee opweg te helpen met dit project? (PHP en jQuery)
Alvast bedankt!
Jij maakt een ontwerp en implementeert dit, op punten waarop je vast loopt vraag je dan hier hulp en helpen wij je verder totdat je bij de vogende vastloper komt.
Een andere optie is om een vacature te plaatsen.
Het gaat hier immers om het plannen van activiteiten, en niet om de deelname van iemand aan een activiteit (je kunt maar aan één (sessie van een) activiteit tegelijkertijd deelnemen) correct?
Een soortgelijk vraagstuk kwam ergens anders voorbij, waarbij optredens over podia verdeeld moesten worden. Misschien kun je dit gebruiken voor inspiratie? Ik had daar een oplossing voorgesteld met sortable elementen.
De drie kolommen stellen de resource "podia" (je locaties) voor. Begin- en eind-tijden worden herberekend als je de elementen herschikt (EDIT: deze kun je verslepen). De rode kolom is om evenementen te verwijderen, de inputvelden om nieuwe elementen toe te voegen.
Dit was slechts een eenvoudige opzet, waar verder niet meer op gereageerd werd, dus ik heb daar verder ook niets meer aan uitgewerkt :).
Gewijzigd op 19/02/2015 16:21:03 door Thomas van den Heuvel
In de tabel staan de activiteiten links. alle tijdstippen bovenaan.
Deze array haal ik al uit de DB:
Array
(
[10:00 - 12:00] => Array
(
[1] => Activiteit 1
)
[10:00 - 11:00] => Array
(
[2] => Activiteit 2
[3] => Activiteit 3
[4] => Activiteit 4
[5] => Activiteit 5
[6] => Activiteit 6
)
[11:00 - 12:00] => Array
(
[2] => Activiteit 2
[3] => Activiteit 3
[5] => Activiteit 5
[6] => Activiteit 6
)
[12:30 - 13:30] => Array
(
[2] => Activiteit 2
[3] => Activiteit 3
[4] => Activiteit 4
[5] => Activiteit 5
[7] => Activiteit 7
[9] => Activiteit 9
)
[13:30 - 14:30] => Array
(
[2] => Activiteit 2
[3] => Activiteit 3
[5] => Activiteit 5
[6] => Activiteit 6
[7] => Activiteit 7
[8] => Activiteit 8
)
[15:00 - 16:00] => Array
(
[2] => Activiteit 2
[3] => Activiteit 3
[5] => Activiteit 5
[6] => Activiteit 6
[7] => Activiteit 7
[8] => Activiteit 8
[9] => Activiteit 9
)
)
Hoe bouw ik hiermee bijgevoegde tabel? Dat lukt me niet...
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
voor elke activiteit (tabelrij)
voor elke tijdseenheid (tabelkolom)
als activiteit sessie heeft op deze tijdseenheid
druk sessie blokje af
anders
druk leeg blokje af
einde als
einde voor elke tijdseenheid
einde voor elke activiteit
voor elke tijdseenheid (tabelkolom)
als activiteit sessie heeft op deze tijdseenheid
druk sessie blokje af
anders
druk leeg blokje af
einde als
einde voor elke tijdseenheid
einde voor elke activiteit
... maar ik snap niet dat je het in eerste instantie op die manier wilt weergeven als op elk moment maar één of een beperkt aantal activiteiten kan plaatsvinden.
Je zegt dat sommige activiteiten kunnen overlappen, en bepaalde dus ook niet. Wat bepaalt dit?
Ik zie ook dat sommige sessies over meerdere tijdsblokken spannen (activiteit 7 en 8), en de rest niet - heeft dit een speciale betekenis?
een activiteit kan bijvoorbeeld zijn 'zwemmen': tijdens elk tijdsblok start dan een sessie zwemmen. een gebruiker kan echter maar een sessie volgen.
een andere activiteit kan bv zijn 'Fietstocht' maar die duurt langer dan een tijdsblok. als de persoon dan die fietstocht kiest, dan kan hij tijdens die tijdsblokken niet gaan zwemmen, en moet hij zwemmen tijdens een ander tijdsblok kiezen.
Gewijzigd op 19/02/2015 21:05:21 door Liefhebber Laravel
Jan Vleugels op 19/02/2015 21:04:38:
inderdaad, sommige activiteiten spannen inderdaad meerdere tijdsblokken.
Je zal dat moeten kunnen terugvinden in het array anders is zo'n schema niet correct te maken.
Quote:
Het gaat hier immers om het plannen van activiteiten, en niet om de deelname van iemand aan een activiteit (je kunt maar aan één (sessie van een) activiteit tegelijkertijd deelnemen) correct?
Het ging dus toch om het tweede, ook al deed je in je eerste bericht voorkomen dat het om het eerste ging...
(
[10:00 - 12:00] => Array
(
[1] => Activiteit 1
)
[10:00 - 11:00] => Array
(
[2] => Activiteit 2
[3] => Activiteit 3
[4] => Activiteit 4
[5] => Activiteit 5
[6] => Activiteit 6
)
Eerste is van 10 tot 12
tweede van 10 tot 11
deze overlappen dan... of is dit niet genoeg?
@Thomas; inderdaad, het gaat wel degelijk over het tweede, excuus als het verkeerd overkwam...
Je zegt hierboven:
Quote:
Hoe bouw ik hiermee bijgevoegde tabel? Dat lukt me niet...
Mijn directe reactie hierop geeft een opzet hoe je de tabel op moet bouwen (PHP + MySQL database).
Vervolgens heb je je "selectie" probleem. Dit lijkt mij een JavaScript aangelegenheid. Je kunt cellen extra informatie meegeven met het data-... attribuut. Als je op een cel klikt inspecteer je de kolom en maak je alle andere activiteiten die hier in voorkomen inactief.
Dit zijn twee afzonderlijke problemen.
Waar zit je nu vast? En wat heb je geprobeerd?
Als je het omdraait kan je alle activiteiten aan alle tijdsvakken koppelen (met een cross join) en dan met een left join op dezefde tabel kijken of de begin en eindtijd het tijdsvak overlapt:
Code (php)
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
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
SELECT ea.act_naam, t.start_time, t.end_time, s.sessie_tot
FROM
(
SELECT CAST('10:00' AS TIME) start_time, CAST('11:00' AS TIME) end_time
UNION
SELECT CAST('11:00' AS TIME), CAST('12:00' AS TIME)
UNION
SELECT CAST('12:00' AS TIME), CAST('12:30' AS TIME)
UNION
SELECT CAST('12:30' AS TIME), CAST('13:30' AS TIME)
UNION
SELECT CAST('13:30' AS TIME), CAST('14:30' AS TIME)
UNION
SELECT CAST('15:00' AS TIME), CAST('16:00' AS TIME)
UNION
SELECT CAST('16:30' AS TIME), CAST('18:00' AS TIME)
) t
CROSS JOIN
(
SELECT DISTINCT s1.sessie_act_id, s1.sessie_ev_id, a.act_naam
FROM
sessies s1
JOIN
activiteiten a
ON a.act_id = s1.sessie_act_id
WHERE s1.sessie_ev_id = 1
) ea
LEFT JOIN
sessies s
ON ea.sessie_act_id = s.sessie_act_id
AND ea.sessie_ev_id = s.sessie_ev_id
AND s.sessie_tot > t.start_time
AND s.sessie_van < t.end_time
ORDER BY ea.sessie_act_id, t.start_time
FROM
(
SELECT CAST('10:00' AS TIME) start_time, CAST('11:00' AS TIME) end_time
UNION
SELECT CAST('11:00' AS TIME), CAST('12:00' AS TIME)
UNION
SELECT CAST('12:00' AS TIME), CAST('12:30' AS TIME)
UNION
SELECT CAST('12:30' AS TIME), CAST('13:30' AS TIME)
UNION
SELECT CAST('13:30' AS TIME), CAST('14:30' AS TIME)
UNION
SELECT CAST('15:00' AS TIME), CAST('16:00' AS TIME)
UNION
SELECT CAST('16:30' AS TIME), CAST('18:00' AS TIME)
) t
CROSS JOIN
(
SELECT DISTINCT s1.sessie_act_id, s1.sessie_ev_id, a.act_naam
FROM
sessies s1
JOIN
activiteiten a
ON a.act_id = s1.sessie_act_id
WHERE s1.sessie_ev_id = 1
) ea
LEFT JOIN
sessies s
ON ea.sessie_act_id = s.sessie_act_id
AND ea.sessie_ev_id = s.sessie_ev_id
AND s.sessie_tot > t.start_time
AND s.sessie_van < t.end_time
ORDER BY ea.sessie_act_id, t.start_time
Zie SQLFiddle voor het resultaat.
Let even niet op de volledige datum, dat doet SQL fiddle
Ik heb sessie_tot meegenomen zodat je kunt bepalen of een sessie doorloopt, eindigt of helemaal geen overlap heeft.
Kijk eens of je met dit resultaat al een stukje uit voeten kunt, later kan de querie worden uitgebreid met user specifieke informatie.
@Ger: Bedankt voor deze info, ik ga hiermee verder proberen. Dit is inderdaad een betere aanpak.