Moeilijke RewriteRule
Ik ben bezig met het maken van een CMS, waarbij je in een willekeurige pagina meerdere willekeurige modules kan zetten. Om deze modules te modereren (vb: bij nieuws een bericht toevoegen) of om door modules te kunnen 'bladeren' (vb: in een catalogus in een category gaan) zou ik bepaalde parameters moeten meegeven in de URL ($_GET dus). Dit alles verwerk ik met mod_rewrite zodat het er allemaal een beetje netjes uit ziet.
Om zo een module te kunnen 'besturen' of 'beheren' moet ik dus GET-parameters meegeven, die voor elke module verschillen (kunnen) zijn. Mijn url om een module 'apart' te bekijken is als volgt:
/module/<module_id>/ en die wordt dan doorgestuurd naar module.php?moduleid=<module_id> (met deze rule dus: RewriteRule ^module/([0-9]+)/$ module.php?moduleid=$1 [L]).
Als ik hier nu nog extra parameters aan wil toevoegen, moet die RewriteRule anders... Omdat uit het moduleid niet af te leiden is over wat soort module het gaat (althans niet voor de htaccess), zou ik in de url evt de parameter namen zelf ook kunnen meegeven. Dat zou dan in de aard van het volgende zijn:
Code (php)
1
2
3
2
3
/module/<module_id>/<parameternaam1>/<parametervalue1>/<parameternaam2>/<parametervalue2>/<parameternaam3>/<parametervalue3>/...
stuurt door naar
module.php?moduleid=<module_id>&<parameternaam1>=<parametervalue1>&<parameternaam2>=<parametervalue2>& .....
stuurt door naar
module.php?moduleid=<module_id>&<parameternaam1>=<parametervalue1>&<parameternaam2>=<parametervalue2>& .....
Is dit een goed idee? Zo ja, iemand een idee hoe ik deze rule dan maak? Het aantal parameters is dus variabel...
Groeten,
Jens
Gewijzigd op 19/01/2011 19:29:19 door Jens V
Quote:
Options +FollowSymLinks
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -f [NC,OR]
RewriteCond %{REQUEST_FILENAME} -d [NC]
RewriteRule ^(.*?)$ $1 [L]
RewriteRule ^([^/]*)/([^/]*)/([^/]*)/([^/]*)/([^/]*)\.*$ index.php?module=$1&action=$2&id=$3&subaction=$4&subid=$5
RewriteRule ^([^/]*)/([^/]*)/([^/]*)/([^/]*)\.*$ index.php?module=$1&action=$2&id=$3&subaction=$4
RewriteRule ^([^/]*)/([^/]*)/([^/]*)\.*$ index.php?module=$1&action=$2&id=$3
RewriteRule ^([^/]*)/([^/]*)\.*$ index.php?module=$1&action=$2
RewriteRule ^([^/]*)\.*$ index.php?module=$1
Options +FollowSymLinks
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -f [NC,OR]
RewriteCond %{REQUEST_FILENAME} -d [NC]
RewriteRule ^(.*?)$ $1 [L]
RewriteRule ^([^/]*)/([^/]*)/([^/]*)/([^/]*)/([^/]*)\.*$ index.php?module=$1&action=$2&id=$3&subaction=$4&subid=$5
RewriteRule ^([^/]*)/([^/]*)/([^/]*)/([^/]*)\.*$ index.php?module=$1&action=$2&id=$3&subaction=$4
RewriteRule ^([^/]*)/([^/]*)/([^/]*)\.*$ index.php?module=$1&action=$2&id=$3
RewriteRule ^([^/]*)/([^/]*)\.*$ index.php?module=$1&action=$2
RewriteRule ^([^/]*)\.*$ index.php?module=$1
Dus voorgedefinieerd. De vraag is nu of het ook mogelijk is om die namen van de parameters variabel te maken. (als dat nut heeft ten minste...)
Ik doe gewoon één rule met QSA zodat alles daar binnenkomt en dat parse ik dan weer met php.
Dat had je vorige week ook al eens gezegd. Heb daarover gedacht, maar dat lijkt mij ook wel veel (denk)werk om dat ineens te steken. Opzicht is het niet zo moeilijk met de string operaties, maar de logica erachter om je parameters dan ook in order te krijgen (vb als je geen parameternaam geeft omdat dat niet nodig is...).
Jens V op 19/01/2011 21:23:16:
Dat had je vorige week ook al eens gezegd.
Open jij een nieuw topic voor eenzelfde probleem? :-X
Jens V op 19/01/2011 21:23:16:
Heb daarover gedacht, maar dat lijkt mij ook wel veel (denk)werk om dat ineens te steken. Opzicht is het niet zo moeilijk met de string operaties, maar de logica erachter om je parameters dan ook in order te krijgen (vb als je geen parameternaam geeft omdat dat niet nodig is...).
Achja, sowieso heb je wel iets nodig als een frontcontroller...
Volgens mij weet jijzelf wat je wilt accepteren, dus ook wat je erin kan stoppen en wat je eruit wilt hebben. Als je dat weet zie ik geen probleem.
Karl Karl op 19/01/2011 21:34:47:
Open jij een nieuw topic voor eenzelfde probleem? :-X
Haha, nee:) Nu gaat het effectief om 1 bepaalde rewriterule waarvoor ik ook niet direct iets op internet vindt. In het andere topic ging het om een syntax fout van een regex.
index.php
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
$query = isset($_GET['q']) ? $_GET['q'] : '';
require_once 'router.php';
$action = router($query, $parameters);
if($action == false)
$action = 'error404';
// Zelf even directory traversal aanpakken
$file = 'actions/'.str_replace('_', '/', $action).'.php';
if(!file_exsists($file)) {
$action = 'error404';
$file = 'actions/error404.php';
}
require_once $file;
$function = $action.'_action';
$function($parameters);
?>
$query = isset($_GET['q']) ? $_GET['q'] : '';
require_once 'router.php';
$action = router($query, $parameters);
if($action == false)
$action = 'error404';
// Zelf even directory traversal aanpakken
$file = 'actions/'.str_replace('_', '/', $action).'.php';
if(!file_exsists($file)) {
$action = 'error404';
$file = 'actions/error404.php';
}
require_once $file;
$function = $action.'_action';
$function($parameters);
?>
router.php
actions/index.php
Code (php)
Oid, is niet zo moeilijk en veel flexibeler dan met .htaccess
OOP is nog wat mooier
Pim - op 19/01/2011 22:35:33:
Gebruik een framework!!! Of bouw zelf iets eenvoudigs.
(....)
Oid, is niet zo moeilijk en veel flexibeler dan met .htaccess
OOP is nog wat mooier
(....)
Oid, is niet zo moeilijk en veel flexibeler dan met .htaccess
OOP is nog wat mooier
Woei, ding ding ding!!!
Jackpot ! :-D
Jens V op 19/01/2011 19:49:31:
Dus voorgedefinieerd. De vraag is nu of het ook mogelijk is om die namen van de parameters variabel te maken. (als dat nut heeft ten minste...)
de volgorde in de url ligt wel vast. Als je dan de namen 'variabel' maakt, ik hoop dan tussen controllers, niet tussen requests, hou je eigenlijk een array over waarvan de elementen verschillende dingen betekenen. Niet leuk.
In welke behoefte moet het voorzien? Kun je overwegen om de parameternaam ook op de url op te geven, zoals in
host/order/13/regel/22/edit
?
Edit: ow hell, dat zeg je erboven zelf ook. Wat dan te doen? Pak de hele url op, zoals Karl ook zegt, en blaas 'm met explode in stukjes, zodat je stuk voor stuk kunt behandelen. Twee-stuk voor twee-stuk denk ik, een parameternaam plus waarde.
Gewijzigd op 19/01/2011 23:55:53 door Bas Cost Budde