[OOP] Juiste opzet?
Ik ben begonnen met een eigen CMS voor een bepaald spel. Ik ben meteen begonnen met programmeren in OOP en dit ging me ook wel goed af. Ik ben nu alleen benieuwd of mijn gedachte wel de goede is.
Dit zijn mijn klassen en methodes:
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
145
146
147
148
149
150
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
145
146
147
148
149
150
* Article
- __construct(int $id, string $title, string $text, string $date)
- getID()
- getTitle()
- getText()
- getDateString()
* DB [i](Ik weet dat ik hierin te veel doe, maar hoe moet ik dat anders oplossen?)[/i]
- static init(array $options)
- private static setOptions(array $options)
- private static(IAuthentication $auth)
- static getAuth()
- static setParser(Parser $parser)
- static getParser()
- static setSession(Session $session)
- static getSession()
- static isUser(string $user, string $password)
- static getUser(User $user)
- static checkUser(string $id)
- static getRules()
- static getArticles()
- static getEvents()
- static getTutorials()
- static getProjects()
- static getProjectByID(int $id)
- static getAllUserPages()
- static getAllEnabledUserPages()
- static getAllShownUserPages()
- static getUserPageByIdentifier(string $identifier)
- static setDynmapURL(string $url)
- static getDynmapURL()
* Event
- __construct(int $id, string $title, string $description, string $from_date, string $to_date)
- getTitle()
- getDescription()
- getTime() ([i]deprecated[/i])
- getDateString()
- getID()
* EventsPage extends Page
- __construct(boolean $enabled = true)
- printPage()
* GalleryPage extends Page
- __construct(string $mainfolder = 'albums', boolean $enabled = true)
- printPage()
* HomePage extends Page
- __construct(boolean $enabled = true)
- printPage()
* [i]interface IAuthentication[/i]
- __construct(array $options)
- checkPassword($string hashed_password, string $user_password)
- getQuery()
* LoginPage extends Page
- __construct()
- processPage()
- printPage()
* MapPage extends Page
- __construct(boolean $enabled = true)
- printPage()
* Menu
- __construct()
- add(MenuItem $item)
- getShownMenuItems()
- getAllMenuItems()
* MenuItem
- __construct(string $text, string $url, boolean $in_menu = true)
- isShown()
- getText()
- getURL()
* NewsPage
- __construct(boolean $enabled = true)
- printPage()
* Page
- __construct($enabled = true)
- displayPage()
- printPage()
- processPage()
* PageNotFoundException
- __construct(string $message = null, int $code = 0)
* PageNotFoundPage extends Page
- __construct()
- printPage()
- processPage()
* ParserExtends extends Twig_Extension
- __construct()
- getName()
- getFilters()
- bbcodeFilter(string $string)
- stripbbtags(string $string)
* PersonalMessage [i]niet gebruikt, dus nog niet af[/i]
* Project
- __construct(int $id, string $title, string $description, string $rules, boolean $official = false, int $x = 0, int $z = 0, string $dynmap = '')
- getTitle()
- getDescription()
- getID()
- getRules()
- isOfficial()
- getX()
- getY()
- getZ()
- getDynmapFrame(int $width = 700, int $height = 600)
- getOfficialString()
* ProjectNotFoundException
- __construct(string $message = null, int $code = 0)
* ProjectPage extends Page
- __construct(boolean $enabled = true)
- printPage()
* ProjectsPage extends Page()
- __construct(boolean $enabled = true)
- printPage()
* Renderer [i]Gebruik ik als static class voor het gebruiken van Twig[/i]
- static init(string $templateDir, boolean $debug = false, boolean $strict_var = true)
- static setVariable(string $name, string $value)
- static unsetVariable(string $name)
- static loadTemplate($file = 'index.phtml')
- static render()
- static getArguments()
* Rule
- __construct(int $number, int $id, string $rule)
- getNumber()
- getID()
- getText()
- toString()
* RulesPage extends Page
- __construct(boolean $enabled = true)
- printPage()
* Session [i]Niet gebruikt en van internet afgehaald[/i]
- __construct(string $name)
- set(string $name, string $value)
- get(string $name, string $default='')
- destroy()
* TutorialsPage extends Page
- __construct(boolean $enabled = true)
- printPage()
* User
- __construct(int $id, string $username)
- getID()
- getUsername()
* UserPage
- __construct(string $identifier, string $title, string $text, boolean $enabled = true, boolean $in_menu = false)
- isInMenu()
- getIdentifier()
- printPage()
- getTitle()
* XAuthAuthentication implements IAuthentication
- __construct(array $options)
- checkPassword(string $checkPass, string $realPass, string $algorithm = 'xauth')
- getQuery()
- setOptions(array $options)
- getUsernameColumn()
- getIDColumn()
- getPasswordColumn()
- __construct(int $id, string $title, string $text, string $date)
- getID()
- getTitle()
- getText()
- getDateString()
* DB [i](Ik weet dat ik hierin te veel doe, maar hoe moet ik dat anders oplossen?)[/i]
- static init(array $options)
- private static setOptions(array $options)
- private static(IAuthentication $auth)
- static getAuth()
- static setParser(Parser $parser)
- static getParser()
- static setSession(Session $session)
- static getSession()
- static isUser(string $user, string $password)
- static getUser(User $user)
- static checkUser(string $id)
- static getRules()
- static getArticles()
- static getEvents()
- static getTutorials()
- static getProjects()
- static getProjectByID(int $id)
- static getAllUserPages()
- static getAllEnabledUserPages()
- static getAllShownUserPages()
- static getUserPageByIdentifier(string $identifier)
- static setDynmapURL(string $url)
- static getDynmapURL()
* Event
- __construct(int $id, string $title, string $description, string $from_date, string $to_date)
- getTitle()
- getDescription()
- getTime() ([i]deprecated[/i])
- getDateString()
- getID()
* EventsPage extends Page
- __construct(boolean $enabled = true)
- printPage()
* GalleryPage extends Page
- __construct(string $mainfolder = 'albums', boolean $enabled = true)
- printPage()
* HomePage extends Page
- __construct(boolean $enabled = true)
- printPage()
* [i]interface IAuthentication[/i]
- __construct(array $options)
- checkPassword($string hashed_password, string $user_password)
- getQuery()
* LoginPage extends Page
- __construct()
- processPage()
- printPage()
* MapPage extends Page
- __construct(boolean $enabled = true)
- printPage()
* Menu
- __construct()
- add(MenuItem $item)
- getShownMenuItems()
- getAllMenuItems()
* MenuItem
- __construct(string $text, string $url, boolean $in_menu = true)
- isShown()
- getText()
- getURL()
* NewsPage
- __construct(boolean $enabled = true)
- printPage()
* Page
- __construct($enabled = true)
- displayPage()
- printPage()
- processPage()
* PageNotFoundException
- __construct(string $message = null, int $code = 0)
* PageNotFoundPage extends Page
- __construct()
- printPage()
- processPage()
* ParserExtends extends Twig_Extension
- __construct()
- getName()
- getFilters()
- bbcodeFilter(string $string)
- stripbbtags(string $string)
* PersonalMessage [i]niet gebruikt, dus nog niet af[/i]
* Project
- __construct(int $id, string $title, string $description, string $rules, boolean $official = false, int $x = 0, int $z = 0, string $dynmap = '')
- getTitle()
- getDescription()
- getID()
- getRules()
- isOfficial()
- getX()
- getY()
- getZ()
- getDynmapFrame(int $width = 700, int $height = 600)
- getOfficialString()
* ProjectNotFoundException
- __construct(string $message = null, int $code = 0)
* ProjectPage extends Page
- __construct(boolean $enabled = true)
- printPage()
* ProjectsPage extends Page()
- __construct(boolean $enabled = true)
- printPage()
* Renderer [i]Gebruik ik als static class voor het gebruiken van Twig[/i]
- static init(string $templateDir, boolean $debug = false, boolean $strict_var = true)
- static setVariable(string $name, string $value)
- static unsetVariable(string $name)
- static loadTemplate($file = 'index.phtml')
- static render()
- static getArguments()
* Rule
- __construct(int $number, int $id, string $rule)
- getNumber()
- getID()
- getText()
- toString()
* RulesPage extends Page
- __construct(boolean $enabled = true)
- printPage()
* Session [i]Niet gebruikt en van internet afgehaald[/i]
- __construct(string $name)
- set(string $name, string $value)
- get(string $name, string $default='')
- destroy()
* TutorialsPage extends Page
- __construct(boolean $enabled = true)
- printPage()
* User
- __construct(int $id, string $username)
- getID()
- getUsername()
* UserPage
- __construct(string $identifier, string $title, string $text, boolean $enabled = true, boolean $in_menu = false)
- isInMenu()
- getIdentifier()
- printPage()
- getTitle()
* XAuthAuthentication implements IAuthentication
- __construct(array $options)
- checkPassword(string $checkPass, string $realPass, string $algorithm = 'xauth')
- getQuery()
- setOptions(array $options)
- getUsernameColumn()
- getIDColumn()
- getPasswordColumn()
De lijst is een beetje lang maar ik hoop dat iemand zin en tijd heeft om er kritiek op te geven. Ik weet dat er vast en zeker kritiek zal komen op de static methoden, maar ik wil dan ook graag weten hoe ik het anders kan aanpakken.
Mijn tweede vraag is, hoe ga ik dit aanpakken in mijn index.php. Ik los het nu op met switches etc. Dus als volgt:
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
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
<?php
// Set up database
DB::init($config['db']);
switch ($config['auth']['plugin']) {
case 'xauth':
DB::setAuth(new XAuthAuthentication($config['auth']));
break;
default:
break;
}
// Set up session
$session = new Session('mccms');
DB::setSession($session);
// Include BBCode Parser
require ROOT . '/lib/BBCode.php';
// Set up Twig
require_once ROOT . '/lib/BBCode.php';
require_once ROOT . '/lib/Twig/Autoloader.php';
Renderer::init('templates', true, true);
// Set up Dynmap URL
DB::setDynmapURL($config['dynmap']['url']);
if (!isset($_GET['p']) || empty($_GET['p'])) {
$_GET['p'] = $config['homepage'];
}
$menu = new Menu();
// Get page
switch ($_GET['p']) {
case 'home':
case '':
case null:
$page = new HomePage();
break;
case 'news':
$page = new NewsPage($config['pages']['news']);
break;
case 'rules':
$page = new RulesPage($config['pages']['rules']);
break;
case 'events':
$page = new EventsPage($config['pages']['events']);
break;
case 'projects':
$page = new ProjectsPage($config['pages']['projects']);
break;
case 'gallery':
$page = new GalleryPage(ROOT . '/albums', $config['pages']['gallery']);
break;
case 'tutorials':
$page = new TutorialsPage($config['pages']['tutorials']);
break;
case 'map':
$page = new MapPage($config['dynmap']['enabled']);
break;
case 'project':
$page = new ProjectPage($config['pages']['projects']);
break;
case 'login':
$page = new LoginPage();
break;
default:
try {
if ($config['pages']['userpages'] === true) {
$page = DB::getUserPageByIdentifier($_GET['p']);
} else {
$page = new PageNotFoundPage();
}
} catch (PageNotFoundException $e) {
$page = new PageNotFoundPage();
}
break;
}
// Adding menu items
$menu->add(new MenuItem('Home', '/'));
$menu->add(new MenuItem('News', '/news', ($config['pages']['news'] && $config['homepage'] != 'news')));
$menu->add(new MenuItem('Rules', '/rules', ($config['pages']['rules'] && $config['homepage'] != 'rules')));
$menu->add(new MenuItem('Events', '/events', ($config['pages']['events'] && $config['homepage'] != 'events')));
$menu->add(new MenuItem('Projects', '/projects', ($config['pages']['projects'] && $config['homepage'] != 'projects')));
$menu->add(new MenuItem('Gallery', '/gallery', ($config['pages']['gallery'] && $config['homepage'] != 'gallery')));
$menu->add(new MenuItem('Tutorials', '/tutorials', ($config['pages']['tutorials'] && $config['homepage'] != 'tutorials')));
$menu->add(new MenuItem('Map', '/map', ($config['dynmap']['enabled'] && $config['homepage'] != 'map')));
if ($config['pages']['userpages'] === true) {
$userpages = DB::getAllShownUserPages();
foreach ($userpages as $userpage) {
$menu->add(new MenuItem($userpage->getTitle(), '/' . $userpage->getIdentifier()));
}
}
$page->displayPage();
Renderer::setVariable('menuitems', $menu->getShownMenuItems());
Renderer::setVariable('title', $config['site']['title']);
Renderer::render();
[/code]
// Set up database
DB::init($config['db']);
switch ($config['auth']['plugin']) {
case 'xauth':
DB::setAuth(new XAuthAuthentication($config['auth']));
break;
default:
break;
}
// Set up session
$session = new Session('mccms');
DB::setSession($session);
// Include BBCode Parser
require ROOT . '/lib/BBCode.php';
// Set up Twig
require_once ROOT . '/lib/BBCode.php';
require_once ROOT . '/lib/Twig/Autoloader.php';
Renderer::init('templates', true, true);
// Set up Dynmap URL
DB::setDynmapURL($config['dynmap']['url']);
if (!isset($_GET['p']) || empty($_GET['p'])) {
$_GET['p'] = $config['homepage'];
}
$menu = new Menu();
// Get page
switch ($_GET['p']) {
case 'home':
case '':
case null:
$page = new HomePage();
break;
case 'news':
$page = new NewsPage($config['pages']['news']);
break;
case 'rules':
$page = new RulesPage($config['pages']['rules']);
break;
case 'events':
$page = new EventsPage($config['pages']['events']);
break;
case 'projects':
$page = new ProjectsPage($config['pages']['projects']);
break;
case 'gallery':
$page = new GalleryPage(ROOT . '/albums', $config['pages']['gallery']);
break;
case 'tutorials':
$page = new TutorialsPage($config['pages']['tutorials']);
break;
case 'map':
$page = new MapPage($config['dynmap']['enabled']);
break;
case 'project':
$page = new ProjectPage($config['pages']['projects']);
break;
case 'login':
$page = new LoginPage();
break;
default:
try {
if ($config['pages']['userpages'] === true) {
$page = DB::getUserPageByIdentifier($_GET['p']);
} else {
$page = new PageNotFoundPage();
}
} catch (PageNotFoundException $e) {
$page = new PageNotFoundPage();
}
break;
}
// Adding menu items
$menu->add(new MenuItem('Home', '/'));
$menu->add(new MenuItem('News', '/news', ($config['pages']['news'] && $config['homepage'] != 'news')));
$menu->add(new MenuItem('Rules', '/rules', ($config['pages']['rules'] && $config['homepage'] != 'rules')));
$menu->add(new MenuItem('Events', '/events', ($config['pages']['events'] && $config['homepage'] != 'events')));
$menu->add(new MenuItem('Projects', '/projects', ($config['pages']['projects'] && $config['homepage'] != 'projects')));
$menu->add(new MenuItem('Gallery', '/gallery', ($config['pages']['gallery'] && $config['homepage'] != 'gallery')));
$menu->add(new MenuItem('Tutorials', '/tutorials', ($config['pages']['tutorials'] && $config['homepage'] != 'tutorials')));
$menu->add(new MenuItem('Map', '/map', ($config['dynmap']['enabled'] && $config['homepage'] != 'map')));
if ($config['pages']['userpages'] === true) {
$userpages = DB::getAllShownUserPages();
foreach ($userpages as $userpage) {
$menu->add(new MenuItem($userpage->getTitle(), '/' . $userpage->getIdentifier()));
}
}
$page->displayPage();
Renderer::setVariable('menuitems', $menu->getShownMenuItems());
Renderer::setVariable('title', $config['site']['title']);
Renderer::render();
[/code]
Gewijzigd op 09/01/2013 07:18:28 door Koen Vlaswinkel
Ik ben vooral benieuwd naar mijn tweede vraag, dus hoe ik dit zou moeten oplossen in index.php, want ik denk niet dat mijn manier de juiste is.
in een database kun je gelijk de menu klasses dynamisch invullen en zodoende de menuitems te printen...
http://symfony.com/doc/current/book/routing.html
Het is wel handig om alle documentation van Symfony door te lezen, zelfs als je niks met het framework gaat doen. Je kan er veel inspiratie van op doen
Je kunt dit leuk oplossen met een route array. Zie ook Het is wel handig om alle documentation van Symfony door te lezen, zelfs als je niks met het framework gaat doen. Je kan er veel inspiratie van op doen
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
$routes = array (
'/home' => 'HomeController',
'/login' => 'LoginController',
'/news' => 'NewsController'
);
$pathinfo = ..; // iets om path info te vinden
if (null !== $controllerName = $routes[$pathinfo]) {
// path gevonden
$controller = new $controllerName();
// doe iets met je controller zoals een methode start
}
'/home' => 'HomeController',
'/login' => 'LoginController',
'/news' => 'NewsController'
);
$pathinfo = ..; // iets om path info te vinden
if (null !== $controllerName = $routes[$pathinfo]) {
// path gevonden
$controller = new $controllerName();
// doe iets met je controller zoals een methode start
}
Ik heb dan wel een ander probleem namelijk dat de gebruiker zelf nog pagina's kan aanmaken in het administratiepaneel, waarvoor mijn UserPage class is. Deze kan ik dus wel toevoegen aan $routes, maar moet ik dan voor alle de UserPage opgeven, en dan als parameter de $pathinfo?
zo niet heeft de gebruiker een pagina met die naam aangemaakt: laadt die
zo niet: 404
Dat lijkt me een goede oplossing, alleen hoe combineer ik dit dan met het menu? Anders moet ik twee regels aanpassen als ik een pagina handmatig wil toevoegen.
Het is voor beginners vaak handig om te beginnen met zo'n micro-frameworkje.