Eerste poging tot OOP

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Bart C

Bart C

26/11/2012 21:59:00
Quote Anchor link
Hoi,

ik heb een poging gedaan om een bestaande pagina uit te bouwen tot een OOP-pagina.

Graag had ik eens een aantal opmerkingen/sturingen gehad zoals bvb, moet ik elke variabele die in mijn klasse gebruikt wordt als property van mijn klasse gebruiken of mag ik dat gewoon als variabele houden (bvb een variabele waar je een tussenresultaat bij een berekening in opslaat)...

Wat de html betrett, tja, dat is knip- en plakwerk. Maar ik haal bijvoorbeeld alle data op uit de tabel tbl_hourlist om dat in een table te plaatsen. Kan ik dan een aparte klasse maken waarin je alle data ophaalt en dan een instantie van die klasse oproepen in degene die ik hier gepost heb?

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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
<?php
include 'functions.php';
connectdb();
setlocale(LC_ALL, 'nld_nld');

class weekcalendar {
    public $weekdata;
    
    /* CONSTRUCTOR */    
    public function __construct($startday, $personid){
        $this->startday = $startday;
        $this->personid = $personid;
        $this->weekdata = array();
        
        $this->set_weekdata();
        $this->build_calendar();
    }

    
    public function set_weekdata(){
        //Functie week_start_end geeft een array terug
        $this->week_start_end = week_start_end(date($this->startday));
            $this->weekdata['weekstart'] = date('d-m-Y', $this->week_start_end['start']);
            $this->weekdata['weekend'] = date('d-m-Y', $this->week_start_end['end']);
            $this->weekdata['weeknumber'] = $this->week_start_end['number'];
    }

    
    public function build_calendar(){
        echo '<div class="wrapper">';
            echo '<div class="box">';
                $this->build_weeknav();
                echo '<table class="calendar">';
                    $this->build_weekdays();
                    $this->build_rows();
                echo '</table>';
            echo '</div>';
        echo '</div>';
    }

    
    public function build_weeknav(){
        echo '<div class="week-nav">';
            if (strtotime(date('d-M-Y')) >= strtotime($this->weekdata['weekstart']) & strtotime(date('d-M-Y')) <= strtotime($this->weekdata['weekend']))
            {

                $display = 'style="display: none"';
            }

            else
            {
                $display = '';
            }


        echo '<a class="week-nav left ss-icon" '.$display.' href="index.php?personid='.$this->personid.'&startday='.strtotime(($this->weekdata['weekstart']). ' -7 day').'">◄</a>';
        echo '<a class="week-nav right ss-icon" href="index.php?personid='.$this->personid.'&startday='.strtotime(($this->weekdata['weekstart']). ' +7 day').'">►</a>';
        echo '</div>';
    }

    
    public function build_weekdays(){
        echo '<thead>';
        echo '<tr>';
            echo '<th class="week">WEEK '.$this->weekdata['weeknumber'].'</th>';
                $this->date = $this->weekdata['weekstart'];
                $this->i = 1;
                while ($this->i < 8)
                {

                    echo '<th class="'.strftime('%A', strtotime($this->date)).'">';
                    echo '<em>'.strftime('%A', strtotime($this->date)).'</em>';
                    echo strftime('%d', strtotime($this->date));
                    echo '&nbsp;';
                    echo strftime('%b', strtotime($this->date));
                    echo '</th>';
                    $this->i++;
                    $this->date = strftime(date('d-M-y', strtotime($this->date)) . ' +1 day');
                }

          
        echo '</tr>';
        echo '</thead>';
    }

    
    public function build_rows(){
        echo '<tbody>';
        //Tussen de weekdagen en de rest van de kalender een ruimte inbouwen
        echo '<tr>';
            echo '<td class="divider" height="20" colspan="8"></td>';
        echo '</tr>';
        
        //Alle momenten van de dag ophalen
        $this->query_hours = 'SELECT * FROM tbl_hourlist';
        $this->result_hours = mysql_query($this->query_hours) or die ('foutmelding $query_hours');
        
        while ($this->row = mysql_fetch_array($this->result_hours)){
            echo '<tr>';
                echo '<td class="hour">';
                echo $this->row['StartTime'];
                echo '</td>';
                $this->moment = strtotime($this->weekdata['weekstart']);
                    while ($this->moment <= strtotime($this->weekdata['weekend']))
                    {

                        //Kijken of de praktijk op dat moment gesloten is    
                        $this->query_open = 'SELECT * FROM tbl_open
                            INNER JOIN tbl_hourlist ON tbl_hourlist.ID = tbl_open.Moment_ID
                            WHERE tbl_open.Weekday = "'
.strftime(date('N', $this->moment)).'"
                                AND tbl_open.Moment_ID = (SELECT ID FROM tbl_hourlist WHERE StartTime = "'
.$this->row['StartTime'].'" AND EndTime = "'.$this->row['EndTime'].'")';

                        $this->result_open = mysql_query($this->query_open) or die ('foutmelding $query_open');

                        if (mysql_num_rows($this->result_open) > 0)
                        {

                            $this->query_booked = 'SELECT * FROM tbl_consultations
                                INNER JOIN tbl_hourlist ON tbl_hourlist.ID = tbl_consultations.Moment_ID
                                WHERE tbl_consultations.Date = "'
.date('Ymd', $this->moment).'"
                                    AND tbl_consultations.Moment_ID = (SELECT ID FROM tbl_hourlist WHERE StartTime = "'
.$this->row['StartTime'].'" AND EndTime = "'.$this->row['EndTime'].'")';
                            
                            $this->result_booked = mysql_query($this->query_booked) or die ('foutmelding query_booked');
                            
                            if (mysql_num_rows($this->result_booked) == 0)
                            {

                                $this->class = 'class="available"';
                                $this->link = '<a class="btn-book" href="fillform.php?personid='.$this->personid.'&day='.$this->moment.'&starttime='.$this->row['StartTime'].'&endtime='.$this->row['EndTime'].'">
                                            <div class="normal">VRIJ</div>
                                            <div class="hover">
                                                <span>+</span>Maak hier <br>uw afspraak
                                            </div>
                                         </a>'
;
                            }

                            else
                            {
                                $this->class = 'class="booked"';
                                $this->link = '&nbsp';
                            }
                        }

                        else
                        {                          
                            $this->class = 'class ="unavailable"';
                            $this->link = '&nbsp';
                        }


                        echo '<td onselectstart="return false;" '.$this->class.'>';
                        echo $this->link;
                        echo '</td>';
                        $this->moment = strtotime('+1 day', $this->moment);
                    }

            echo '</tr>';
        }
    }
}

?>
Gewijzigd op 26/11/2012 22:01:01 door Bart C
 
PHP hulp

PHP hulp

20/06/2024 21:59:01
 
Wouter J

Wouter J

26/11/2012 22:11:58
Quote Anchor link
Dit is alles behalve OO en dat is niet erg, want het is je eerste poging. Waar je alleen wel vanaf moet is een oud script willen ombouwen tot OO. OO is iets wat voornamelijk gebeurd voor het scripten, het uitdenken van de pagina. Aangezien je bij het bouwen van het oude script deze nadenkfase hebt overgeslagen kun je die niet even inhalen. Je zult weer 'van stratch' moeten beginnen.

Ik geef je 1 enorm grote regel in OO:
Elke klasse of method heeft maar 1 verantwoordelijkheid, zodra het er meer zijn splits je deze op

Schrijf nu eerst is op welke verantwoordelijkheden jij nu allemaal hebt in dit 'simpele' scriptje. Met verantwoordelijkheid bedoel ik taken zoals omgaan met de database, vasthouden van data, renderen van data, ect.

Quote:
moet ik elke variabele die in mijn klasse gebruikt wordt als property van mijn klasse gebruiken of mag ik dat gewoon als variabele houden (bvb een variabele waar je een tussenresultaat bij een berekening in opslaat)...

Nee, een property is alleen een eigenschap van een klasse.
 
Bart C

Bart C

26/11/2012 22:29:56
Quote Anchor link
Ok, dat is duidelijk en zo heb ik het graag.
Tabula rasa dus :-)

Dus van de functie om vanuit een datum het weeknummer, het begin- en het einde van de week te berekenen, kun je dan ook best een klasse maken met daarin de nodige properties en method? Of hou je dat dan als gewone functie buiten de klasse die je kunt aanroepen.

Ik begrijp het principe wel maar zie nog niet hoe je het optimaal kan uitvoeren. Ik ga eens aan de slag met dat lijstje zoals je me aanraadde.
Gewijzigd op 26/11/2012 22:30:32 door Bart C
 
Wouter J

Wouter J

26/11/2012 22:33:18
Quote Anchor link
Nooit zomaar gewone functies in OO (behalve de PHP functies dan), altijd onderbrengen in klassen.

En ik wacht wel op het lijstje voordat ik alles voor ga doen, daar leer je niet heel veel van.
 
Bart C

Bart C

26/11/2012 22:43:58
Quote Anchor link
* ophalen van alle records uit de tabel tbl_hourlist en bijhouden (periodes van 15 minuten voor consultaties)
* ophalen van de opgeslagen data uit tbl_open a.d.h.v. parameters en bijhouden (welke dag is dokterspraktijk geopend)
* ophalen van de opgeslagen data uit tbl_reservations a.d.h.v. parameters en bijhouden (als de praktijk open is, is de datum dan nog niet ingenomen?)
* berekenen van start- en einddatum + het weeknummer aan de hand van een datum
* opbouw van de kalender afhankelijk van het doel (voor de cliënt of voor de dokter / gebruiker of beheerder) en met de data opgehaald uit de voorgaande tabellen

Dat lijken mij de grote lijnen maar misschien zie ik het nog niet gedetailleerd genoeg...

Ik zou nu bijvoorbeeld een aparte klasse 'hourlist' maken en daarin de query uitvoeren om de data uit tbl_hourlist te halen. Die data zou ik dan in een array stoppen zodat ik erdoor kan lopen bij de opbouw van mijn kalender...enz
Gewijzigd op 26/11/2012 22:45:07 door Bart C
 
Wouter J

Wouter J

26/11/2012 23:00:29
Quote Anchor link
Dat zijn inderdaad de taken, je moet het alleen wat globaler bekijken. Ik zou dit zeggen:
- Communiceren met de database
- Datum vasthouden en kunnen outputten in formats, ect. (deze heeft PHP al: class.datetime)
- Render klassen (1 voor een dag, 1 voor een week, 1 voor een maand, 1 voor een jaar en 1 voor de complete agenda)

Al deze verantwoordelijkheden krijgen hun eigen klassen. Nu moet je nagaan wat al deze klassen moeten doen: Welke methods gaan ze hebben? Welke eigenschappen (=properties) krijgen ze? Als je dat hebt uitgetekend kun je gemeenschappelijke dingen bij elkaar plaatsen en klassen gaan groeperen en vervolgens beginnen met het scripten (de tekening met klassen en hun methods/properties kan je eventueel hier plaatsen om zo tips te krijgen).

Mocht je vragen hebben dan kun je ze natuurlijk altijd stellen!
 
Bart C

Bart C

27/11/2012 13:14:11
Quote Anchor link
Dag Wouter,

ik heb wat verder zitten lezen en zoeken.
Ik heb eens database-script overgenomen die niet alleen de connectie maakt maar ook een aantal mysql-opdrachten uitvoert (http://snipplr.com/view/8417/). Dit allemaal als test.

Daar heb ik dan mee proberen verder te werken.

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
<?php
class hourlist {
    var
$result;
    
    public function __construct(){    
        $this->getData();
    }

    
    public function getData(){
        $this->_result = array();
        
        $database = new database('localhost', 'root', '*****', '*****');
        $this->result = $database->query('SELECT * FROM tbl_hourlist');
        return $this->_result;
    }    
}

?>

Update: moet ik mijn db-connector in de constructor plaatsen?

Dan heb ik even de classes overgenomen voor de opbouw van een tabel van http://www.phphulp.nl/php/tutorial/overig/oop-beginnershandleiding-php5/701/voorbeeld-html-tabel/1845/ en heb ik dit geprobeerd die deels werkt:

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
<?php
        $hourlist
= new hourlist();
        $hourlist->getData();
        
        $rowA = new Row();
            foreach ($hourlist->_result[1] as &$list){
                $cell = new Cell('$list');
                $rowA->append($cell);
            }

            unset($list);

        $table = new Table();
        $table->append($rowA);
        $table->draw();
?>


Door $hourlist->_result[1] te gebruiken krijg ik 3 cellen met daarin de waarden uit de 2de resultaatrij van mijn query (ID, StartTime, EndTime).

Ik wil dus gewoon de StartTime (of [1]) van elk record.
Gewijzigd op 27/11/2012 15:16:15 door Bart C
 



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.