I tutorialen Dynamiske sider med PHP include så jeg på hvordan du nemt kunne lave et website hvor indholdet blev inkluderet i designet således design nemt kunne opdateres uden at skulle rette alle sider. I denne fortsættelse ser vi på selvsamme system, men med undermenuer. Dette er noget som flere har efterspurgt, så det kommer her.
Artiklen her er en viderebygger på Dynamiske sider med PHP include så jeg vil anbefale du læser denne først
Vi lægger hårdt ud med toppen af dokumentet som før så sådan her ud:
<?php
//check om side er sat - hvis ikke skal vi vise forsiden, og $_GET['side'] sættes derfor til forside
if (empty($_GET['side'])) {
$_GET['side']="forside";
}
//sikkerhedscheck
//check om siden eksisterer, hvis ikke sæt side til 404 og sæt header til 404 siden findes ikke
if (!is_file("indhold/".$_GET['side'].".php") || eregi("../",$_GET['side'])) {
$_GET['side']="404";
header("HTTP/1.0 404 Not Found");
}
?>
Her er givetvis et par ændringer, men i første omgang er det dog ikke så slemt. Først og fremmest er vi nødt til at udbygge den første kode så den tager hensyn til underside også. Dette indfører vi en variabel til at holde styr på:
<?php
if (empty($_GET['underside'])) {
if (empty($_GET['side'])) {
$side='forside';
} else {
$side=$_GET['side'];
}
} else {
$side=$_GET['underside'];
}
?>
Ovenstående kode checker først om $_GET['underside'] er sat, hvis dette er tilfælde bliver $side sat til denne, da det så er underside der skal loades i systemet. Hvis underside ikke er sat, tester vi om $_GET['side'] er sat, hvis dette ikke er tilfælde loader vi pr. default forside, og ellers sættes $side til $_GET['side'].
Sikkerhedschecket kræver også en minimal ændring, i stedet for $_GET['side'] indskrives $side:
<?php
if (!is_file('indhold/'.$side.'.php') || eregi('../',$side)) {
$_GET['side']=$side='404';
header("HTTP/1.0 404 Not Found");
}
?>
Og det samme gælder for koden som inkluderer side:
<?php
include('indhold/'.$side.'.php');
?>
Hereter vil alt virke, og links laves som før med:
<a href="index.php?side=side2">Side 2 </a>
Mens underlinks laves på følgende måde:
<a href="index.php?side=side2&underside=side2-1">Underside til side 2</a>
Dette er den simple løsning, hvor alt indhold stadig gemmes i mappen "indhold". Dette giver imidlertid et par problemer:
- Alle sidder skal hedde noget unikt
- Undersider kan inkluderes som almindelige sider hvis navnet på undersiden angives som side= i adressen (eksempel)
Kan du leve med ovenstående, er der ingen grund til at læse videre, hvis ikke kommer her en mulig løsning
En af de mulige løsningerI stedet for at gemme alt indhold i mappen "indhold" laves en mappe for hver side i indholds mappen. Hvis vi fx siger vi har tre menupunkter Side 1, Side2, Side3 og Side2 har følgende undersider: Side 2-1, Side2-2. Vil vi havde 3 mapper med navnene Side1, Side2 og Side3 - i Side1 og Side2 ligger en fil med navnet Side1.php/Side2.php - mens der i mappen Side2 ligger 3 filer: Side2.php, Side2-1.php og Side2-2.php. Her er vi igen nødt til at ændre lidt på PHPen
Vi beholder den samme kode til at tjekke om det er side eller underside der skal loades:
<?php
if (empty($_GET['underside'])) {
if (empty($_GET['side'])) {
$_GET['side']='forside';
$side='forside';
} else {
$side=$_GET['side'];
}
} else {
$side=$_GET['underside'];
}
?>
Sikkerhedstjekket ændrer vi til følgende
<?php
if (!is_file('indhold/'.$_GET['side'].'/'.$side.'.php') || eregi('../',$side)) {
$_GET['side']='404';
$side='404';
header('HTTP/1.0 404 Not Found');
}
?>
Forskellen er at vi her altid går ind i mappen $_GET['side'] samme ændring skal laves hvor vi inkluderer indholdet:
<?php
include('indhold/'.$_GET['side'].'/'.$side.'.php');
?>
Og vupti så er vi klar igen
Jeg håber ikke denne artikel har været for overfladisk, men som altid svarer jeg selvfølgelig på spørgsmål og hjælper gerne, lige som alle eksempler kan downloades herunder.
Downloads EksemplerLæs også: Dynamiske sider med PHP Include - Nu med metatags
sorry for den lange svartid, har været lidt travl. Eksemplet og download er opdateret.