CodeIgniter vraag over URL
Ik ben net begonnen met CodeIgniter.
Nu is het zo dat het url systeem zo werkt:
Dus 1ste slash class, 2de function en 3de de eigen gegevens
Nu wil ik graag een CMS systeem maken en dat het dan zo werd:
(En dat hij dan de function index of een andere aanroept)
Weet iemand of dit mogelijk is en zoja hoe?
Alvast bedankt.
En als het goed is zag de URL er dan zonder mod_rewrite uit als index.php?/class/ID
Of ik zit er gewoon goed naast.
Maar in ieder geval, de problemen die ik soms had met Codeignitor was de reden om aan de slag te gaan met mijn eigen framework waar de toekomst CMS nog niet in zicht is, maar ik wel gebruik om mijn eigen projecten mee te ontwikkelen gebruik ik deels deze code
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
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
<?php
class Url
{
function GetSegment($int)
{
$str_Temp = $_SERVER['REQUEST_URI'];
$int_Temp = strpos($str_Temp,'php');
$int_Temp = strpos($str_Temp,'?', $int_Temp);
$int_Temp++;
if ($int_Temp>0)
{
$this->aSegmentUrl = explode('/',substr($str_Temp,$int_Temp,strlen($str_Temp)-$int_Temp));
}
return $this->aSegmentUrl[$int];
}
function CountSegments()
{
$str_Temp = $_SERVER['REQUEST_URI'];
if ($int_Temp = strpos($str_Temp,'?'))
{
$int_Temp++;
$arr_Temp = explode('/',substr($str_Temp,$int_Temp,strlen($str_Temp)-$int_Temp));
return count($arr_Temp)-1;
}
else
{
}
}
}
?>
class Url
{
function GetSegment($int)
{
$str_Temp = $_SERVER['REQUEST_URI'];
$int_Temp = strpos($str_Temp,'php');
$int_Temp = strpos($str_Temp,'?', $int_Temp);
$int_Temp++;
if ($int_Temp>0)
{
$this->aSegmentUrl = explode('/',substr($str_Temp,$int_Temp,strlen($str_Temp)-$int_Temp));
}
return $this->aSegmentUrl[$int];
}
function CountSegments()
{
$str_Temp = $_SERVER['REQUEST_URI'];
if ($int_Temp = strpos($str_Temp,'?'))
{
$int_Temp++;
$arr_Temp = explode('/',substr($str_Temp,$int_Temp,strlen($str_Temp)-$int_Temp));
return count($arr_Temp)-1;
}
else
{
}
}
}
?>
En in de zo te noemen kernel die centraal staat tussen alle librarys en modules welke beiden eigenlijk classes zijn, die laad ik in met:
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
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
<?php
function Load_Lib($sLibrary,$sArg=0)
{
$sLibrary = ucfirst(strtolower($sLibrary));
$strTemp = 'lib_'.$sLibrary;
if (!method_exists($sLibrary,$sLibrary))
{
require('Libs/'.$sLibrary.".lib.php");
$this->$strTemp = new $sLibrary($this,$sArg);
}
else
{
debug_print_backtrace();
trigger_error("Loading library again?", E_USER_ERROR);
}
}
function Load_Module($sModule,$sArg=0)
{
$sModule = ucfirst(strtolower($sModule));
if (array_search($sModule, $this->aLoadedModules) === 0)
{
//echo $sModule.' is already loaded..';
}
else
{
require('Modules/'.$sModule."/".$sModule.".mod.php");
$strTemp = 'mod_'.$sModule;
$this->$strTemp = new $strTemp($this,$sArg);
$this->aLoadedModules[] = $sModule;
}
}
?>
function Load_Lib($sLibrary,$sArg=0)
{
$sLibrary = ucfirst(strtolower($sLibrary));
$strTemp = 'lib_'.$sLibrary;
if (!method_exists($sLibrary,$sLibrary))
{
require('Libs/'.$sLibrary.".lib.php");
$this->$strTemp = new $sLibrary($this,$sArg);
}
else
{
debug_print_backtrace();
trigger_error("Loading library again?", E_USER_ERROR);
}
}
function Load_Module($sModule,$sArg=0)
{
$sModule = ucfirst(strtolower($sModule));
if (array_search($sModule, $this->aLoadedModules) === 0)
{
//echo $sModule.' is already loaded..';
}
else
{
require('Modules/'.$sModule."/".$sModule.".mod.php");
$strTemp = 'mod_'.$sModule;
$this->$strTemp = new $strTemp($this,$sArg);
$this->aLoadedModules[] = $sModule;
}
}
?>
En met deze functie kan ik zelfs via de URL een methode (functie) binnen een class aanroepen
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
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
<?php
function DetectUrlCalls()
{
/* if the type is module, next must be the name of the module class, 3th must be function and 4th the function itself
* if the type is language, next is the shortcode (nl / en / de ) and so on.
*
*/
$sUrl = $_SERVER['REQUEST_URI'];
$sUrlToLow = strtolower($sUrl);
$iPosPhpQM = strpos($sUrlToLow,'php?');
if ($iPosPhpQM>0 )
{
$iPosPhpQM = $iPosPhpQM + 4;
$aUrlSegments = explode('/', substr($sUrl,$iPosPhpQM,strlen($sUrl)-$iPosPhpQM));
$aUrlSegmentsLowerCased = explode('/', substr($sUrlToLow,$iPosPhpQM,strlen($sUrlToLow)-$iPosPhpQM));
}
else
{
return false;
}
$iMatchPos = array_search('module',$aUrlSegmentsLowerCased);
if ($iMatchPos)
{
if (strcmp('function',$aUrlSegmentsLowerCased[$iMatchPos+2]) == 0)
{
$sModule = ucfirst(strtolower($aUrlSegments[$iMatchPos+1]));
$sFunction = $aUrlSegments[$iMatchPos+3];
$this->Load_Module($sModule);
$oModule = 'mod_'.$sModule;
if(method_exists($this->$oModule,$sFunction))
{
$this->$oModule->$sFunction();
exit();
}
if ($bAccess == true)
{
if(method_exists($this->$oModule,$sFunction))
{
$this->$oModule->$sFunction();
exit();
}
$bAccess = false;
}
}
}
}
?>
function DetectUrlCalls()
{
/* if the type is module, next must be the name of the module class, 3th must be function and 4th the function itself
* if the type is language, next is the shortcode (nl / en / de ) and so on.
*
*/
$sUrl = $_SERVER['REQUEST_URI'];
$sUrlToLow = strtolower($sUrl);
$iPosPhpQM = strpos($sUrlToLow,'php?');
if ($iPosPhpQM>0 )
{
$iPosPhpQM = $iPosPhpQM + 4;
$aUrlSegments = explode('/', substr($sUrl,$iPosPhpQM,strlen($sUrl)-$iPosPhpQM));
$aUrlSegmentsLowerCased = explode('/', substr($sUrlToLow,$iPosPhpQM,strlen($sUrlToLow)-$iPosPhpQM));
}
else
{
return false;
}
$iMatchPos = array_search('module',$aUrlSegmentsLowerCased);
if ($iMatchPos)
{
if (strcmp('function',$aUrlSegmentsLowerCased[$iMatchPos+2]) == 0)
{
$sModule = ucfirst(strtolower($aUrlSegments[$iMatchPos+1]));
$sFunction = $aUrlSegments[$iMatchPos+3];
$this->Load_Module($sModule);
$oModule = 'mod_'.$sModule;
if(method_exists($this->$oModule,$sFunction))
{
$this->$oModule->$sFunction();
exit();
}
if ($bAccess == true)
{
if(method_exists($this->$oModule,$sFunction))
{
$this->$oModule->$sFunction();
exit();
}
$bAccess = false;
}
}
}
}
?>
Maar dit zijn zeg maar de ruwe bouwstenen die jij nu ziet van mijn project, het is dan denk ik even uitvogelen hoe je dit zou moeten toepassen en het ontbreekt natuurlijk nog het een en ander aan controle wanneer iets wel of niet mag worden aangesproken.
En ja zoals ik de librarys en modules gebruik, het in wijze classes zijn, is het in theorie al eigenlijk fout hoe je om moet gaan met classes, maar het werkt en behaalt de doelstelling zoals ik er mee om wil kunnen gaan.
Hoop dat je hier iets aan hebt..
Dat is wat ik zocht. Bedankt
@Danny
Normaal ziet de url er zo uit: example.com/index/class/function/id
Maar ik had hem inderdaad al bewerkt met mod_rewrite.
Maar ik moet voor een klant een bestaande website aanpassen die in die Franwork is gemaakt. Maar ik ga waarschijnlijk wel dit systeem vaker gebruiken voor website's, maar ik snap nog niet helemaal wat het nadeel van dit systeem is.
Maar goed, dat moet ook weer niet boeien als de praktijk leert dat jij je projecten ermee kan realiseren zonder problemen.
Maar ik denk dat ik toen tegen een probleem (bug) was aangelopen in het project, vooral toen ik een website meertalig wilde maken, met javascript/ajax er in.
Toen werd het eventjes op dat moment zo rommelig voor me dat ik het probleem niet kon ontlopen om het toch werkend te krijgen.
Maar codeignitor was een goede leermeester in het opdoen van ideeën en dan daarmee
aan de slag te kunnen.
Gewijzigd op 24/08/2010 00:44:50 door Danny Roelofs
Eerst maar eens met alleen PHP proberen en dan ook jQuery er maar bij betrekken.