Gå til innhold

Avansert dynamisk include (eksperimentell)


Anbefalte innlegg

Har mekket et PHP-program for å inkludere sider dynamisk. Dvs. man har en design-ramme og inkluderer innholdet på en bestemt plass i rammen. På den måten slipper man å inkludere toppen og bunnen av rammen i hver fil.

 

Parameterne til programmet sendes gjennom en GET-request. Dvs. at man kan lage linker med parametrene. Foreløbig er det to parametre som gjelder. 'sub' og 'innhold'.

 

sub spesifiserer mappen innholdet ligger i.

innhold spesifiserer filen som skal inkluderes (uten filetternavn)

 

Med <angitte filetternavn> mener jeg et array som inneholder tillatte filetternavn. Den første som matcher vil bli inkludert.

 

Eksempel på linker

?innhold=test - inkluderer test.<angitte filetternavn>

?sub=hardware - inkluderer hardware/index.<angitte filetternavn>

?sub=hardware&innhold=grafikk -inkluderer hardware/grafikk.<angitte filetternavn>

 

Dersom verken sub eller innhold er spesifisert, inkluderes hovedsiden.

 

Dersom en fil ikke finnes inkluderes 404.html, evt. om denne ikke finnes, skrives det ut en 404 feilmelding.

 

Når en side inkluderes finner programmet automatisk ut hvilken tittel siden har, ved å sjekke h1-taggen i html-koden. (f.eks. <h1>Grafikk</h1> = grafikk.)

 

Denne kan hentes ved å bruke en metode print_title(), slik at man kan skrive den ut i sidens title-tag.

 

--

Kjente problemer:

Dersom det er en PHP-feil (f.eks. parse error) i dokumentet, vil man få en blank side. Dette er på grunn av at jeg benytter Output Control Functions for å hente innholdet i fila som skal inkluderes.

 

index.php

<?php
//innhold*.php må inkluderes
require_once('innhold_v1.0.0.php');
//deretter må man opprette en ny instans av klassen (før output)
$di = new DynamiskInclude();

?><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">

<html>
<head>
<title>Rasmus :: <?php /*Skrive ut tittel*/ $di->print_title(); ?></title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta name="generator" content="jEdit - http://www.jedit.org/">
<style type="text/css">
div#topp { background-color: #DDDDDD; }
div#innhold { background-color: #FFFFFF; }
div#bunn { background-color: #DDDDDD; }
</style>
</head>

<body>
<div id="topp">
<p>
<a href="./">Hovedsiden</a> • 
<a href="?innhold=lorem">Lorem</a> •
<a href="?sub=vestibulum">Vestibulum</a>
</p>
</div>

<div id="innhold">
<?php 
//her blir det dynamiske innnholdet skrevet ut
$di->print_innhold();

//fjerne klassen
unset($di);

?>
</div>


<div id="bunn">
<p>Bunn</p>
</div>

</body>
</html>

 

innhold_v1.0.0.php

<?php
/**
innhold v1.0.0 - dynamisk include av filer
@author Rasmus Toivo Nicolaysen <[email protected]>
Dato: 23. januar 2005
Oppdatert: 2. mars 2005, 7. mars 2005, 5.april 2005

(fjernet litt kommentarer siden det er forklart i posten)

*/
ini_set('implicit_flush',0);

class DynamiskInclude {
//Definer hva som er hovedsiden
var $hovedside = "hoved.php";

//Definer include path. husk forwardslash('/') på slutten. alt innholdet 
//som ligger under denne mappa, med matchende filetternavn, vil være 
//tilgjengelig for inkludering.
var $include_path = "./"; 

//hvilke filetternavn det skal matches på. Bruk det mest brukte 
//filetternavnet først i arrayet (bittelitt raskere).
var $tillatte_filetternavn = array("php","html","htm");	


//Definer hvor i include-dokumentet tittelen skal hentes. h1 er default
var $title_start = "<h1>"; 
var $title_slutt = "</h1>";

//Diverse 404 variabler;)
var $notfound404 = false; //denne skal være false i utgangspunktet
var $notfound_melding = "404 Not Found"; //benyttes i tittel
var $notfound_melding_html ='<h1>404 Not Found</h1><p>Siden finnes ikke</p>';

var $title; //filens tittel
var $innhold; //her lagres filens innhold (ferdig parset)

/**
Konstruktør som setter igang showet. 
@return Boolean true
*/
function DynamiskInclude(){
 if ($_GET['sub']||$_GET['innhold']){
 	$this->do_include($_GET['sub'],$_GET['innhold']);
 }else {
 	$this->set_inc($this->hovedside);
 }
 return true;
}

/**
Finner ut hvilken fil som skal inkluderes og sender videre til set_inc.
Dersom ingen match finnes benyttes 404.html, og false blir returnert.
@param String $mappe (parent)
@param String $filnavn (uten filetternavn)
@return Boolean true/false
*/
function do_include($mappe,$filnavn){
 $include_path = $this->include_path;
 $tillatte_filetternavn = $this->tillatte_filetternavn;
 
 $aktuell_mappe	= basename($mappe);
 $aktuell_fil	= basename($filnavn);
 
 
 #*
 if (!$aktuell_mappe || $aktuell_mappe == "" || $aktuell_mappe == null) { 
 	$aktuell_mappe = $include_path;
 }else {
 	$aktuell_mappe = $include_path.$aktuell_mappe.'/';
 }
 
 #**
 if(!$aktuell_fil) { $aktuell_fil = "index"; }
 
 //selve include uten filetternavn
 $aktuell_include = $aktuell_mappe.$aktuell_fil; 
 
 $faktisk_include = false;
 foreach ($tillatte_filetternavn as $ext) {
 	$temp_inc = $aktuell_include.".".$ext;
 	if (file_exists($temp_inc)) {
   //her bestemmes det hvilken fil som skal inkluderes
   $faktisk_include = $temp_inc;
   break;
 	}
 }
 if ($faktisk_include) {
 	$this->set_inc($faktisk_include);
 	return true;
 }else {
 	$this->set_inc("404.html");
 	return false;
 }
 
}

/**
Definerer hvilken fil som skal inkluderes, parser denne og legger den inn
i variabelen $this->innhold.
@param String filnavn
*/
function set_inc($filnavn) {
 $this->innhold = $this->get_file_contents_parsed($filnavn);
 if (!$this->innhold) { 
 	$this->notfound404 = true; 
 	$this->innhold = $this->notfound_melding_html;
 	$this->set_title($this->notfound_melding);
 }
}

/**
Endrer sidens tittel
@param String $title
*/
function set_title($title){
 $this->title=$title;
}

/**
Skriver ut sidens tittel
*/
function print_title(){
 echo $this->get_title();
}

/**
Finner sidens tittel og returnerer denne.
@return String sidens tittel
*/
function get_title(){
 if ($this->title) {
 	return $this->title;	
 }
 else {
 	$hent_fra = $this->title_start;
 	$hent_slutt = $this->title_slutt;
 	$temp_title="";
 	eregi("$hent_fra(.*)$hent_slutt", $this->innhold, $temp_title);
 	$this->set_title(strip_tags($temp_title[1]));
 	return $this->title;
 }
}

/**
Skriver ut include innhold
*/
function print_innhold(){ 
 echo $this->get_innhold(); 
}

/**
@return String include innhold
*/
function get_innhold(){ 
 return $this->innhold; 
}

/**
Ny utgave av get_file_contents som parser innholdet	før det blir returnert 
som en streng
@param String $filnavn
@return String $contents_parsed
*/
function get_file_contents_parsed($filnavn) {
 ob_start(); 
 $resultat = @include($filnavn);
 $contents_parsed = ob_get_contents(); 
 ob_end_clean();
 if ($resultat) { return $contents_parsed; }
 else { return false; }
}
}
?>

 

Komplett eksempel er vedlagt som fil.

 

Hvis noen har noen forslag til forbedringer hadde det vært fint. :yes:

include_script.zip

Lenke til kommentar
Videoannonse
Annonse
  • 3 måneder senere...
Hvilke lisens ligger denne under?

Hva har det å si?

Det har temmelig mye å si.

 

Er den lisensiert under en lisens som tillater meg å selge koden til kundene mine? Må jeg tillate kundene det samme? Kan jeg installere dette på en slags embedded enhet og gjøre hele systemet om til binære filer og selge det uten å gi tilgang til kildekoden?

 

Det har alt å si.

Lenke til kommentar
  • 3 år senere...

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...