Defo Skrevet 8. oktober 2013 Del Skrevet 8. oktober 2013 (endret) Hei! Jeg har følgende index.php rammeverk, hvor jeg ønsker å gjøre følgende: - Linkene i <nav> skal sette inn korrekt php fil mellom <section> taggene ved bruk av php sin include. - Det skal være mulig å komme til undersidene i <nav> ved å skrive inn page=1 , page=2 osv. direkte inn i url Har lest og lest, men blir ikke klok på hvordan dette skal gjøres... <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Lorem ipsum</title> <link title="Alternate" type="text/css" rel="stylesheet" href="MyStyle.css"> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script> <script src="script.js"></script> </head> <body> <header> <h1>Velkommen</h1> </header> <nav> <ul> <li><a href="home.php">Home</a></li> <li><a href="audio.php">Audio</a></li> <li><a href="gallery.php">Gallery</a></li> <li><a href="cv.php">Curriculum Vitae</a></li> </ul> </nav> <section> <!--Her skal content legges til ved hjelp av php include--> </section> <footer> <a href="https://soundcloud.com/xxxxxxxx">Mut enim ad minim</a> <a href="https://www.facebook.com/xxxxxxx">Duis aute irure </a> <a href="https://dl.dropboxusercontent.com/xxxxxxxx">Lorem ipsum dolor</a> </footer> </body> </html> Endret 8. oktober 2013 av Defo Lenke til kommentar
Thorbear Skrevet 8. oktober 2013 Del Skrevet 8. oktober 2013 Én måte å løse dette på er å sette opp en array som inneholder de forskjellige menyvalgene med tilhørende php-filnavn og eventuelt menyvalg-navn: $menu = array(array('file'=>'home.php', 'title'=>'Home'), array('file'=>'audio.php', 'title'=>'Audio')); Denne arrayen kan så brukes for å generere menyen: $menuItems = ''; for ($menu as $key => $value) { $menuItems .= '<li><a href="?page=' . $key . '">' . $value['title'] . '</a></li>'; } Og når page finnes i url'en kan det slåes opp i arrayen hvilken php-fil som skal lastes: $page = (int)$_GET['page']; $contentfile = $menu[$page]['file']; Denne filen brukes så med include for å få rett innhold: include($pagefile); Har med vilje bare laget små kodestykker, så kan du heller spørre mer om du ikke finner ut detaljene rundt hvordan de hører sammen Lenke til kommentar
Defo Skrevet 8. oktober 2013 Forfatter Del Skrevet 8. oktober 2013 Takk for svar Er ikke veldig rutinert med PHP syntax enda, så lurer på et par ting: $menu = array(array('file'=>'home.php', 'title'=>'Home'), array('file'=>'audio.php', 'title'=>'Audio')); Såvidt jeg ser, så er dette en array som inneholder to andre array'er med 2 elementer i hver array. Hvorfor er den multidimensjonal? $menuItems = ''; for ($menu as $key => $value) { $menuItems .= '<li><a href="?page=' . $key . '">' . $value['title'] . '</a></li>'; } Hva skjer her? (i uthevet tekst) Skal dette egentlig være en foreach loop? $page = (int)$_GET['page']; $contentfile = $menu[$page]['file']; include($pagefile); Mulig å utdype disse to litt? Lenke til kommentar
Thorbear Skrevet 9. oktober 2013 Del Skrevet 9. oktober 2013 Arrayen er multidimensjonal fordi at du da kan ha én indeks som peker til 2 eller flere verdier, uten å måtte ha flere variabler. I kodeeksemplet vil for eksempel indeksen 0 tilsvare "Home", der du kan hente ut meny-teksten eller filnavnet, alt ettersom hva du trenger. Ja, det skal egentlig være en foreach loop Og her hadde jeg helt glemt at PHP har et eget nøkkelord for foreach, så jeg må bare beklage forvirring og missinformasjon. Det som skjer i denne løkka er at du legger til teksten som trengs for hvert menyelement inn i én variabel. Ved bruk av foreach vil du da få indeksen i $key variabelen og den arrayen som hører til i $value, dette gjør at du slipper å forholde deg til noen tellevariabel som $i, og at løkka alltid vil gå gjennom alle elementer. Den resulterende variabelen kan så brukes for eksempel på følgende måte: <nav> <ul> <?php echo $menuItems; ?> </ul> </nav> Når det gjelder de to siste kodesnuttene: $page = (int)$_GET['page']; $contentfile = $menu[$page]['file']; Når man bare skriver inn en url i nettleseren, så vil det kjøres en GET-spørring mot server med den url'en. Url'en kan inneholde flere deler som forteller serveren hva slags respons som er ønsket, en av disse delene er det som ofte legges mot slutten og begynner med et sprøsmålstegn: http://www.example.com/index.php?a=foo&b=bar I php hentes denne siste delen vanligvis ut gjennom variabelen $_GET, som er en assosiativ array der det som i urlen er før likhetstegnet er nøkkelen, og det som er etter likhetstegnet er verdien. Amperstand-tegnet (&) signaliserer et skille mellom to nøkler, slik at du kan legge til (nesten) så mange du vil.Det første man vanligvis gjør når man skal benytte en verdi i $_GET, men som kodesnutten min ikke inneholder, er å sjekke om nøkkelen man skal hente ut verdien til faktisk finnes i $_GET. Dette kan gjøres med funksjoner som isset() og empty().Noe jeg derimot har tatt med i kodesnutten er casting til integer, altså (int) delen. Dette gjør at du alltid vil få en tallverdi, selv om brukeren skulle finne på å skrive for eksempel "page=nothing+haha".Neste linje i kodesnutten henter ut den tilhørende file-delen fra $menu arrayen vår. Her er det to ting jeg ikke tok med, men som du sikkert ønsker:Det bør legges inn en standardverdi for $contentfile, slik at om det ikke finnes noen page=, så vil du fortsatt vise frem noe innhold. Det bør også sjekkes at nøkkelen gitt av $page finnes i arrayen, selv om vi vet at det er en tallverdi kan brukeren fortsatt finne på å skrive inn "page=99". For å gjøre denne sjekken kan du benytte deg av for eksempel array_key_exist(), eller du kan sjekke tallverdien opp i mot count(). Den siste kodesnutten: include($pagefile); Her var det nok dessverre en liten glipp fra min side igjen, variabelen her skal selvfølgelig være $contentfile, som vi satt tidligere. Skal man være fin på det så er vel heller ikke include en funksjon, en mer utdypende kodesnutt vil da være: <section> <?php include $contentfile; ?> </section> Include vil sette inn koden som er i fila gitt ved $contentfile, slik at du kan legge inn både php og html i innholdsfilene, vær dog oppmerksom på at innholdet i disse filene arver alle variabler fra index.php. Lenke til kommentar
Feh Skrevet 9. oktober 2013 Del Skrevet 9. oktober 2013 (endret) For en vanvittig tungvint måte å produsere en meny på...? For det første er ikke ?page=1, ?page=2 veldig beskrivende for brukeren når han navigerer, fremfor at det står /home eller /audio. For det andre gjør tallene det bare mer komplisert enn det trenger å være. navigation.php <ul> <?php $menuItems=array('home', 'audio'); foreach($menuItems as $item) { echo '<li><a href=?page='.$item.'>'.ucfirst($item).'</a></li>'; } ?> </ul> Lag content.php og inkluder den i <section> området ditt <?php if(!isset($_GET['page'])) { include('home.php'); } else { include($_GET['page'].'.php'); } ?> <nav> <?php include('navigation.php'); ?> </nav> <section> <?php include('content.php'); ?> </section> Dette resulterer i litt mindre og mer forståelig kode, og at brukeren ser hvilken side han er på i adressefeltet, f.eks mysite.com/?page=audio. Det vil også se bedre ut når du skal linke til siden fra f.eks et forum siden det da er totalt intetsigende hvor man kommer, hvis lenken vises som mysite.com/page=1. Men, om du ikke MÅ ha en "fancy" teknisk løsning for å produsere menyen din vil det være mer fleksibelt å bare skrive det som en ren, enkel html liste. Hva skjer når du f.eks finner ut at du skal lage submenus? Hva hvis du skal legge til egne klasser for første og siste menyelement (for styling av borders, background-images e.l.)? Hva hvis du har et menyelement midt inni som du vil fremheve spesielt med en egen highlight klasse? Og for å pirke litt: Index.php filen din er ikke et rammeverk, men en mal/template. Endret 9. oktober 2013 av Feh Lenke til kommentar
Thorbear Skrevet 9. oktober 2013 Del Skrevet 9. oktober 2013 (endret) Kan være enig i at det er mer beskrivende å bruke ord i url'en, men utover det ser i allefall jeg mer positivt på systemer som lages mest mulig dynamisk, der man helst ikke skriver de samme tingene flere ganger. Vil også påpeke: <?php if(!isset($_GET['page'])) { include('home.php'); } else { include($_GET['page'].'.php'); } ?> Her bør det være en eller annen form for innholdsjekking, slik at brukeren ikke kan åpne en hvilken som helst php-fil som befinner seg på nettsida.For eksempel: <?php if(!isset($_GET['page']) || !in_array($_GET['page'], $menuItems)) { include('home.php'); } else { include($_GET['page'].'.php'); } Kan også nevne at om en php-fil ikke er ment å inneholde noe annet enn bare php, så bør avslutningstegnet ?> utelates, slik at det ikke følger med et uheldig mellomrom eller linjeskift på et sted det ikke skal være. Endret 9. oktober 2013 av Thorbear Lenke til kommentar
Feh Skrevet 9. oktober 2013 Del Skrevet 9. oktober 2013 Enig i det at kode bør skrives så dynamisk som mulig for å kunne takle flere behov i fremtiden, men ift. TS sitt nivå vil det være enklest å bare hardkode hele menyen i ren html med mindre han gjør det bare for treningens/kunnskapens skyld. Sjekke om siden faktisk var "lovlig" i arrayet tenkte jeg ikke på en gang, da jeg sjelden/aldri bruker variabler i get operasjoner, stort sett kun beskjeder som ?message_sendt, ?order_confirmed o.l. 1 Lenke til kommentar
Yawa Skrevet 9. oktober 2013 Del Skrevet 9. oktober 2013 (endret) Hvis navigasjonen skal referere til et gitt dokument i en dedikert mappe tror jeg dette kan være en svært lett måte å oppnå dette på: <?php # array med gyldige navigasjonsknapper $_site_pages = array( 'home' => 'Home', 'audio' => 'Audio', 'gallery' => 'Gallery', 'cv' => 'Curriculum Vitae', ); // ?> <!--NAVIGASJON--> <nav><ul> <?php foreach($_site_pages as $url_qv=>$link_name): ?> <li><a href="?page=<?=$url_qv=>"><?=$link_name?></a></li> <?php endforeach; ?> </ul></nav> <!--//--> <!--INNHOLD--> <section role="main"> <?php empty($_GET['page'])?$_GET['page']='home':$_GET['page']=$_GET['page']); // sett en standard-verdi - hvis ingen side er valgt, eller sett en aktuell verdi basert på navigasjons-valget. array_key_exists($_GET['page'],$_site_pages):?include'path/to/pages/'.$_GET['page'].'.pg.php':/*404-NOT-FOUND*/; // sjekk at det blir spurt etter en gyldig side og inkluder denne. ?> </section> <!--//--> Vil forøvrig legge til at en ordinær html.div-tag kan benyttes fremfor html.section i dette tilfellet. Oppdatering: Du bør også sjekke om filen faktisk eksisterer med php.file_exists()-funksjonen. Du kan utvide koden slik: array_key_exists($_GET['page'],$_site_pages):? // sjekk om forespørslen er gyldig file_exists('path/to/pages/'.$_GET['page'].'.pg.php')? // hvis gyldig; sjekk om aktuelt dokument eksisterer include'path/to/pages/'.$_GET['page'].'.pg.php': // hvis dokumentet eksisterer; inkluder dette dokumentet /*404 - dokumentet eksisterer ikke*/: /*404 - forespørslen er ikke gyldig*/; Navigasjonen: Om du ønsker å utheve aktiv meny, kan du legge på en css.klasse. Eks: <li><a href="?page=<?=$url_qv=>" <?=$url_qv==$_GET['page']?'class="active"':''?>><?=$link_name?></a></li> For å forhindre en slik url: domene.tld/?page=home - som er akkurat det samme som: domene.tld kan du utvide denne koden yttereligere ved å gjøre slik: <li><a href="<?=$url_qv=='home'?'/':'?page='.$url_qv=>" <?=$url_qv==$_GET['page']?'class="active"':''?>><?=$link_name?></a></li> OBS! Nå har jeg ikke testet kodene for feilskriving, så det bør nok dobbeltsjekkes... Endret 9. oktober 2013 av Yawa Lenke til kommentar
Defo Skrevet 10. oktober 2013 Forfatter Del Skrevet 10. oktober 2013 Takk for alle tilbakemeldinger Løste det ved hjelp av en hjelpevariabel og en swtich setning: <nav> <ul> <li><a href="index.php">Home</a></li> <li><a href="index.php?page=2">Audio</a></li> <li><a href="index.php?page=3">Gallery</a></li> <li><a href="index.php?page=4">Curriculum Vitae</a></li> </ul> </nav> <?php $page = $_GET['page']; switch($page) { case "2": include ('audio.php'); break; case "3": include ('gallery.php'); break; case "4": include ('cv.php'); break; default: include ('home.php'); break; } ?> Sikkert ikke beste løsningen rent proffesjonelt sett, men funker for denne oppgaven (oppgave på høyskolen) Lenke til kommentar
Yawa Skrevet 10. oktober 2013 Del Skrevet 10. oktober 2013 (endret) å benytte index.php i url'en er helt unødvendig, med mindre ikke hoveddokumentet på nettstedet heter noe annet enn "index.php". domene.tld og domene.tld/index.php samt domene.tld/index.php?page=home vil alle dirigere brukeren til nettstedets hovedside - hvilket ikke er en bra ting med tanke på SEO. (trekker vi inn med eller uten "www" i begynnelsen av url'en, så har du hele 6 identiske linker! - hvilket kan skje hvis noen starter på ditt nettsted ved å skrive www.ditt-domene.tld. Da mottar søkemotorer informasjon om at dette nettstedet kan nåes på følgende adresser: www.domene.tld, domene.tld, www.domene.tld/index.php, domene.tld/index.php, www.domene.tld/index.php?page=home og domene.tld/index.php?page=home) De tallene du benytter ser jeg ikke helt grunnen til - url'en forteller ingenting om innholdet på siden. Men det har kansje ikke noe med oppgaven å gjøre. En siste ting, sånn i farta, er når jeg manuelt legger til et helt random tall i url'en - 6 til eksempel - så vises hovedsiden. Det i og for seg er greit, men det forteller også søkemotorer o.l. at hovedsiden er å finne på denne adressen - hvilket ikke er en god ting igjen. Av den grunn mener jeg at php.switch() ikke er riktig å bruke i denne sammenheng . Men det er kansje bare meg? Endret 10. oktober 2013 av Yawa Lenke til kommentar
Feh Skrevet 10. oktober 2013 Del Skrevet 10. oktober 2013 (endret) Gode poeng ang. SEO og brukervennlighet, Yawa. I tillegg vil TS ha en undefined index: $page siden det ikke sjekkes om page variablen faktisk er satt. Dog, ?page=home vil ikke være en aktuell lenke, siden lenken til Home kun er index.php, og default casen bare er å inkludere home.php uten å legge det i til i adressen. Så med løsningen TS postet sist er det bare url.com og url.com/index.php (og alternativene med www. foran) som er aktuelle lenker til hjemmesiden. For å eliminiere /index.php som en navigerbar url, bør TS heller hardkode inn urlen på lenken til home, altså <a href="www.url.com">Home</a> slik at det ikke står /index.php når folk trykker på Home lenken. Bruk også noen fornuftige navn til lenkene istedenfor tall, så får du + i boka av læreren din. Husker læreren min var helt nazi på brukerlighet og brukervennlighet da jeg hadde web på høyskolen. I tillegg til å sjekke om page variabelen faktisk eksisterer. <nav> <ul> <li><a href="http://localhost">Home</a></li> <li><a href="?page=audio">Audio</a></li> <li><a href="?page=gallery">Gallery</a></li> <li><a href="?page=cv">Curriculum Vitae</a></li> </ul> </nav> <?php if(isset($_GET['page'])) { $page = $_GET['page']; switch($page) { case "audio": include ('home.php'); break; case "gallery": include ('gallery.php'); break; case "cv": include ('cv.php'); break; default: include ('home.php'); break; } } ?> Alternativt kan du sette en variabel som heter $siteurl i header fila di (hvis du har en) slik at den kan endres for andre prosjekter $siteurl = 'domain.com'; <li><a href="<?php echo $siteurl; ?>">Home</a></li> Endret 10. oktober 2013 av Feh Lenke til kommentar
Yawa Skrevet 10. oktober 2013 Del Skrevet 10. oktober 2013 En "/" (slash) fungerer helt fint. <a href="domene.tld"> og <a href="/"> gjør samme nytta. $page = $_GET['page']; er forøvrig unødvendig i eksemplet ditt da denne variablen ikke benyttes flere ganger nedover skriptet - slik jeg ser det i farta... Lenke til kommentar
Feh Skrevet 10. oktober 2013 Del Skrevet 10. oktober 2013 Jupp. Variabelen hang bare igjen fra koden TS skrev. Men, selv pleier jeg å lagre de fleste $_GET/POST/SESSION som variabler med lettere navn uansett, i tilfelle de skal brukes igjen lenger ned i dokumentet, eller i andre filer som inkludes i samme dokument. 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å