[php] include() pas later uitvoeren

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • wacko
  • Registratie: Juni 2000
  • Laatst online: 15-09 14:48
Ik heb min of meer de volgende code:
PHP:
1
2
3
$body = include("page.".$page.".php");
// hier wat andere code
echo $body;


Het probleem is echter de include() die in $body staat al direct wordt uitgevoerd, en niet pas als deze wordt aangeroepen met een echo(). Wat ik dus eigenlijk wil is dat de inhoud van page.$page.php wordt toegekend aan een variabele en dan later kan worden ge-echo()ed.

Ik kan me niet permiteren om gewoon de include() pas wat later neer te zetten.
$body moet ook gewone tekst kunnen bevatten, dus
PHP:
1
eval("include(\"page.\".$page.\".php\");");
is niet echt een optie.

Nu heb ik (uiteraard) gezocht en heb het volgende topic gevonden:

[rml][ php]PHP als variable uitvoeren[/rml]

Hier heb ik de volgende functie uit kunnen halen:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function parsepage($pagetoparse) {

$php_code = ''; 
$fp = fopen($pagetoparse, 'r'); 
while (!feof($fp)) 
$php_code .= fread($fp, 1024); 
fclose($fp); 

ob_start(); 
eval("?>" . stripslashes($php_code) . "<?"); 
$output = ob_get_contents(); 
ob_end_clean();

return $output;
    
}


Dit werkt naar behoren, maar is nogal omslachtig in mijn ogen en lijkt overbodig.

Het enige dat eigenlijk hoeft te gebeuren is de include() niet direct uit te voeren maar wachten tot deze wordt aangeroepen.
Heeft iemand een (betere) oplossing voor mijn probleem?

Acties:
  • 0 Henk 'm!

Verwijderd

Include geeft niet de inhoud terug, vandaar dat je het ook niet op kan slaan. Het is dan idd alleen mogelijk om de inhoud op te vragen. Dit kan ook simpeler met www.php.net/file lijkt me.

Ik begrijp alleen niet waarom je niet gewoon include( "blaat".$var."blaat.php" ) direct aan zou kunnen roepen ipv dat je het eerst in een variabele zet? Of zet anders "blaat".$var."blaat.php" in een var en roep die aan in de include?

Acties:
  • 0 Henk 'm!

  • megamuch
  • Registratie: Februari 2001
  • Laatst online: 08-12-2024

megamuch

Tring Tring!

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
function loadHTMLfile($filename)

{

 $handle = fopen($filename, "r");

 $content = fread( $handle, filesize( $filename ) );

 fclose( $handle );

 return $content;

}


functie ik ik wel is gebruik om file in te lezen

aanroepen via

$content=loadhtmlfile("naamvanjepagina.html.php.blaat");

Verstand van Voip? Ik heb een leuke baan voor je!


Acties:
  • 0 Henk 'm!

  • wacko
  • Registratie: Juni 2000
  • Laatst online: 15-09 14:48
Frank83 schreef op:
Ik begrijp alleen niet waarom je niet gewoon include( "blaat".$var."blaat.php" ) direct aan zou kunnen roepen ipv dat je het eerst in een variabele zet? Of zet anders "blaat".$var."blaat.php" in een var en roep die aan in de include?
Dat heeft te maken met de structuur van m'n website. $body is namelijk in een ander bestand gedefinieerd en wordt aangeroepen in een template bestandje die altijd hetzelfde is. Voor $body gebruik ik onregelmatig òf een lapje tekst òf een externe pagine (include).

megamuch: bedankt voor je code, ziet er alvast efficienter uit; alleen nog eval() toevoegen zodat PHP wordt geparsed?

Acties:
  • 0 Henk 'm!

  • megamuch
  • Registratie: Februari 2001
  • Laatst online: 08-12-2024

megamuch

Tring Tring!

wacko schreef op:
[...]

Dat heeft te maken met de structuur van m'n website. $body is namelijk in een ander bestand gedefinieerd en wordt aangeroepen in een template bestandje die altijd hetzelfde is. Voor $body gebruik ik onregelmatig òf een lapje tekst òf een externe pagine (include).

megamuch: bedankt voor je code, ziet er alvast efficienter uit; alleen nog eval() toevoegen zodat PHP wordt geparsed?
hmm nooit geprobeerd eik met php.. (vandaaar ook de naam loadhtmlfile)

maar je kan (denk ik) nu toch die $content aanroepen via include zodat ie geparsed wordt of ben ik nou gek ?

dus je heb $content.. Daar ga je allemaal dingen mee doen en uiteindelijk kan je dan toch doen include($content) of niet?

gokje dit, want ben nog niet zo heel lang bezig met php...

Verstand van Voip? Ik heb een leuke baan voor je!


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 03:13
Is het echt een probleem als de include direct uitgevoerd wordt? Zoals je je probleem omschrijft lijkt het er namelijk op dat het je niet uitmaakt wanneer die include() precies uitgevoerd wordt, zolang de uitvoer maar in $body komt te staan, zodat je die kan invoegen waar je wilt.

Ik ben benieuwd waarom het onmogelijk is om dat include statement te verplaatsen. Ik zou me geen reden voor kunnen stellen waarom dat onwenselijk zou zijn.

Als work-around zou je output buffering kunnen gebruiken, om de uitvoer van de include() op te slaan in je variabele. Zoiets dus:

PHP:
1
2
3
4
5
6
7
8
ob_start();
include("page.$page.php");
$body = ob_get_contents();
ob_end_clean();

// hier wat andere code

echo $body;

Acties:
  • 0 Henk 'm!

  • wacko
  • Registratie: Juni 2000
  • Laatst online: 15-09 14:48
Soultaker schreef op 14 February 2003 @ 14:07:
Ik ben benieuwd waarom het onmogelijk is om dat include statement te verplaatsen. Ik zou me geen reden voor kunnen stellen waarom dat onwenselijk zou zijn.
Misschien dat ik het met een voorbeeldje duidelijker kan maken:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?
$body = "Dit is de tekst in het document";

//Hier wordt normaal gesproken een template file aangeroepen
//nu even in hetzelfde stuk geplaatst voor het gemak
?>

<html>
<body>

<?
echo $body;
?>

</body>
</html>
Als je nu voor $body een externe pagina wilt en include() gebruikt zal deze direct worden uitgevoerd, dus nog vóór de <html> tag. Daar gaat je layout. En include() verplaatsen zou dus beteken dat de template file zou moeten worden veranderd indien er voor $body een externe ifle moet worden aangroepen, terwijl het juist zo mooi is als daar alleen echo $body; hoeft te staan.

Je workaround met ob werkt trouwens prima, dat was eigenlijk precies waarnaar ik op zoek was. Bedankt :).

[ Voor 16% gewijzigd door wacko op 14-02-2003 14:24 ]


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 03:13
wacko schreef op 14 februari 2003 @ 14:22:
Misschien dat ik het met een voorbeeldje duidelijker kan maken:
Graag :)
Als je nu voor $body een externe pagina wilt en include() gebruikt zal deze direct worden uitgevoerd, dus nog vóór de <html> tag. Daar gaat je layout. En include() verplaatsen zou dus beteken dat de template file zou moeten worden veranderd indien er voor $body een externe ifle moet worden aangroepen, terwijl het juist zo mooi is als daar alleen echo $body; hoeft te staan.
Zoiets vermoedde ik al. Je kan natuurlijk overwegen om dan in plaats van "echo $body;" een of andere functie uit te voeren, waarin je beslist hoe je uitvoer eruit komt te zien.

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
<?php
function output_body()
{
    /* Ga je body outputten; op welke manier dan ook. */

    if( ... )
    {
        // met een include
        include("somepage.php");
    }
    else
    if( ... )
    {
        // of uit een extern document
        $fp = fopen("http://www.someexternalpage.com/");
        fpassthru($fp);
        fclose($fp);
    }
    else
    {
        // of gewoon statische tekst ofzo
         return "something else";
    }
}
?>
<html>
<body>
Dit is de template.

<?php output_body(); ?>

</body>
</html>

[ Voor 7% gewijzigd door Soultaker op 14-02-2003 14:34 ]


Acties:
  • 0 Henk 'm!

  • wacko
  • Registratie: Juni 2000
  • Laatst online: 15-09 14:48
Wellicht dat ik zoiets nog probeer, ziet er in ieder geval wel helder uit.
Bedankt voor de tip :).

Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Even een aanvulling op Soultaker:

't Lijkt mij het handigst om gewoon bij te houden wat voor soort body 't wordt, door op dezelfde manier een variabele (als body) bij te houden
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
<?php
// --------------------------------------------
// constanten / preparatie bestand
define ( 'BODY_TYPE_STRING',     1 );
define ( 'BODY_TYPE_INCLUDE',    2 );
define ( 'BODY_TYPE_READFILE',   3 );
// de default, voor 't geval hij niet gegeven wordt..
define ( BODY_TYPE_DEFAULT, BODY_TYPE_STRING );
define ( BODY_DEFAULT, 'Page has no content ...' );

$body = BODY_DEFAULT;
$body_type = BODY_TYPE_DEFAULT;

// --------------------------------------------
// in je code de body setten:
$body = "woei";
$body_type = BODY_TYPE_STRING;
// of
$body = './php/sjaak.php';
$body_type = BODY_TYPE_INCLUDE;
// of
$body = './html/piet.html';
$body_type = BODY_TYPE_READFILE;

// --------------------------------------------
// met een functie
function output_body ( $body, $body_type = BODY_TYPE_STRING ) { 
    switch ( $body_type ) {
        case BODY_TYPE_INCLUDE:
            include ( $body );  // include bestand, en voer het uit als php
            break
        case BODY_TYPE_READFILE:
            readfile ( $body ); // doet 'tzelfde als dat fpasshtru stukje van Soultaker ;)
            break;
        case BODY_TYPE_STRING:
        // of wat je dan ook maar als default wilt gebruiken, 
        // voor 't geval de functie verkeerd aangeroepen wordt.
        default: 
            echo $body;           
            break;
    }
}

// --------------------------------------------
// en in je template
?>
<html> blahblah <?php output_body ( $body, $body_type );?> blahblah </html>

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • mjax
  • Registratie: September 2000
  • Laatst online: 13:28
megamuch schreef op 14 februari 2003 @ 13:32:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
function loadHTMLfile($filename)

{

 $handle = fopen($filename, "r");

 $content = fread( $handle, filesize( $filename ) );

 fclose( $handle );

 return $content;

}


functie ik ik wel is gebruik om file in te lezen

aanroepen via

$content=loadhtmlfile("naamvanjepagina.html.php.blaat");
Is bovenstaande niet een omslachtige manier om het volgende te doen?
PHP:
1
$content = implode(" ", file($filename));

Acties:
  • 0 Henk 'm!

Verwijderd

drm schreef op 14 February 2003 @ 18:44:
Even een aanvulling op Soultaker:

't Lijkt mij het handigst om gewoon bij te houden wat voor soort body 't wordt, door op dezelfde manier een variabele (als body) bij te houden
Dat is toch wel een extreem voorbeeld ;) en vind dat voorbeeld van Soultaker toch lekker easy en gebruiktelijk, natuurlijk kan je defenieren wat je moet doen aan 't begin van een script maar dat lijkt me alleen erg gepast met een 'groot' script en niet met kleine...
Pagina: 1