Eerste poging tot OOP
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)
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
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 ' ';
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 = ' ';
}
}
else
{
$this->class = 'class ="unavailable"';
$this->link = ' ';
}
echo '<td onselectstart="return false;" '.$this->class.'>';
echo $this->link;
echo '</td>';
$this->moment = strtotime('+1 day', $this->moment);
}
echo '</tr>';
}
}
}
?>
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 ' ';
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 = ' ';
}
}
else
{
$this->class = 'class ="unavailable"';
$this->link = ' ';
}
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
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.
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
En ik wacht wel op het lijstje voordat ik alles voor ga doen, daar leer je niet heel veel van.
* 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
- 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!
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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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)
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