Hovednavigation

php.gif

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']='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:

  1. Alle sidder skal hedde noget unikt
  2. 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:


<?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 Eksempler

Læs også: Dynamiske sider med PHP Include - Nu med metatags

Relaterede blogindlæg

Indlægget blev skrevet af Martin d. 13/10, 2007 kl 20:58 og blev sidst rettet d. 09/01, 2008 kl 21:13

Kommentarer

RSS Feed for dette indlæg

GravImg
Skrevet af Jonas
30/04 - 2008 kl. 06:48

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?

GravImg
Skrevet af Martin
30/04 - 2008 kl. 06:48

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

GravImg
Skrevet af Kent
30/04 - 2008 kl. 06:48

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 ?

GravImg
Skrevet af Martin Nielsen
30/04 - 2008 kl. 06:48

evt bare lav en fil i indholdsmappen som ikke indeholder andet end:
<?php include('/sti/til/Foto/index.php');
?>

Så burde du nemt kunne snyde den på den måde

Mvh
Martin

GravImg
Skrevet af Kent
30/04 - 2008 kl. 06:48

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 ?

GravImg
Skrevet af Martin Nielsen
30/04 - 2008 kl. 06:48

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

GravImg
Skrevet af Dennis
30/04 - 2008 kl. 06:48

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

GravImg
Skrevet af Dennis
30/04 - 2008 kl. 06:48

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?

GravImg
Skrevet af Dennis
30/04 - 2008 kl. 06:48

har selv fundet fejlen...
der manglede et $_GET['side']='mappen';
den skal selvfølgelig starte:
<?php
if (empty($_GET['underside']))
{
if (empty($_GET['side']))
{
$_GET['side']='mappen-som-forsiden-ligger-i';
$side='forside'; }

GravImg
Skrevet af Martin
30/04 - 2008 kl. 06:48

Det er selvfølgelig korrekt :) sorry for den lange svartid, har været lidt travl. Eksemplet og download er opdateret.
Mvh
Martin

GravImg
Skrevet af Claus Fischer
30/04 - 2008 kl. 06:48

Kan du ikke lave noget så man kan loade titel fra den side man loader?

GravImg
Skrevet af Martin
30/04 - 2008 kl. 06:47

Det kræver vist en forklaring?

GravImg
Skrevet af Claus Fischer
30/04 - 2008 kl. 06:48

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.

GravImg
Skrevet af Preben Lang
30/04 - 2008 kl. 06:48

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.

GravImg
Skrevet af Martin
30/04 - 2008 kl. 06:48

Glad for det kan bruges, så får man jo lyst til at skrive en masse flere tutorials

GravImg
Skrevet af Preben Lang
30/04 - 2008 kl. 06:48

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.

GravImg
Skrevet af Martin
30/04 - 2008 kl. 06:48

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

GravImg
Skrevet af Preben Lang
30/04 - 2008 kl. 06:48

Ok: Martin. Nu har jeg siddet og fumlet rundt med det du har lavet og det virker perfekt. De eneste fejl der var, var mine slåfejl. MEN: Jeg sad og tænkte at den samme kode som indlæser indholdet kunne vel også bruges til at indlæse relevate undermenuer så de ikke hele tiden er fremme. Men jeg kan ikke rigtig gennemskue det. jeg prøvede at bruge $side = 'side1' og så fremdeles og jeg prøvede at skrive en IF-ELSE funktion til at styre det. meningen er at hvis $side er lig 'side1' så viser vi en undermenu der hedder side1.php, hvis ikke henter den blank.php.

Min ide var at bruge din første tutorial til at styre undermenuerne og den anden til at styre indholdet.

Kan du afse lidt tid til at hjælpe mig på vej?

mvh
Preben Lang

GravImg
Skrevet af Preben Lang
30/04 - 2008 kl. 06:48

Jeg prøvede flg. kode, men uden held:

if ($side = 'side3') {include ('menu/'.$side.'.php');} else {include ('menu/blank.php');}

blank.php er en tom side uden så meget som eet tegn. derfor skulle den ikke ødelægge indtrykket af menuen.
mvh Preben

GravImg
Skrevet af Martin
30/04 - 2008 kl. 06:48

Det kan du sagtens... jeg ville lave en:

<?php 
switch($_GET['side']) {
   case 
'side1':
     
$menu='side1menu.php';
   break;
   case 
'side2':
     
$menu='side2menu.php';
   break;
   case 
'side3':
    
$menu='side3menu.php';
   break;
   default:
    
$menu='standardmenu.php';
   break;
}
include(
sti/til/menuer/.$menu);
?>





Switch er det samme som at lave en lang række if-then-else sætninger, og er ganske meget mere overskueligt når der er mange.

GravImg
Skrevet af Martin
30/04 - 2008 kl. 06:48

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

GravImg
Skrevet af Martin
30/04 - 2008 kl. 06:48

Så er del 3 skrevet som omhandler problemet Claus bragte på banen:

http://martin-nielsen.com/blog/php_include_-_nu_med_metatags-170.html

GravImg
Skrevet af Morten
30/04 - 2008 kl. 06:48

Hej Martin.

Tak for dine rigtig gode artikler, som virkelig har gjort en forskel for mig.

Jeg er ved at lave en ny side, og her har jeg med succes brugt din første artike Dynamiske sider med includes.

Nu har jeg nået et punkt, hvor jeg er gået helt i stå, og jeg har prøvet forskelligt uden held.
Jeg vil skitsere mitproblem, og så vil jeg håbe, du får tid til at give mig et hint.

Min forside består af en top, en bund og så indhold, der varierer alt efter hvilket link man trykker på. mine links ligger fast i toppen af siden - her har jeg anvendt metoden i din første artikel, og det virker perfekt.

Når jeg klikker på Nyheder, kommer nyheder.php til syne i indholdsvinduet - herligt:)
Nu vil jeg gerne have, at der i venstre side af Nyheder fremkommer tre ydereligere links eks indland, udland og aktuelt. Her stopper så festen for mig.

Jeg har prøvet at indsætte dette under indhold:

<?php
switch($_GET['side']) {
case 'nyheder':
$menu='nyheder-menu.php';
break;
case 'info':
$menu='info-menu.php';
break;
default:
$menu='blank-menu.php';
break;
}

include(menuer/.$menu);
?>

ps. hvis ikke jeg sætter anførselstegn før menuer og efter menu i includen virker det ikke.

Når jeg loader siden og klikker på linket Nyheder skrives der:

http://localhost/nymortenhilmer.dk/index.php?side=nyheder

men siden forbliver uforandret..

Håber, du kan afse et øjeblik.

GravImg
Skrevet af Martin
30/04 - 2008 kl. 06:48

Hejsa, det er selvfølgelig mig der har lavet en fejl... include('menuer/'.$menu);

Jeg har lige lavet et eksempel her:
http://www.martin-nielsen.com/eksempler/dynamisk_menu/index.php?side=side2
Hvor side 2 har special menu

Jeg har lagt eksemplet op her i zip:
http://martin-nielsen.com/downloads/dynamisk_menu.zip

HÃ¥ber det kan bruges
Mvh
Martin

GravImg
Skrevet af kim gaba
17/06 - 2008 kl. 23:01

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

GravImg
Skrevet af kim gaba
16/06 - 2008 kl. 22:31

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

GravImg
Skrevet af Martin
17/06 - 2008 kl. 06:38

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?

GravImg
Skrevet af kim gaba
17/06 - 2008 kl. 23:01

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,

GravImg
Skrevet af Martin
17/06 - 2008 kl. 15:00

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

GravImg
Skrevet af kim gaba
17/06 - 2008 kl. 23:05

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!

GravImg
Skrevet af Martin
18/06 - 2008 kl. 08:40

Jeg kan godt lige lave et eksempel en af dagene hvis det er, men ellers er konceptet



<?php
if ($side er en mappe) { 
gÃ¥ ind i mappen 
} else {
indhold fra roden
}
?>




is_dir() kan bruges til formålet


Ny kommentar








Sikkerheds kode





DanskeWeblogs.dk | Samling af de danske blogs