[PHP] modules

Pagina: 1
Acties:
  • 412 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • isomis
  • Registratie: Mei 2005
  • Laatst online: 19-09 21:30
Mijn websites staat helemaal uit modules. Ik zal eerst even uitleggen hoe ik het heb gedaan:

Ik gebruik savant2 templatesysteem.

Ik heb in mijn index.php al mijn modules geinclude:

Voorbeeld:
include( "module_webshop.php" );
include( "module_functions.php" );

Aan de hand van een switch(), switch ik tussen de verschillende modules door index.php?mod=webshop.

Eenmaal binnen de module, heb ik weer een switch gemaakt die switch tussen de verschillende
sections:

voorbeeld:
if ( $section == "order" ) $ModuleOutput = viewOrder();
if ( $section == "addorder" ) $ModuleOutput = addOrder();

dus als ik een order wil toevoegen doe ik: index.php?mod=webshop&s=order.

Het werkt allemaal fijn, alleen het probleem is als je een webshop maakt heb je heel veel sections en daardoor krijg je module_webshop.php met veel php code. Doordat ik alle modules include in mijn index.php gaat hij alle modules uitlezen met als gevolg een trage website.


Dit wil ik veranderen. Ik wil gewoon gewoon dat alleen de sectie van een bepaalde module gelaad wordt. Kan iemand mij een tip geven?

Ik zie dat veel prof websites zo werken: www.website.nl/guestbook/add

Webontwikkelaar - Kitesurfer | Gamer


Acties:
  • 0 Henk 'm!

  • eghie
  • Registratie: Februari 2002
  • Niet online

eghie

Spoken words!

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
$page = $_GET["page"];
$section $_GET["s"];

switch ($page)
{
       case "webshop":
              switch ($section)
              {
                     case "order":
                            include("webshop/order.php");
                            break;
                     case "addorder":
                            include("webshop/addorder.php");
                            break;
                     default:
                            include("webshop/index.php");
              }
              break;
       case "jada":
              include("jada.php");
              break;
       default:
              include("error404.php");
}

Dat bijvoorbeeld in je index.php gebruiken.

[ Voor 13% gewijzigd door eghie op 16-11-2005 18:11 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Let daarbij op dat je ook echt include blijft gebruiken, en niet require. Require laadt namelijk de file onconditinoeel in, terwijl een include alleen uitgevoerd wordt als dat met de daadwerkelijke programmaflow nodig is.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • isomis
  • Registratie: Mei 2005
  • Laatst online: 19-09 21:30
met deze oplossing ga je voor elke section een apart bestand maken. Ik zou het graag wel in 1 bestand willen houden, zodat ik een module bestand heb en een mapje met templates. Daarnaast wil ik ook dat hij maar 1 section pakt uit de module, zonder elke keer de hele module te lezen.

Ik zat zelf te denken aan een class modules waarin verschillende functies zitten zoals loadmodule(), getTemplates() enz

Eigenlijk wil ik af van die switch :)

Iedergeval bedankt voor de opmerking.

[ Voor 13% gewijzigd door isomis op 16-11-2005 18:20 ]

Webontwikkelaar - Kitesurfer | Gamer


Acties:
  • 0 Henk 'm!

  • prototype
  • Registratie: Juni 2001
  • Niet online

prototype

Cheer Bear

-NMe- schreef op woensdag 16 november 2005 @ 18:18:
Let daarbij op dat je ook echt include blijft gebruiken, en niet require. Require laadt namelijk de file onconditinoeel in, terwijl een include alleen uitgevoerd wordt als dat met de daadwerkelijke programmaflow nodig is.
En daarbij moet je ook overwegen of je wel of niet wil dat het mogelijk is om hetzelfde bestandje niet later nog een keer te includen; het verschil dus tussen include_once en include.

[ Voor 7% gewijzigd door prototype op 16-11-2005 18:23 ]


Acties:
  • 0 Henk 'm!

Verwijderd

"index.php?mod=webshop&s=order" kan je naar "/webshop/order" krijgen met mod-rewrite.

T is wat ingewikkeld, je ook iets met PHP maken mbv MultiViews.

Acties:
  • 0 Henk 'm!

  • isomis
  • Registratie: Mei 2005
  • Laatst online: 19-09 21:30
Verwijderd schreef op woensdag 16 november 2005 @ 18:23:
"index.php?mod=webshop&s=order" kan je naar "/webshop/order" krijgen met mod-rewrite.

T is wat ingewikkeld, je ook iets met PHP maken mbv MultiViews.
bedankt, dat zocht ik ook :)

Webontwikkelaar - Kitesurfer | Gamer


Acties:
  • 0 Henk 'm!

  • eghie
  • Registratie: Februari 2002
  • Niet online

eghie

Spoken words!

isomis schreef op woensdag 16 november 2005 @ 18:19:
met deze oplossing ga je voor elke section een apart bestand maken. Ik zou het graag wel in 1 bestand willen houden, zodat ik een module bestand heb en een mapje met templates. Daarnaast wil ik ook dat hij maar 1 section pakt uit de module, zonder elke keer de hele module te lezen.

Ik zat zelf te denken aan een class modules waarin verschillende functies zitten zoals loadmodule(), getTemplates() enz

Eigenlijk wil ik af van die switch :)

Iedergeval bedankt voor de opmerking.
Het kan ook via een 2 dimensionele array ofzo. Dat je hem ongeveer zo benaderd:
PHP:
1
include($page["webshop"]["addorder"]);

Gewoon een beetje creatief zijn.

Acties:
  • 0 Henk 'm!

  • isomis
  • Registratie: Mei 2005
  • Laatst online: 19-09 21:30
voorbeeld van de module_contact
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
 
<?

//-----------------------------------------------------------------------------------

function switchContact(){
    
    global $ModuleOutput;
    
    $section = $_REQUEST["t"];
    
    if ( $section == "a" )  $ModuleOutput = addContact();
    if ( $section == "" )    $ModuleOutput = addContact();

}

//-----------------------------------------------------------------------------------

function addContact(){

    if ( $_POST['submit'] == 'Verstuur'){


        mail("info@vidicam.nl", "Bericht ontvangen van vidicam.nl", "".$_POST['strComments']."<br><br><br><b>Contactgegevens:</b><br>Naam:".$_POST['strName']."<br>Email:".$_POST['strEmail']."<br>", "MIME-Version: 1.0\r\nContent-type: text/html; charset=iso-8859-1\r\nFrom: ".$_POST['strEmail']."" );
        $Output .= "Uw bericht is ontvangen.";
        $Output .= '<meta http-equiv="refresh" content="2;url=index.php">';
    }else{

        $tpl =& new Savant2(array('template_path' => 'tpl_templates/contact'));
        return $tpl->fetch('add.tpl.php');
    
    }

  $Output = $Output.$tpl->output;
    return $Output;
}

//-----------------------------------------------------------------------------------

?>



Voorbeeld zie je hier: http://www.isomis.nl/index.php?mod=contact

[ Voor 54% gewijzigd door isomis op 16-11-2005 18:31 ]

Webontwikkelaar - Kitesurfer | Gamer


Acties:
  • 0 Henk 'm!

  • prototype
  • Registratie: Juni 2001
  • Niet online

prototype

Cheer Bear

eghie schreef op woensdag 16 november 2005 @ 18:24:
[...]

Het kan ook via een 2 dimensionele array ofzo. Dat je hem ongeveer zo benaderd:
PHP:
1
include($page["webshop"]["addorder"]);

Gewoon een beetje creatief zijn.
Als je $page niet juist filtered is dit vatbaar voor hele flauwe grappen i.e. andere files includen die daar niet voor bedoeld waren. Het is beter dat je dan werkt via een methode waarbij je vooraf een set samenstelt, en de keuze voor de pagina om te includen enkel en alleen in deze set zich bevindt.

[ Voor 20% gewijzigd door prototype op 16-11-2005 18:26 ]


Acties:
  • 0 Henk 'm!

  • eghie
  • Registratie: Februari 2002
  • Niet online

eghie

Spoken words!

isomis schreef op woensdag 16 november 2005 @ 18:24:
voorbeeld van de module_contact

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
//-----------------------------------------------------------------------------------

function switchContact(){
    
    global $ModuleOutput;
    
    $section = $_REQUEST["t"];
    
    if ( $section == "a" )  $ModuleOutput = addContact();
    if ( $section == "" )    $ModuleOutput = addContact();

}

//-----------------------------------------------------------------------------------

function addContact(){

    if ( $_POST['submit'] == 'Verstuur'){


        mail("info@vidicam.nl", "Bericht ontvangen van vidicam.nl", "".$_POST['strComments']."<br><br><br><b>Contactgegevens:</b><br>Naam:".$_POST['strName']."<br>Email:".$_POST['strEmail']."<br>", "MIME-Version: 1.0\r\nContent-type: text/html; charset=iso-8859-1\r\nFrom: ".$_POST['strEmail']."" );
        $Output .= "Uw bericht is ontvangen.";
        $Output .= '<meta http-equiv="refresh" content="2;url=index.php">';
    }else{

        $tpl =& new Savant2(array('template_path' => 'tpl_templates/contact'));
        return $tpl->fetch('add.tpl.php');
    
    }

  $Output = $Output.$tpl->output;
    return $Output;
}

//-----------------------------------------------------------------------------------
graag even tussen [code=php ] en [ /code] zetten.
prototype schreef op woensdag 16 november 2005 @ 18:25:
[...]


Als je $page niet juist filtered is dit vatbaar voor hele flauwe grappen i.e. andere files includen die daar niet voor bedoeld waren. Het is beter dat je dan werkt via een methode waarbij je vooraf een set samenstelt, en de keuze voor de pagina om te includen enkel en alleen in deze set zich bevindt.
Als register_globals niet aan staat is er niets aan de hand. Ik bedoel dan wel, dat je de array met de hand aanmaakt, dus niet dynamisch gaat laden aan de hand van de variablen uit je uri. Dan is er niks aan de hand. Ik bedoel dus ongeveer zoiets:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$page = array(
       "webshop" => array(
              "orders" => "webshop/orders.php",
              "addorders" => "webshop/addorders.php",
              "search" => "webshop/search.php"),
       "guestbook" => array(
              "view" => "guestbook/index.php",
              "additem" => "guestbook/add.php")
);

$incpag = $page[$_GET["page"]][$_GET["s"]];

if ($incpag != null)
{
       include($incpag);
}
else
{
       include("errors/404.php");
}

[ Voor 48% gewijzigd door eghie op 16-11-2005 18:40 . Reden: typfout weggewerkt en wat meer uitleg gegeven ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Verwijderd schreef op woensdag 16 november 2005 @ 18:23:
"index.php?mod=webshop&s=order" kan je naar "/webshop/order" krijgen met mod-rewrite.

T is wat ingewikkeld, je ook iets met PHP maken mbv MultiViews.
Multiviews is niet veel makkelijker hoor. ;)
P&W FAQ - Mod_rewrite

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • isomis
  • Registratie: Mei 2005
  • Laatst online: 19-09 21:30
done

Webontwikkelaar - Kitesurfer | Gamer


Acties:
  • 0 Henk 'm!

Verwijderd

-NMe- schreef op woensdag 16 november 2005 @ 18:28:
[...]

Multiviews is niet veel makkelijker hoor. ;)
P&W FAQ - Mod_rewrite
Och, misschien betrek ik 't op mezelf :+

/me is geen "programmeur", maar schrijft code ;)

Acties:
  • 0 Henk 'm!

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
-NMe- schreef op woensdag 16 november 2005 @ 18:18:
Let daarbij op dat je ook echt include blijft gebruiken, en niet require. Require laadt namelijk de file onconditinoeel in, terwijl een include alleen uitgevoerd wordt als dat met de daadwerkelijke programmaflow nodig is.
Waar heb je die onzin vandaan?
require() and include() are identical in every way except how they handle failure. include() produces a Warning while require() results in a Fatal Error.

Acties:
  • 0 Henk 'm!

Verwijderd

wat ik doe is dat ik index.php 3 variablen meegeef, namelijk module, action & request...

module is de directory, action de class (en de file) en request de method (van de action class)

ik geef welke class automatische toegang tot een system object waarmee hij components, database object, session manager, error manager, log manager, enz kan opvragen.

Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op woensdag 16 november 2005 @ 18:23:
"index.php?mod=webshop&s=order" kan je naar "/webshop/order" krijgen met mod-rewrite.

T is wat ingewikkeld, je ook iets met PHP maken mbv MultiViews.
wat je ook kunt doen is ipv met multiviews werken, index.php/webshop/order vertalen naar de get variablen... ik gebruik de volgende code...

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if(preg_match("/\.php\\/(.*)$/",$_SERVER['PHP_SELF'],$matches)) // find the variables
{
        $urls = explode('/',$matches[1]); // put them in an array...
        
        $_GET['module'] = addslashes( $urls[0] );
        $_GET['action'] = addslashes( $urls[1] );
        $_GET['request'] = addslashes( $urls[2] );
        
    for ($i = 3; $i < count($urls); $i = $i+2)
    {
             if (isset($urls[$i+1]) && !empty($urls[$i])) // and make it a nice assoc. array
             {
                    $_GET[$urls[$i]] = addslashes( $urls[$i+1] );
             }
    }
}

[ Voor 16% gewijzigd door Verwijderd op 16-11-2005 21:31 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Ik gebruik zelf een soorgelijk iets, maar met multiviews kan je de ".php" bij je file weglaten, staat net ff wat leuker. ;)

Verder doet mn functie ongeveer hetzelfde als die van jou, alleen maak ik er geen get van maar geef een array terug.

[edit]
In jouw code zou ik dus alleen $urls teruggeven,$GET[] er omheen is niet zo nodig. ;)

[ Voor 28% gewijzigd door Verwijderd op 16-11-2005 23:33 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op woensdag 16 november 2005 @ 22:20:
Ik gebruik zelf een soorgelijk iets, maar met multiviews kan je de ".php" bij je file weglaten, staat net ff wat leuker. ;)

Verder doet mn functie ongeveer hetzelfde als die van jou, alleen maak ik er geen get van maar geef een array terug.
ja, heb hem ff geedit : ) ik geeft ook array terug, anders krijg je dat iedereen overal dingen kan wijzingen enzo

  • eamelink
  • Registratie: Juni 2001
  • Niet online

eamelink

Droptikkels

-NMe- schreef op woensdag 16 november 2005 @ 18:18:
Let daarbij op dat je ook echt include blijft gebruiken, en niet require. Require laadt namelijk de file onconditinoeel in, terwijl een include alleen uitgevoerd wordt als dat met de daadwerkelijke programmaflow nodig is.
En waar haal je die onzin vandaag? :)

Het enige verschil tussen require en include is dat require een fatal error geeft (wat je meestal wilt), en include een warning.

  • eamelink
  • Registratie: Juni 2001
  • Niet online

eamelink

Droptikkels

eamelink schreef op donderdag 17 november 2005 @ 00:42:
[...]


En waar haal je die onzin vandaag? :)

Het enige verschil tussen require en include is dat require een fatal error geeft (wat je meestal wilt), en include een warning.
IK LIEG

In een vage obscure alleen door NMe gebruikte mirror blijkt te staan dat - hoewel de code niet geinterpreteerd wordt - een included file altijd geopend wordt. :*)

Maaaaarrre, nieuwe inzichten leiden tot het vermoeden dat de Nederlandse obscure manual gewoon niet klopt. Lees het volledige verhaal twee posts verderop 8)

[ Voor 15% gewijzigd door eamelink op 17-11-2005 01:05 ]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

eamelink schreef op donderdag 17 november 2005 @ 00:51:
IK LIEG

In een vage obscure alleen door NMe gebruikte mirror blijkt te staan dat - hoewel de code niet geinterpreteerd wordt - een included file altijd geopend wordt. :*)
Als je die vage, obscure, alleen door mij gebruikte mirror ook nog even hier post, dan heeft iedereen er wat aan. :+
http://nl3.php.net/manual/nl/function.require.php

Vreemd genoeg staat dat verhaaltje op de Engelse versie van dezelfde documentatiepagina niet. 8)7
http://nl3.php.net/manual/en/function.require.php

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • eamelink
  • Registratie: Juni 2001
  • Niet online

eamelink

Droptikkels

-NMe- schreef op donderdag 17 november 2005 @ 00:52:
[...]

Als je die vage, obscure, alleen door mij gebruikte mirror ook nog even hier post, dan heeft iedereen er wat aan. :+
http://nl3.php.net/manual/nl/function.require.php

Vreemd genoeg staat dat verhaaltje op de Engelse versie van dezelfde documentatiepagina niet. 8)7
http://nl3.php.net/manual/en/function.require.php
Hmmm, ik denk toch dat jij liegt... Volgens mij klopt die Nederlandse manual niet.

File's bakken :
PHP:
1
2
3
4
5
6
7
8
9
10
<?php
echo "Starting!";
for($i = 0; $i <= 100; $i++){
    $fp = fopen($i . ".txt", w);
    for($j = 0; $j<= 100000; $j++){
        fwrite($fp, rand() . "\n");
    }
    echo "File $i done!\n";
}
?>


Micro benchmark :
PHP:
1
2
3
4
5
6
7
<?php
for($i = 0; $i <= 10000000; $i++){
    if(false){
        include(($i / 100). ".txt");
    }
}
?>


Execution times :

Require
real 0m7.648s
user 0m7.551s
sys 0m0.012s

Include
real 0m7.635s
user 0m7.600s
sys 0m0.008s

En totaal geen disk usage terwijl hij volgens die manual toch bij de require actie zo'n 100 MB aan files zou moeten openen.

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 16:36
Verwijderd schreef op woensdag 16 november 2005 @ 21:18:
[...]
wat je ook kunt doen is ipv met multiviews werken, index.php/webshop/order vertalen naar de get variablen... ik gebruik de volgende code...
Dat werkt alleen als multiviews aan staat in Apache. Aangezien punten zijn toegstaan in directorynamen zou je anders gewoon een 404 terugkrijgen omdat de directory index.php/ niet bestaat. Je implementatie houdt er bovendien geen rekening mee dat de browser dit gaat intrepeteren alsof dit script in de directory /index.php/module/action/request/ staat waardoor je problemen krijgt met het presenteren van links, generieke javascripts en CSS.

Regeren is vooruitschuiven


  • isomis
  • Registratie: Mei 2005
  • Laatst online: 19-09 21:30
bedankt voro de reacties!!

Webontwikkelaar - Kitesurfer | Gamer


Verwijderd

Dit stond bij de engelse comments
NOTE: This function changed how it worked. In PHP 3 this behaved very differently than it does on PHP 4. Require used to include and parse the file regardless where the require line was positioned.

For example (PHP3):
PHP:
1
  if(false){ require 'file_does_not_exist.php'; }

That code throw a fatal exception even though it's in a conditional block which evaluates to false. In PHP 4 the file is never included or parsed, so no exception is thrown.

For example (PHP4)
PHP:
1
2
  if(false){ require '1_file_does_not_exists.php'; }
  require '2_file_does_not_exists.php';


Stops execution of the script on trying to require the 2nd file...by bypasses the first require.

--JM

[ Voor 6% gewijzigd door Verwijderd op 17-11-2005 09:26 ]


Verwijderd

T-MOB schreef op donderdag 17 november 2005 @ 02:28:
[...]

Dat werkt alleen als multiviews aan staat in Apache. Aangezien punten zijn toegstaan in directorynamen zou je anders gewoon een 404 terugkrijgen omdat de directory index.php/ niet bestaat. Je implementatie houdt er bovendien geen rekening mee dat de browser dit gaat intrepeteren alsof dit script in de directory /index.php/module/action/request/ staat waardoor je problemen krijgt met het presenteren van links, generieke javascripts en CSS.
ja, ik gaaf mijn templates een variable mee {$index_root} (root tot de index.php) en {$cms_root} (root tot de root van index.php). Heb er al tig web applications mee gebouwd, en heb tot nu toe op geen apache server last gehad. Staat multiviews overal standaard aan?
Pagina: 1