Rasmus Skrevet 5. april 2005 Del Skrevet 5. april 2005 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. include_script.zip Lenke til kommentar
Loomy Skrevet 5. april 2005 Del Skrevet 5. april 2005 Dette så veldig bra ut! Digget funksjonen for å finne <title>, vurderer å bruke det på den nye hjemmesiden min Lenke til kommentar
pgdx Skrevet 14. juli 2005 Del Skrevet 14. juli 2005 Hvilke lisens ligger denne under? Lenke til kommentar
phanti Skrevet 15. juli 2005 Del Skrevet 15. juli 2005 (endret) Så ganske greit ut det. Hvilke lisens ligger denne under? Hva har det å si? Endret 15. juli 2005 av phanti Lenke til kommentar
pgdx Skrevet 15. juli 2005 Del Skrevet 15. juli 2005 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
fhugas Skrevet 26. juni 2009 Del Skrevet 26. juni 2009 Tror ikke man skal tenke på lisens her, er jo ikke så veldig avansert, ligger tross alt under hjelp til nybegynnere seksjonen Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå