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:
1 2 3 4 5 6 7 8 9 10 11 12 |
<?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å:
1 2 3 4 5 6 7 8 9 10 11 |
<?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:
1 2 3 4 5 6 |
<?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:
1 2 3 |
<?php
include('indhold/'.$side.'.php');
?> |
Hereter vil alt virke, og links laves som før med:
1 |
<a href="index.php?side=side2">Side 2 </a> |
Mens underlinks laves på følgende måde:
1 |
<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øsninger
I 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:
1 2 3 4 5 6 7 8 9 10 11 12 |
<?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
1 2 3 4 5 6 7 |
<?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:
1 2 3 |
<?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
Eksempler
Det kræver vist en forklaring?
Det er selvfølgelig korrekt sorry for den lange svartid, har været lidt travl. Eksemplet og download er opdateret.
Mvh
Martin
Jeg siger tak, det var jo netop lige det jeg skulle bruge, havde ellers prøvet at rette din første tutorial til, men det virkede ikke helt efter hensigten. Kan du ikke på et tidspunkt lave noget kode til en menu, hvor de rigtige undersider vises når man er på den aktive side?
Jo men det kan jeg da godt når jeg lige får tid.
Det er nu ikke så svært igen den dovne og lette løsning er bare at lave en betinget sætning efter hvert hovedmenupunkt der tjekker om $side= menupunktet, hvis ja, vises undersiderne
Det er skide godt
Jeg har dog lidt problemer.. jeg har fx en anden mappe med billede gallery. Og kan ikke få den til at åbne den sti i den include..
mappen hedder "Foto/index.php". hvordan skal man lave det link ?
Takker.
Men man kan ikke linke til "undermapper" ? altså Jeg kunne fx godt tænke mig at lave en mappe under "indhold" der hedder "Sjov" og så ligge alle mine sjov filer derind ?
Hvis du bruger "En af de mulige løsninger" så burde det ikke være noget problem
så skal linket bare være
index.php?side=sjov&underside=sidenSomLinkes
jeg kan ikke få det til at virke med undermapper, ved godt artiklen handler om undermenuer, men jeg mangler en måde at include noget fra en fil i en under mappe
<a href="index.php?lukket/test
altså hvor mappen hedder lukket og filen test.php
har nu brugt dit eksempel og det hele virker jo nu, men den melder fejl på forsiden… det gør din side også… hvad skal man gøre eller hvor skal man ligge forside filen for at det virker?
Kan du ikke lave noget så man kan loade titel fra den side man loader?
Hvis man sætter title på index.php til ABC. Så ville titel på alle de andre sider også være ABC. Jeg tænker her på google. Men jeg har fundet en løsning. Jeg trækker det ned fra min database og viser det med en echo string. Så kunen jeg jo også få keywords og description på.
Håber du forstår.
Jeg fandt selv løsningen.
Smukt arbejde. Det passer perfekt til et par projekter jeg arbejder på for et nogle jeg kender. To firmaer, der har brug for noget bedre end statiske sider, og er lidt for "små" til rigtige CMS’er.
Glad for det kan bruges, så får man jo lyst til at skrive en masse flere tutorials
Til Claus:
Ah på den måde, ja det gør jeg også her selv
Kunne godt være jeg skulle skrive et indlæg omkring dette. For det er som du siger ikke godt for søgemaskinerne
Bare gå i krig, hvis det er php så læser jeg dem. Jeg prøver at lære det, så jeg støvsuger jævnligt nettet for tutorials.
Kan lige tilføje med hensyn til den if du havde lavet deroppe, så er problemet det enkelte = , ved sammenligning bruges ==, da enkelt = angiver en værdi, på den måde ville $side altid være = side3
Håber det hjalp,
ellers skriver du bare
Så er del 3 skrevet som omhandler problemet Claus bragte på banen:
http://martin-nielsen.com/blog/php_include_-_nu_med_metatags-170.html
links hedder self filer! har delt mange af dem op i mapper ind i "indhold" men mine andre filer som ligger i indhold virker ikke! håber meget du kan hjælpe mig
Hej Kim,
Skal lige ha afklaret lidt
Dvs du har en struktur ala:
index.php
INDHOLD
– fil.php
– fil2.php
– MAPPE 1
— side.php
— side2.php
– MAPPE 2
—side5.php
Og du vil tilgå fil og fil2 udenom include systemet eller hvordan?
Hvis du bruger den første løsning her i kan du bare smide dem alle i roden af indhold – ellers skal der kodes lidt om så den tjekker begge dele, og det kan som godt give lidt uventede resultater
hey martin
tak for den fed tutorial! virker perfekt!
efter jeg har fået alle mine links i mappe og det fungere, ville jeg stadig gerne have nogen af dem til at ligge i indhold, så de ikke allesammen behøves og have en mappe? men kan ikke få det til at virke håber du kan hjælpe mig
min struktur ser sådan ud! godt ramt ! fil1 og fil2 vil ikke virke i mit include, ved ikke hvorfor. men min filer skal ligge i mapper f.eks
index.php
INDHOLD
– mappe 1
—fil1.php
-mappe 2
— fil2.php
– MAPPE 3
— side.php
– MAPPE 4
—side.php
skal ligge sådan ellers gider det ikke og kører. ville helst undgå og skulle ligge dem alle i mapper for at det kører med min include,
Jeg kan godt lige lave et eksempel en af dagene hvis det er, men ellers er konceptet
is_dir() kan bruges til formålet
Hej Martin
Jeg er ved at lave en lille hjemmeside, og dine php toturials har været en virkelig stor hjælp. Jeg har forsøgt mig med diverse andre lær-php-guider, men de har allesammen været uforståelige eller for omfattende til mit niveau. Dine toturials havde lige præcis hvad jeg skulle bruge, og var forklaret på en måde så jeg kunne forstå det. Derfor: TAK!
MVH
Anders
Lige en ekstra ting:
Jeg har brugt http://www.firepages.com.au/phpdev5.htm til at teste mine php sider offline, hvilket også har gjort mit liv noget nemmere
Hej Anders, glad for det kan bruges, jeg sigter utroligt meget efter at ramme en tone og et forklaringsniveau så alle kan få gavn af det, primært fordi jeg mener at de fleste ressourcer omkring programmering, ligger niveauer over det emne de skriver om. Tak for linket, den vil jeg lige tage et nærmere kig på.
Selv bruger jeg XAMPP til at teste lokalt, både på arbejde men også hjemme, også noget jeg havde tænkt at dække i et blog indlæg på et tidspunkt.
Link til seneste blogindlæg: Kør de gamle favorit DOS spil med DOSBox
okay ville utrolig gerne prøv hvor den checket begge steder! hvis du har en ide om hvordan må du meget gerne komme med den men ellers så mange tak for hjælpen!
Kanon guider Martin
Undrer mig over følgende kode i "En af de mulige løsninger":
$_GET[‘side’]=’forside';
$side=’forside';
Jeg troede ikke man kunne assigne værdi til en $_GET-variabel !?
Er de de to variabler $side og $_GET[‘side’] ikke de samme?
Hvis du får tid en dag ville det være fantastisk med en guide til hvordan man automatiserer highlightning af det menupunkt man er på.
Hvis man fx. er på side 2-1 (http://www.martin-nielsen.com/eksempler/dynamisk2/index.php?side=side2&underside=side2-1) ville det menupunkt blive understreget automatisk.
Keep trucking
Martin, du er min frelser!
I love you. Har læst utrolig mange artikler om php, men dit er simpelhen utroligt. Man fatter det med det samme. Håber du en dag vil udgive artikler om hvordan man laver hele sider med login, chat, forum osv.
Mange tak christopher, glad for det kan bruges og er forståeligt.
@Rasmus, undskyld jeg aldrig fik svaret dig hvis du stadig følger med her, fik aldrig en mail omkring et nyt indlæg.
For at svare på dit spørgsmål – du kan sagtens asigne en $_GET, alle variabler kan sådan set tildeles en værdi og omdefineres (bort set fra konstanter)
Link til seneste blogindlæg: Problemer med ini_set og upload_max_filesize i PHP
Super fed guide! virkelig! men jeg har et problem med at få vist min 404 side. Du har det helt samme problem i din eksempel "http://www.martin-nielsen.com/eksempler/dynamisk2/index.php?side=side4" her burde din fejlside komme op, men det gør den ikk? i stedet skriver den at den efterspurgte fil ikke findes? hvad er fejlen? den samme fejl er der i det eksempel man kan downloade.
Mvh. Mathias
Nu har jeg forsøgt mig med eksempel 2. Men spekulerer på, kan det lade sig gøre at den mappe man lægger filen i hedder noget andet end præcis det samme som selve filen? I så fald, hvad kræver det af kode?
Mvh. Mathias
Tak for rettelsen, den havde jeg lige overset det skulle være rettet nu både i indlægget, downloaden og eksemplet.
Link til seneste blogindlæg: Problemer med ini_set og upload_max_filesize i PHP