Hoe agenda afspraken opslaan?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Traineeship Full Stack Java developer

Dit ga je doen Start jij op 7 augustus bij de Experis Academy dan kickstart jij jouw IT-carrière! We leiden je op tot een gewilde Full Stack Java Developer met alle kennis en vaardigheden die nodig zijn om de arbeidsmarkt te betreden. Wat kun je verwachten, hoe zit een dag in het leven van een Trainee eruit? Periode 1 Als Full Stack Java Developer Trainee volg je vanuit huis een op maat gemaakte onlinetraining die in het Engels wordt gegeven. De tijd die je kwijt bent aan het volgen van de training kun je vergelijken met een fulltime werkweek. In

Bekijk vacature »

PHP Developer gezocht!

Functie omschrijving Wij zijn op zoek naar een PHP Developer! Ben jij op zoek naar een nieuwe uitdaging? Lees dan snel verder! Voor een organisatie in de regio Utrecht die zich bezighoud met het verbeteren van de medicatieveiligheid zoeken wij een Software Developer. In deze functie zijn wij op zoek naar een slimme en enthousiaste Developer die interesse heeft in farmacie, logistiek en ICT. Daarnaast beschik je over een goed analytisch vermogen en ben je van nature gestructureerd en resultaatgericht. Je moet in deze functie daadkrachtig, flexibel en communicatief goed zijn. Je verantwoordelijkheden bestaan uit: Object georiënteerd programmeren; Werken in

Bekijk vacature »

OutSystems Developer

Dit ga je doen Het van scratch af aan ontwikkelen van applicaties met OutSystems; Het aanhaken bij diverse projecten binnen de organisatie; Schakelen met de business; Meedenken over de mogelijkheden van het platform binnen de organisatie. Hier ga je werken Deze organisatie is een toonaangevende speler in de vastgoedbranche en telt momenteel ruim 500 medewerkers. Met meer dan 150 applicaties staat er een complex applicatielandschap, bestaande uit standaard- en maatwerkapplicaties. De maatwerkapplicaties worden ontwikkeld door een inhouse development team. Het doel voor de komende periode is het verder vernieuwen en optimaliseren van het huidige applicatielandschap. Zo staat de organisatie aan

Bekijk vacature »

Software developer - C Sharp

Functie omschrijving Voor een opdrachtgever, met een prachtig kantoor in omgeving Wateringen zijn wij op zoek naar een software ontwikkelaar die graag werkt met C#, JAVA of Oracle. Heb jij interesse in het programmeren en ontwikkelen van software? En heb jij enige ervaring met Oracle databases en PL/SQL? Als software developer werk je met je collega's samen in een leuk en informeel team aan het (her)ontwerpen van bedrijfssystemen. Je houdt je bezig met het ontwikkelen van REST API's en je onderhoudt applicaties in Oracle PL/SQL en APEX. Vind jij het leuk om in een Agile/Scrum omgeving te werken? Wil jij

Bekijk vacature »

Back-end Software Developer

Functie omschrijving Ben jij op zoek naar een uitdagende development functie bij een klein gespecialiseerd softwarebedrijf? Wil jij graag hybride werken (combi tussen thuis + kantoor), loop jij warm voor maatwerk software en voel jij je prettig in een informele cultuur? Zoek dan niet verder! Reageer direct! Voor een gewilde werkgever in omgeving Tilburg zoeken wij een back-end software developer met een aantal jaar werkervaring. Je gaat werken voor een klein softwarebedrijf dat gespecialiseerd is in de ontwikkeling van integratiesoftware. Jouw werkzaamheden zien er als volgt uit: In een klein team met 4 ontwikkelaars houd jij je bezig met afwisselende

Bekijk vacature »

Java developer

Als Java Developer bij Sogeti ben je onderdeel van onze toonaangevende community die bestaat uit ruim 100 gepassioneerde professionals. In teamverband lever je mooie prestaties. Daarmee draag je aan bij de meerwaarde die wij leveren aan onze klanten. Geen werkdag is hetzelfde, je bent voortdurend bezig met het oplossen van allerlei complexe vraagstukken binnen bedrijfskritische systemen. Een voorbeeld hiervan is een cliënt-volgsysteem bij Reclassering Nederland. Andere klanten waar wij onder andere voor werken: KPN, Philips, Nationale-Nederlanden, Kamer van Koophandel, ABN AMRO, Bovemij, Arval en de Politie. Werken bij Sogeti Nieuwe ontwikkelingen volgen we op de voet en delen we binnen de

Bekijk vacature »

.NET developer

Wat ga je doen als Full stack .NET developer Microsoft 365? Je stelt je op als sparringpartner voor het team en PO over toekomstige functionaliteiten, architectuur en mogelijke nieuwe producten. Je bent mede-verantwoordelijk voor het vertalen en omzetten van een user story in een passend technisch design. Je implementeert functionaliteiten op basis van een technisch design en user story. Je bent mede-verantwoordelijk voor het beheer van Azure DevOps, waaronder het beheer van GIT, Build Pipelines, Release Pipelines en geautomatiseerde testen. Hier herken jij jezelf in Hbo werk- en denkniveau of hoger aangevuld met relevante certificeringen en/of cursussen; Minimaal 3 jaar

Bekijk vacature »

Senior front end developer Digital Agency Amsterda

Functie Wij werken in multidisciplinaire teams aan verschillende projecten, echter blijf je niet gebonden aan 1 team. Dit houdt in dat wij verschillende specialisten in dienst hebben en deze door middel van een roulatiesysteem in multidisciplinaire teams laten werken. Het team bestaat vaak uit Frontend developer(s), Backend Developer(s), Designer(s), Tester(s) en Mobile Developer(s). Deze teams worden afgewisseld waardoor jij de mogelijkheid krijgt om met iedereen een keer samen te werken. Als Frontend Developer ben jij ónze Specialist op dit gebied. Jij werkt mee aan verschillende projecten voor verschillende klanten. Denk bijvoorbeeld aan klanten, zoals’; BAM, IDFA en Ultimaker. Hierbij zorg

Bekijk vacature »

Java developer (remote)

Functie Wat ga je doen als Java Developer? Jij als Java ontwikkelaar komt te werken in 1 van onze SCRUM teams. Momenteel werken er zo’n 30 ontwikkelaars binnen onze organisatie waarbij jij de brug slaat tussen het bouwen van verschillende functionaliteiten binnen onze applicaties en deze vervolgens te integreren in onze centrale hub. Je start je dag om 9 uur met een stand up en dan pak je jouw taken op voor de dag. Hieronder een aantal taken die jij zal uitvoeren: – Het bedenken en uitbouwen van features binnen de verschillende applicaties – Onderhouden van CI/CD pipelines – Bezighouden

Bekijk vacature »

Fullstack developer

Functie omschrijving Ben jij toe aan een nieuwe uitdaging en zou jij graag bij een platte maar informele organisatie werken? Voor een mooi softwarebedrijf in omgeving Gouda zijn wij op zoek naar versterking op de afdeling Software Development! Als Fullstack react.js developer wordt je bij dit bedrijf onderdeel van de volledige ontwikkeling van requirement tot oplevering! Onderdelen van jouw functie: Jouw focus ligt op de front end en alles wat daarbij komt kijken. Je gaat ontwerpen, ontwikkelen, testen en valideren. Je zult voornamelijk werken met React.js en Typescript. Maar ook Javascript, HTML en CSS komen aanbod. Daarnaast zal je ook

Bekijk vacature »

Lead developer

Functie Als Lead developer wordt jij onderdeel van een multidisciplinair team van circa 23 software engineers. Als team werken jullie agile en zijn termen als Continuous Integration en Continuous Delivery dagelijkse koek. Jullie werken aan uitdagende en afwisselende projecten met als doel klanten een totaal oplossing aan te kunnen bieden. Jij wordt verantwoordelijk voor complete projecten waarbij jij als verantwoordelijke zorgt dat het project op de juiste manier blijft draaien. Zo haal jij ook de requirements op bij de klant en kijk jij samen met het team en met de salesafdeling hoeveel uren hiervoor nodig zijn. Daarnaast stuur jij jouw

Bekijk vacature »

Software Ontwikkelaar

Functieomschrijving In deze uitdagende functie als Software Developer ga je de volgende taken uitvoeren: Maatwerk back-end software programmeren; API koppelingen bouwen; Software optimaliseren voor klanten; Bouwen maatwerk applicaties; Werken met Microsoft stack zoals C#, .NET (Core) en Entity framework; Bedrijfsprofiel Je gaat werken bij een klein softwareontwikkelingsbureau, die maatwerk software bouwt voor klanten door heel Nederland. Dit doen zij al meer dan 20 jaar. Het is van oorsprong een familiebedrijf, opgezet door de eigenaar, die er nog steeds werkt. Het team bestaat vooral uit back-end developers en één systeembeheerder. Je krijgt veel kans om jezelf te ontwikkelen en krijgt tevens

Bekijk vacature »

Full stack developer

Wat ga je doen als Full stack .NET developer Microsoft 365? Je stelt je op als sparringpartner voor het team en PO over toekomstige functionaliteiten, architectuur en mogelijke nieuwe producten. Je bent mede-verantwoordelijk voor het vertalen en omzetten van een user story in een passend technisch design. Je implementeert functionaliteiten op basis van een technisch design en user story. Je bent mede-verantwoordelijk voor het beheer van Azure DevOps, waaronder het beheer van GIT, Build Pipelines, Release Pipelines en geautomatiseerde testen. Hier herken jij jezelf in Hbo werk- en denkniveau of hoger aangevuld met relevante certificeringen en/of cursussen; Minimaal 3 jaar

Bekijk vacature »

Ambitieuze medior developer

Wat je gaat doen: Heb jij al een paar jaar ervaring als developer maar wil jij naar the next level? In ons NextLevelDev Programma helpen wij jou om de volgende stap te zetten: een mooi programma aan trainingen op het gebied van Java, hippe frameworks, Agile/Scrum, OCP-certificering en optioneel: andere JVM-talen als Kotlin en Scala; Cloud (AWS, Azure, GCP) Soc Of beter nog, wat wil jij doen? Binnen DPA GEOS zijn we dan ook op zoek naar enthousiaste Java developers om ons development team te versterken. Als Java developer werk je in Agile/Scrum teams bij onze klanten en daarbij kun

Bekijk vacature »

Applicatie ontwikkelaar

Functie omschrijving Zelfstandige applicatie ontwikkelaar gezocht voor familiair bedrijf in omgeving Rotterdam! Ben jij op zoek naar een nieuwe uitdaging en zoek jij een informele werkgever waar je zelfstandig kunt werken binnen een leuk IT team, lees dan snel verder want wie weet zijn wij op zoek naar jou! Binnen deze rol houdt jij je met het volgende bezig: Onderhouden en ontwikkelen van de IT systemen; Opzetten van Azure Cloud systemen, denk aan interfaces, hardware op de Cloud, webportalen of BI functies; Werken aan scripts binnen verschillende software applicaties, denk aan ERP en CAD; Ontwikkelen en implementeren van MS PowerApps

Bekijk vacature »
Mark Hogeveen

Mark Hogeveen

21/02/2022 20:29:26
Quote Anchor link
Ik maak een applicatie met een agenda functie.
De agenda is een soort grid waarin je de dagen van de maand ziet, zoals een typische kalender.

De afspraken tabel in MySQL:
agenda_id In de applicatie kan een gebruiker eventueel meerdere agenda's maken.
user_id Gebruiker die de afspraak heeft gemaakt.
title Korte tekst afspraak
descriptionRuimte voor langere tekst.
start_date Begindatum/tijd van afspraak
end_date Einddatum/tijd van afspraak
location Veld voor locatie/adres van afspraak.

Als ik een specifieke agenda wil weergeven, en het weergavebereik is bijvoorbeeld een maand, haal ik alle afspraken op uit de database die een begin- of einddatum hebben binnen het weergavebereik.
Ik krijg dan een resultset uit de database met de afspraken die in het huidige relevante "bereik" liggen dat ik nodig heb om de agenda te tonen aan de gebruiker.
Vervolgens maak ik een array van AgendaDay objecten (is een class), met het aantal elementen gelijk aan het aantal dagen in de weer te geven periode.
De AgendaDay class heeft op zijn beurt een array voor de afspraken die op die dag plaatsvinden.

Ik pak dus de afspraken uit de resultset van de database, en zet deze in de juiste AgendaDay objecten die corresponderen met de dag waarop de afspraak valt.

De data structuur bestaat dus uit een array van AgendaDay objecten, die op hun beurt de afspraken in zich hebben.

Nu heb ik meerdere bedenkingen:
- Het is mogelijk dat het beginmoment en eindmoment van een afspraak op verschillende dagen ligt. Ik zou dan bijvoorbeeld dezelfde afspraak in twee AgendaDay objecten kunnen zetten om dit te tonen in de browser.
- Het kan zelfs zo zijn dat een afspraak meerdere dagen duurt (zoals een vakantie). Dat zou betekenen dat nog veel meer AgendaDay objecten dezelfde afspraak kunnen bevatten om deze te kunnen tonen.
- Het kan zijn, dat een afspraak de grens tussen maanden overscreidt.

Ik vraag me dus af of dit wel de juiste aanpak is, en of het wel handig is.

Ook wil ik in de toekomst een functie implementeren waarmee de gebruiker een herhaalde afspraak kan toevoegen aan zijn agenda. Dus een afspraak die structureel elke week/maand in de agenda staat.

Het blijkt nog best ingewikkeld te zijn soms, als je er goed over nadenkt.
Heeft iemand ideeën of tips misschien?
Gewijzigd op 21/02/2022 20:51:33 door Mark Hogeveen
 
PHP hulp

PHP hulp

28/03/2024 15:49:09
 
Ad Fundum

Ad Fundum

21/02/2022 20:44:01
Quote Anchor link
Zoals ik het zie heeft de kalender drie technische lagen in het kader van MVC:
- de database is het model
- PHP verzorgt de 'business logic'
- de browser is de view

Om de kalender weer te geven is CSS grid een goed idee. Ik zou in PHP dan wel 1 kalender-object maken per afspraak en niet meerdere. Bij het tekenen van de HTML en de CSS kan je het opsplitsen in meerdere dagen. Als een afspraak langer duurt dan kan worden weergegeven kan je er een icoontje bij zetten, een beetje als 'z.o.z.', zoals een pijl naar rechts.

Afspraken herhalen is lastiger. Dan moet je je database goed op orde hebben. Herhaalpatronen worden door eindgebruikers vaak aangegeven in dagen (zie bijvoorbeeld Microsoft Outlook), dus ziet het er logischer uit wanneer afspraken niet langer dan een dag kunnen duren. Voor de meeste eindgebruikers is dat geen probleem. In een papieren agenda moet je ook op meerdere aparte dagen invullen dat je vakantie hebt.

Of je de afspraken opslaat in dagen is aan jou. Het hoeft niet, je kan ook een herhaalpatroon gebruiken voor het inplannen vanuit de startdatum van een afspraak.
De andere manier is om in de database je te beperken tot 1 afspraak per dag, en als afspraken langer duren plan je meerdere dagen in en raap je ze in 1 query weer bij elkaar.

Het is in mijn ogen lood om oud-ijzer want op het scherm moet je het toch opsplitsen. Je kunt zelfs afspraken aan elkaar rijgen met een FK-kolom met een UNIQUE index, als een linked list.

In ieder geval staat op dit blog een aardig database model, om een idee te geven voor het opslaan van terugkeerpatronen:
https://vertabelo.com/blog/again-and-again-managing-recurring-events-in-a-data-model/
Gewijzigd op 21/02/2022 20:46:32 door Ad Fundum
 
Frank Nietbelangrijk

Frank Nietbelangrijk

23/02/2022 01:20:32
Quote Anchor link
>> Ik pak dus de afspraken uit de resultset van de database, en zet deze in de juiste AgendaDay objecten die corresponderen met de dag waarop de afspraak valt.

Hiervoor zijn objecten uitgevonden. (en een instantie van een class is een object).

Goed..
Je maakt een afspraak object. Deze heeft niets met een bepaalde AgendaDay te maken.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
    $appointment = new Appointment();
    $appointment->setStart($row['start']);
    $appointment->setEnd($row['end']);
    $appointment->setTitle($row['title']);
}


En dan maak je (bijvoorbeeld) twee "dag" objecten aan:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
$day1 = new AgendaDay();
$day1->setDate('21-2-2022');
$day1->addAppointment($appointment);

$day2 = new AgendaDay();
$day2->setDate('22-2-2022');
$day2->addAppointment($appointment);


Zoals je ziet voeg ik aan twee verschillende dagen dezelfde afspraak toe. Maar dit zijn niet twee verschillende afspraken. Dit zijn slechts twee variabelen (pointers) die naar hetzelfde object wijzen. Dus voeg je afspraak aan zoveel dagen toe als je wilt. Test het maar uit door de afspraak te wijzigen en laat dan die twee dagen op het scher m zien, de wijzigingen zijn voor beiden dagen doorgevoerd.


Stapje verder:
Op een html pagina laat je een kalender maand zien. Maak dan ook een object AgendaMonth. Geef die AgendaMonth een array met AgendaDagen met daarin alle dagen van de maand. Om het aantal database queries klein te houden laat je de AgendaMonth alle afspraken die in die maand vallen ophalen uit de database. Vervolgens bouw je in AgendaMonth ook logica zodat je AgendaDay object zijn afspraken bij AgendaMonth kan opvragen..

Abstractie
Je zou er nog voor kunnen kiezen om een class AgendaPeriod te maken ipv AgendaMonth met een onbepaald aantal dagen. Deze is dan inzetbaar voor een jaarweergave, een maandweergave, een weekweergave of een dagweergave.
 
Ward van der Put
Moderator

Ward van der Put

23/02/2022 12:34:21
Quote Anchor link
Zo creëer je echter wel een afhankelijkheid:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php
$appointment
= new Appointment();
$appointment->setStart($row['start']);
$appointment->setEnd($row['end']);

$day1 = new AgendaDay();
$day1->setDate('21-2-2022');
$day1->addAppointment($appointment);
?>

Niet de AgendaDay maar de Appointment bepaalt namelijk op welke dag de afspraak valt. Je zou dus op zijn minst een exception verwachten bij AgendaDay::addAppointment als de afspraak niet valt op de datum die je voor die dag hebt ingesteld met AgendaDay::setDay.

Als je doorredeneert, lijkt het sowieso niet logisch om twee keer dezelfde datum in te stellen. Je zou ook kunnen zeggen dat de agenda slechts een view is van een queue met opeenvolgende afspraken, waarbij de afspraken meteen de agendadagen en agenda-uren bepalen.

Of simpeler gezegd: uit alleen een lijstje met afspraken kun je altijd afleiden hoe je agenda eruitziet.
 
Mark Hogeveen

Mark Hogeveen

23/02/2022 19:18:36
Quote Anchor link
Bedankt voor de reacties tot nu toe.
Het gaat me vooral om de software structuur (OO-design).

Dan heb ik nog een vraag.
Ik wil ook een weergave maken waarin je de week ziet, met dagen als kolommen zoals bij bijvoorbeeld de Outlook agenda.
Elke dag-kolom is dan eigenlijk een soort verticale tijdlijn.
Afbeelding

Zou dit nog dingen met zich meebrengen waar ik nu al rekening mee moet houden?
Gewijzigd op 23/02/2022 19:20:57 door Mark Hogeveen
 
Frank Nietbelangrijk

Frank Nietbelangrijk

24/02/2022 00:21:31
Quote Anchor link
>> Als je doorredeneert, lijkt het sowieso niet logisch om twee keer dezelfde datum in te stellen. Je zou ook kunnen zeggen dat de agenda slechts een view is van een queue met opeenvolgende afspraken, waarbij de afspraken meteen de agendadagen en agenda-uren bepalen.

Dat spreekt mij wel aan Ward. Maar het enigste waar ik nog even aan zit te denken is als je in de lijst de eerste afspraak om 2 maart hebt staan en de laatste op 4 maart, wil je dan een maandkalender of een weekkalender zien? Je zou denk ik op zijn minst wel moeten aangeven of je
(een) maand of week overzicht(en) wilt.
 
Ad Fundum

Ad Fundum

24/02/2022 13:29:35
Quote Anchor link
Mark Hogeveen op 23/02/2022 19:18:36:
Bedankt voor de reacties tot nu toe.
Het gaat me vooral om de software structuur (OO-design).

Dan heb ik nog een vraag.
Ik wil ook een weergave maken waarin je de week ziet, met dagen als kolommen zoals bij bijvoorbeeld de Outlook agenda.
Elke dag-kolom is dan eigenlijk een soort verticale tijdlijn.

Zou dit nog dingen met zich meebrengen waar ik nu al rekening mee moet houden?

Volgens mij ging het toch over opslaan? (Zie titel).
Maargoed, ik denk dat ik ook al gereageerd heb op het rekening houden met een tijdlijn: CSS Grid.
 
Ward van der Put
Moderator

Ward van der Put

24/02/2022 16:24:08
Quote Anchor link
Frank Nietbelangrijk op 24/02/2022 00:21:31:
Je zou denk ik op zijn minst wel moeten aangeven of je (een) maand of week overzicht(en) wilt.

Eens. Ik zou het configureerbaar maken, zodat de gebruiker zelf kan bepalen of er een view per dag, per week of per maand nodig is. (Of een andere view, bijvoorbeeld: toon me alle afspraken in Amsterdam, dan kan ik aansluitend even langs bij een oude vriend.)

Om bij het opslaan te blijven, want daar hangt dit mee samen: elke afspraak heeft drie variabelen, waarvan er altijd één afhankelijk is van de andere twee. Je hebt een begintijd t1, een eindtijd t2 en een duur d. Daarbij geldt:

t1 + d = t2

En dus ook:

d = t2 - t1

Je moet dus minimaal t1 en d óf t1 en t2 opslaan. (Minimaal, ik zou ze persoonlijk alledrie opslaan omdat ze zelden veranderen en omdat berekeningen en rekenfouten meer kosten dan opslag.)

Voor het weergeven van een tijdvak zoals een week of een maand heb je alleen een query nodig die controleert of t1 en t2 van een afspraak binnen het opgegeven tijdvak vallen.
 
Frank Nietbelangrijk

Frank Nietbelangrijk

24/02/2022 22:07:12
Quote Anchor link
>> Het gaat me vooral om de software structuur (OO-design).

Zoiets?

De controller (het begin)
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
class AgendaController extends AbstractController
{
    public function monthView(AppointmentRepository $appointmentRepository)
    {

        // initialiseer benodigde variabelen
        $start = new \DateTime('first day of this month');
        $end = new \DateTime('last day of this month');
        $start->setTime(0,0,0);
        $end->setTime(23, 59, 59);
        
        // Haal de afspraken op uit de database
        $appointments = $appointmentRepository->findOverlap($start, $end);
        
        // render de view en geef de benodigde data mee aan de view
        return $this->render('agenda/month.html', [
            'start' => $start,
            'end' => $end,
            'appointments' => $appointments,
        ]);
    }
}

?>


De repository haalt de informatie uit de database
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
class AppointmentRepository extends ServiceEntityRepository
{
    public function findOverlap(\DateTime $start, \DateTime $end)
    {

        return $this->createQueryBuilder('a')
            ->
andWhere('start < :end AND :start < end')
            ->
setParameter('start', $start)
            ->
setParameter('end', $end)
            ->
orderBy('a.start', 'ASC')
            ->
getQuery()
            ->
getResult()
        ;
    }
}

?>


En vervolgens de view (agenda/month.html)
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<!doctype>
<html>
    <head>
        <title><?php echo $start->format('F Y'); ?></title>
        <style>
            .wrapper {
                display: grid;
                grid-template-columns: 200px 200px 200px 200px 200px 200px 200px;
            }
            .day {
                height: 200px;
                background-color: lightblue;
            }
            .out {
                background-color: lightyellow;
            }
        </style>
    </head>
    <body>
        <h1><?php echo $start->format('F Y'); ?></h1>
        <div class="wrapper">
            
            <!-- vulling voor de eerste dag van de maand -->
            <?php if($start->format('N') > 1): ?>
                <?php for($i = 2 ; $i <= $start->format('N') ; $i++): ?>
                    <div class="day out"></div>
                <?php endfor; ?>
            <?php endif; ?>

            <!-- Alle dagen van de maand -->
            <?php for($i = 1 ; $i <= $end->format('j') ; $i++): ?>
                <div class="day">
                    <h5><?php echo $i; ?></h5>
                    <?php foreach($appointments as $appointment): ?>
                        <?php if($appointment->getStart()->format('j') == i): ?>
                            <?php echo $appointment->getTitle(); ?>
                        <?php endif; ?>
                    <?php endforeach; ?>
                </div>
            <?php endfor; ?>

            <!-- vulling na de laatste dag van de maand -->
            <?php if($end->format('N') < 7): ?>
                <?php for($i = 6 ; $i <= $end->format('N') ; $i++): ?>
                    <div class="day out"></div>
                <?php endfor; ?>
            <?php endif; ?>
        </div>    
    </body>
</html>


De array "appointments" is een array van Appointment classes:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?php
class Appointment
{
    private $id;

    private $start;

    private $end;

    private $title = '';
    
    public function __construct() {
        $this->start = new \DateTime();
        $this->end = new \DateTime();
    $this->end->add(new DateInterval('PT1H'));
    }

    
    public function __toString()
    {

        return $this->start->format('d-m-Y h:i') . ' ' . $this->title;
    }


    public function getId(): ?int
    {
        return $this->id;
    }


    public function getStart(): ?\DateTimeInterface
    {
        return $this->start;
    }


    public function setStart(\DateTimeInterface $start): self
    {
        $this->start = $start;

        return $this;
    }


    public function getEnd(): ?\DateTimeInterface
    {
        return $this->end;
    }


    public function setEnd(\DateTimeInterface $end): self
    {
        $this->end = $end;

        return $this;
    }


    public function getTitle(): ?string
    {
        return $this->title;
    }


    public function setTitle(string $title): self
    {
        $this->title = $title;

        return $this;
    }
}

?>


Het resultaat:
https://ibb.co/VW6wQQS

Hierna kun je gaan uitbreiden met formulieren om een afspraak toe te voegen, te bewerken of te verwijderen.

Toevoeging op 24/02/2022 23:39:49:

Edit:


query aangepast.
Gewijzigd op 26/02/2022 11:28:10 door Frank Nietbelangrijk
 
Ozzie PHP

Ozzie PHP

25/02/2022 12:39:10
Quote Anchor link
Mooie en zinvolle post Frank! Kan me voorstellen dat daar de nodige tijd in is gaan zitten.

Daarom bij deze een dikke 'thumbs up' van mij!

Afbeelding
 
Frank Nietbelangrijk

Frank Nietbelangrijk

25/02/2022 18:38:12
Quote Anchor link
Ja kost wel wat tijd zoals altijd. Maar als je even tijd hebt is het soms wel leuk om te doen Ozzie :-)
 
Ad Fundum

Ad Fundum

25/02/2022 19:34:45
Quote Anchor link
Frank Nietbelangrijk op 24/02/2022 22:07:12:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
->andWhere('start BETWEEN :start AND :end OR end BETWEEN :start AND :end OR start < :start AND end >:end')

Deze moet je even toelichten...
Gewijzigd op 25/02/2022 19:35:37 door Ad Fundum
 
Rob Doemaarwat

Rob Doemaarwat

25/02/2022 19:47:27
Quote Anchor link
Alle afspraken tussen die tussen :start en :end "spelen" (van belang zijn) =
- de afspraak begint (start) tussen :start en :end (maar loopt misschien daarna door)
- de afspraak eindigt (end) tussen :start en :end (maar begint misschien daarvoor)
- de afspraak begint (start) ervoor en eindigt erna (maar loopt dus _door_ de periode heen
 
Ad Fundum

Ad Fundum

26/02/2022 10:20:29
Quote Anchor link
Misschien denk ik te simpel.

Waarom moet alles toch, en dus ook een afspraak, überhaupt OO zijn?
Zo denken mensen gewoonlijk niet, het is maar een platte regel in een tabel?
Met een begintijd, een eindtijd en een naam.
Waarom je hiervoor aparte objecten programmeren?
PHP haalt zoiets als array uit je database en je kan daar zelfs
nog een standaard active record object voor gebruiken.

In de database sla je natuurlijk niet de begintijd op met een duur.
Dan moet je voor elke query, zoals voor overlap, eerst de eindtijd berekenen.
Als je in enkele gevallen de duur wilt weten kan je dat de database laten uitrekenen.

In de meeste gevallen is een query builder niet nodig, het is slechts een extra
complicatie over SQL, die niets toevoegt en de leesbaarheid bemoeilijkt.
Zo ook deze:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
->andWhere('start BETWEEN :start AND :end OR end BETWEEN :start AND :end OR start < :start AND end >:end')

In de eerste plaats snap je niet wat er staat, en je moet toch nog zelf SQL invoegen.
Een query builder zou dan op z'n minst compleet moeten zijn en een voorziening moeten
hebben voor booleaanse logica. Anders moet je alsnog bewust zijn van het verschil tussen
ANSI SQL (of het gebrek daar aan) en de database-specifieke uitbreidingen.

Bijvoorbeeld: bij PostgreSQL hoef je niet eens zelf nadenken om de overlap tussen twee
perioden uit te rekenen. Je kan hiervoor de operator OVERLAPS gebruiken.
https://www.postgresql.org/docs/current/functions-datetime.html
Overigens is de OVERLAPS operator wel degelijk ANSI SQL (editie 2011),
maar zoals wel vaker wordt het niet door MySQL of zelfs MariaDB ondersteund.
Die 'databases' zijn dermate beperkt dat je zelfs voor zoiets simpels in je eigen tijd het wiel opnieuw moet uitvinden...

En als we dat doen, snap ik niet waarom de vier situaties worden zien als uitgangssituatie.
Want het is een resultaat van slechts twee vergelijkingen.
Neem de perioden p1 (van, tot) en p2 (van, tot), dan heb je genoeg aan:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
WHERE p1.van < p2.tot
  AND p2.van < p1.tot

(NB: merk op dat er is een verschil is tussen 'tot', en 'tot en met')
 
Frank Nietbelangrijk

Frank Nietbelangrijk

26/02/2022 11:24:58
Quote Anchor link
Ad we mogen allemaal zelf ons ding doen. Waarom alles in OOP "moet" kan ik wel iets over zeggen maar dat zou dit topic kapen. Deze query had natuurlijk zeker ook in plain SQL kunnen staan maar ook dat is slechts een keuze en mede afhankelijk van het pakket waarmee je werkt.

PostgreSQL heeft zeker bepaalde voordelen ten opzichte van MySQL maar een feit is dat MySQL nog steeds het meest wordt aangeboden door de verschillende providers en waarschijnlijk ook in het lesmateriaal.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
WHERE p1.van < p2.tot
  AND p2.van < p1.tot

Jouw query lijkt te werken. Eigenlijk was ik eerder deze week daar naar op zoek maar ik kon hem zo snel niet op tafel hoesten en kwam toen bovenstaande query tegen op stackoverflow. Ik ga hem in de eerdere post verwerken. Bedankt voor deze waardevolle aanvulling.
Gewijzigd op 26/02/2022 11:30:01 door Frank Nietbelangrijk
 
Ad Fundum

Ad Fundum

26/02/2022 16:23:47
Quote Anchor link
Tuurlijk mag iedereen z'n eigen ding doen.
Alleen zie ik geen meerwaarde van een hoop (OO-) code die je moet onderhouden,
terwijl je ook code kan schrijven die beter presteert en makkelijker te lezen/bewerken is (met de juiste syntaxkleuren):
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php
$sql
= <<<'EOQ'
SELECT *
FROM a
WHERE start < $1 AND end < $2
ORDER BY a.start ASC
EOQ;
$res = $db->query_params($sql, [$end, $start]);
?>

Maar smaken verschillen en iedereen die z'n tijd wil verbranden met MySQL houd ik niet tegen.

P.S.: SO link
Gewijzigd op 26/02/2022 16:28:10 door Ad Fundum
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.