Søger du en specifik kategori?

 



Oprettet man. d. 16. februar 2009 kl. 09:31

jensgram
jensgram (38.569 point)
www.jensgram.dk
Guidens karaktér
1
2
3
4
5

At lave en breadcrumb ("Du er her: ")...

Denne artikel gennemgår, hvordan du laver en simpel breadcrumb. Bemærk: Denne artikel indeholder kun eksempler på breadcrumb's fra sites med hierakiske sider (eg: /artikler/20040113.php).
[ Hvad er en breadcrumb? ]
En breadcrumb er en logisk navigation, der viser, hvor man befinder sig på et site. Altså et lille stykke navigation, der kan hjælpe folk til at få overblik over, hvor de befinder sig på et site.

Eksempelvis kan man støde på breadcrumb'en:
"Forside / Web / Objects", hvis man går ind på http://www.jensgram.dk/ (...) . Sammenhængen er her tydelig og overblikket er der hurtigt.
Denne funktion findes på mange sites (fordi den er praktisk og giver gennemskuelighed), men folk opretter til stadighed spørgsmål i PHP-kategorien. Det var så meningen, at denne artikel skulle kaste lidt lys over sagen.


[ Inden vi kommer for godt i gang! ]
Det havde været fedt, hvis Eksperten ville "highlighte" PHP, men det må vi tænke os til ;) Desuden er koden pænere med indrykninger, men de forsvinder også.


[ Hvad skal jeg bruge? ]
Det eneste krav er, at din struktur skal være som i ovenstående eksempel. Altså:
"www.ditdomæne.dk/mappe/måske_endnu_en_mappe/dinfil.php"

Funktionen kan selvfølgelig også laves ved strukturer som
"www.ditdomæne.dk/?page=dinside", men denne kan jo variere meget, så det må vente...


[ Så lad os da begynde! ]
Ja, hvorfor ikke? Jeg går ud fra at du er så meget inde i PHP, at du kender til termer som "funktioner", "argumenter", "variabler" og "array's". Hvis ikke så kig på http://dk.php.net/ (...)

Vi starter med at lave vores funktion:



<?php

function breadcrumb()
{
    $root = 'http://www.ditdomæne.dk/ (...)
}

?>



Så langt, så godt. Det er så tanken, at jeg vil benytte variablen $_SERVER['PHP_SELF'] i selve funktionen til at hente placeringen af selve filen.

Jeg kunne også have valgt at bruge $_SERVER['HTTP_HOST'] i stedet for $root, men lad os nu bare holde fast ved den.

Hvis vi antager, at $_SERVER['PHP_SELF'] indeholder "/web/objects/index.php" så er det jo tydeligt, at vi skal have opdelt denne streng ved "/". Dette klarer explode():



<?php

function breadcrumb()
{
    $root = 'http://www.jensgram.dk/ (...) // Domænet
    $dirs = explode('/', $_SERVER['PHP_SELF']); // Split ved slashes
    $size = sizeof($dirs)-1; // Antal biblioteker
    $outp = '<a href="' . $root . '" >Forside</a >';
    $div  = ' / '; // Streng mellem biblioteker i output
    $fnam = substr($dirs[$size], 0, strrpos($dirs[$size], '.')); // Filnavn (mellem begyndelse af sidste element i $dirs-array'et og (sidste) punktum)

    return $outp;
}

?>



Nu skete der jo en masse, men fortvivl ikke. Der venter forklaring.

$dirs vil (med ovenstående eksempel) være et array som følger:

Array (
    0 => '',
    1 => 'web',
    2 => 'objects',
    3 => 'index.php'
);

Dette skal vi bruge om lidt.

$size indeholder størrelsen af ovenstående array. Vi trækker en fra, da det første element er tom (strengen starter med '/'). Denne variabel skal også bruges snart.

$outp indeholder på nuværende tidspunkt:
'<a href="http://www.jensgram.dk/ (...) >Forside</a >'.
Dette er det link, som jeg altid vil have stående (folk skal jo gerne kunne finde tilbage til forsiden).

$fnam indeholder filnavnet. I dette tilfælde er det:
'index'.
Dette ser måske lidt avanceret ud, men det er meget simpelt. Først henter vi positionen af det sidste punktum i det sidste element i $dirs ('index.php'). Dette gøres med strrpos(). Denne returnerer 5 i dette tilfælde (første bogstav er 0).
Herefter benytter vi substr() til at hente fra tegn nu til tegn 5 ('index'). Så simpelt er det.


[ Lav links til bibliotekerne ]
Nu har vi faktisk alt hvad vi behøver til at løbe gennem bibliotekerne og lave links dertil. Til dette benytter jeg en for()-løkke:



<?php

function breadcrumb()
{
    $root = 'http://www.jensgram.dk/ (...) // Domænet
    $dirs = explode('/', $_SERVER['PHP_SELF']); // Split ved slashes
    $size = sizeof($dirs)-1; // Antal biblioteker
    $outp = '<a href="' . $root . '" >Forside</a >';
    $div  = ' / '; // Adskillelse ved links mellem biblioteker i output
    $fnam = substr($dirs[$size], 0, strrpos($dirs[$size], '.')); // Filnavn (mellem begyndelse af sidste element i $dirs-array'et og (sidste) punktum)

    for ($i = 1; $i < $size; $i++) {
        $outp .= $div . '<a href="' . $root . $dirs[$i] . '/" >' . $dirs[$i] . '</a >'; // Lav adskillelse og link til det aktuelle bibliotek ($dirs[$i])
        $root .= $dirs[$i] . '/'; // Tilføj det aktuelle bibliotek til $root.
    }

    return $outp;
}

?>



For()-løkken starter med at sætte en iterations-variabel ($i) til 1. Dette skyldes, at jeg vil benytte $dirs[$i] og jeg nævnte jo tidligere at $dirs[0] er tom. Desuden benytter jeg $i < $size som betingelse for løkken. Dette betyder, at jeg ikke får det sidste element i $dirs-array'et med (fil-delen), hvilket er meningen nu!

Inden i løkken tilføjes et link til hvert bibliotek til $outp-variablen (denne returneres senere). $div angiver, hvad der skal være i mellem link'ene. I dette tilfælde er det strengen ' / ', men man kan benytte al HTML (billeder etc.).

Vi tilføjer desuden det aktuelle bibliotek til $root, da vi jo skal benytte det til underbibliotekerne osv.


[ Udskriv filnavnet - men ikke alle! ]
Status:
Vores script kan nu returnere:
'<a href="http://www.jensgram.dk/ (...) >Forside</a > / <a href="http://www.jensgram.dk/ (...) >web</a > / <a href="http://www.jensgram.dk/ (...) >objects</a > / '
hvis $_SERVER['PHP_SELF'] indeholder:
'/web/objects/index.php'

Så kommer vi til selve filnavnet. Problemet er dog, at vi måske ikke vil have alle filer vist. For eksempel benytter jeg selv 'index.php' som indeks, hvilket vil sige at /mappe/ henviser til /mappe/index.php. Det kan således være rart at kunne undgår nogle filer, da 'mappe' vil være smartere i en breadcrumb end 'mappe' / 'index'.

Vi opretter derfor et array med "forbudte" filnavne. Vi tjekker så, om den aktuelle fil er deri når vi udskriver linket:



<?php

function breadcrumb()
{
    $root = 'http://www.jensgram.dk/ (...) // Domænet
    $dirs = explode('/', $_SERVER['PHP_SELF']); // Split ved slashes
    $size = sizeof($dirs)-1; // Antal biblioteker
    $outp = '<a href="' . $root . '" >Forside</a >';
    $div  = ' / '; // Adskillelse ved links mellem biblioteker i output
    $fnam = substr($dirs[$size], 0, strrpos($dirs[$size], '.')); // Filnavn (mellem begyndelse af sidste element i $dirs-array'et og (sidste) punktum)
    $hide = array('index', 'default'); // Filernavne, der ikke skal linkes til

    for ($i = 1; $i < $size; $i++) {
        $outp .= $div . '<a href="' . $root . $dirs[$i] . '/" >' . $dirs[$i] . '</a >'; // Lav adskillelse og link til det aktuelle bibliotek ($dirs[$i])
        $root .= $dirs[$i] . '/'; // Tilføj det aktuelle bibliotek til $root.
    }

    if (in_array($fnam, $hide) == false) {
        $outp .= $div . '<a href="' . $root . $dirs[$sizeof] . '" >' . $fnam . '</a >'; // Skriv link til filnavn, hvis det ikke skal skjules
    }

    return $outp;
}

?>



Først og fremmeste har jeg tilføjet array'et $hide. Her kan du selv skrive, hvilke filer der ikke skal vises i din breadcrumb.

Jeg har også tilføjet et if()-statement. Betingelsen er, at filnavnet ($fnam) ikke skal være i array'et $hide. Til dette benyttes in_array().
Er filnavnet tilladt skrives det til $outp-strengen som derefter returneres.

Nu har vi faktisk en funktion, der vil returnere:
"Forside / web / objects", hvis man går ind på http://www.jensgram.dk/ (...)
Vi ser her, hvordan index.php sorteres fra, da navnet 'index' er i $hide-array'et.


[ En sidste finpudsning ]
Ovenstående er næsten hvad vi ønskede. Det ville dog være smart, hvis de forskellige elementer havde store begyndelsesbogstaver og underscores (_) blev lavet til mellemrum i link-teksterne (selvfølgelig ikke i selve link'ene!)

Dette klares med ucwords(), der laver det første tegn i hvert ord stort (uppercase) og strtr() til at ændre underscores til mellemrum. Begge dele sker kun i link-teksterne:



<?php

function breadcrumb()
{
    $root = 'http://www.jensgram.dk/ (...) // Domænet
    $dirs = explode('/', $_SERVER['PHP_SELF']); // Split ved slashes
    $size = sizeof($dirs)-1; // Antal biblioteker
    $outp = '<a href="' . $root . '" >Forside</a >';
    $div  = ' / '; // Adskillelse ved links mellem biblioteker i output
    $fnam = substr($dirs[$size], 0, strrpos($dirs[$size], '.')); // Filnavn (mellem begyndelse af sidste element i $dirs-array'et og (sidste) punktum)
    $hide = array('index', 'default'); // Filernavne, der ikke skal linkes til

    for ($i = 1; $i < $size; $i++) {
        $outp .= $div . '<a href="' . $root . $dirs[$i] . '/" >' . ucwords(strtr($dirs[$i], '_', ' ')) . '</a >'; // Lav adskillelse og link til det aktuelle bibliotek ($dirs[$i])
        $root .= $dirs[$i] . '/'; // Tilføj det aktuelle bibliotek til $root.
    }

    if (in_array($fnam, $hide) == false) {
        $outp .= $div . '<a href="' . $root . $dirs[$size] . '" >' . ucwords(strtr($fnam, '_', ' ')) . '</a >'; // Skriv link til filnavn, hvis det ikke skal skjules
    }

    return $outp;
}

?>




[ Afslutning ]
Nu kan du indsætte en komplet breadcrumb med følgende:



<?php

print breadcrumb();

?>



Nemmere kan det da vist ikke blive?!

Venlig hilsen
- Jens Gram


PS: Jeg ved godt, at det er lidt sent, men vil bare lige gøre opmærksom på, at en formateret version af denne artikel kan findes på http://www.jensgram.dk/ (...)

Skrevet fre. d. 16. januar 2004 kl. 15:31| #1

44fire44 (21.265 point)
Takker for en fed tutorial ;)

Skrevet man. d. 26. januar 2004 kl. 16:40| #2

sandbox (49.750 point)
Simpelt og elegant. Fin artikel

Skrevet fre. d. 12. marts 2004 kl. 22:34| #3

hermandsen (39.278 point)
secoya.dk/
Helt sikkert en læseværdig artikel!! :)

Skrevet tor. d. 15. april 2004 kl. 03:48| #4


Skrevet søn. d. 30. maj 2004 kl. 01:48| #5

googolplex (33.158 point)
Fin artikel.

Skrevet tor. d. 21. oktober 2004 kl. 09:10| #6

Ok artikel, men når man tænker på at antallet af underbiblioteker kraftigt påvirker ens ranking i søgemaskiner, vil en tilgang til "breadcrumb" problematikken være bedre via en database løsning, således man *både* kan have en cool breadcrumb OG søgemaskine venlige url's.

Skrevet tir. d. 03. juli 2007 kl. 23:32| #7

bootup (9.710 point)
Kunne ikke rigtig bruge den da jeg ønskede database styret breadcrumb navigation.
Men fremgår også af beskrivelsen af artiklen at den ikke er til dette :)

Skrevet tor. d. 10. marts 2011 kl. 18:52| #8

e-block (6.923 point)
jeg har i mine filnavne 'ae', 'oe' og 'aa'. hvordan ændrer man dem til 'æ', 'ø' og 'å'?

Skriv en kommentar



Mest populære guides i LAN/WAN

Guidens karakter
!!!Karaktér: 0
14 stemmer
04/02 - 2009
Af: jimjimjam

At lave sin egen ftp.

At lave sin egen ftp er egentlig ikke så svært :) Jeg har lavet en guide!

Log ind

   

   

Seneste guides

Den gode bruger
Adgang til NAS-server via WAN
Kollektion af Batch tutorials (FJERNET)
Tilpas din YouTube afspiller


   




Tips & Tricks fra PC World

Teaser billede

Sådan fjerner du pladskrævende metadata fra dine fotos

Det er langt fra altid, at dine billeders metadata såsom kameramodel og geografisk placering er vigtige at bevare. JPG & PNG Stripper kan luge ud i billedfilerne, så de fylder meget mindre....


Anmeldelser fra PC World

Teaser billede

Test: Superlet bærbar med mange muligheder

Toshiba har med Satellite Z830 skabt en af verdens letteste ultrabooks. Den vejer 1,1 kilo, og computeren på 13 tommer ser på papiret ud til at være en oplagt rejsekammerat. Men den lave vægt har...


Seneste blogindlæg

Teaser billede

Tvangslukke spørgsmål: Hvad er den bedste løsning?

Hej Vi har mange åbne spørgsmål på Eksperten. Vi ville gerne tvangslukke dem - så et spørgsmål efter f.eks. 6 måneder lukkes. Men der er et par uklarheder som ville være gode at få lidt input til:...


Nyheder fra PC World

Teaser billede

Samsung Galaxy S III på vej

Samsungs bedst sælgende smartphone nogensinde får en efterfølger om kort tid.


Nyheder fra Computerworld

Teaser billede

Apple retter hele 51 sikkerhedshuller i Mac OS X

Apple lukker hele 51 sårbarheder i Mac OS X, hvoraf de fleste er kritiske. Se her, hvor hullerne er.


Kurser
Samarbejdspartnere

Udgiver · © 2012 IDG Danmark A/S · Hørkær 18 · 2730 Herlev · Tlf.: 77 300 300 · Fax: 77 300 301 · Brug af personoplysninger