PHP include vraagje
7 april 2011 - 16:29   
geplaatst door: Kapotlood
Hallo allemaal :)

Ik heb (weer eens) een vraagje over PHP, en deze keer over de PHP-include tag. Nu weet ik hoe ik een pagina kan opbouwen met verschillende modules, zodat je uiteindelijk maar kleine delen van je site opnieuw hoeft te laden.

<?php include("footer.php"); ?>

Maar als je bijvoorbeeld de volgende opzet gebruikt, hoe laad je dan andere stukjes in?
Bijvoorbeeld:


<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>Smashing HTML5!</title>
<link rel="stylesheet" href="css/main.css" type="text/css" />
</head>

<body>
<?php include("header.php"); ?>
<?php include("content.php"); ?>
<?php include("footer.php"); ?>
</body>
</html>

Als je hier het PHP-onderdeel "content.php" wil vervangen door "about.php" omdat je van je homepage naar je about-page gaat, hoe kun je dit dan doen? Ik wil in m'n menu als ik op de button "about" klik, dan niet de hele pagina opnieuw te hoeven laden, maar puur het stukje "content.php" vervangen voor "about.php".

Alvast bedankt! :)

Mvg,
Joram

PHP include vraagje
7 april 2011 - 16:33    reactie #1
geplaatst door: willemijngreven
PHP include vraagje
7 april 2011 - 16:37    reactie #2
geplaatst door: Kapotlood
Bedankt voor je linkje, maar ik ben zó nieuw met PHP dat ik daar niet helemaal uit kwam.

Misschien helpt 't als ik wat beter uitleg wat ik wil :) Normaal gesproken maak je een linkje aan waardoor je, als je daarop klikt, een hele pagina laad, zoals "about.html".


<a href="http://www.mijnwebsite.nl/about.html" title="Deze pagina gaat over mij">About</a>

Maar kun je dan met "php include once" alléén include("about.php") laden? Zoals bijvoorbeeld


<a href="http://www.mijnwebsite.nl/about.php" title="Deze pagina gaat over mij">About</a>

Mvg,
Joram

(Bewerkt door joram om 16:38, 7-04-2011)

PHP include vraagje
7 april 2011 - 16:42    reactie #3
geplaatst door: willemijngreven
Hahaha, jouw verduidelijking maakt bij mij niets duidelijker. Dat include once zorgt ervoor dat wanneer je eerder al (via php) een bestand hebt gebruikt, dit niet een tweede keer wordt geladen, maar simpelweg uit het geheugen (of cache) wordt opgediept. Hiermee voorkom je dat er meerdere kopieen van hetzelfde php bestand in het geheugen worden geladen.
PHP include vraagje
7 april 2011 - 16:46    reactie #4
geplaatst door: Kapotlood
Hmm, ik zie 't ja... iets uitleggen wat je zelf ook nog niet helemaal begrijpt is knap lastig soms :D

Nieuwe poging. dit is de pagina die ik heb gemaakt:


<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>Smashing HTML5!</title>
<link rel="stylesheet" href="css/main.css" type="text/css" />
</head>

<body>
<?php include("header.php"); ?>
<?php include("CONTENT.php"); ?>
<?php include("footer.php"); ?>
</body>
</html>

En ik wil via deze pagina navigeren naar m'n about-pagina, waardoor de bovenstaande pagina verandert zou moeten worden naar:


<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>Smashing HTML5!</title>
<link rel="stylesheet" href="css/main.css" type="text/css" />
</head>

<body>
<?php include("header.php"); ?>
<?php include("ABOUT.php"); ?>
<?php include("footer.php"); ?>
</body>
</html>

In feite blijft heel de pagina dus staan zoals hij staat, en wordt alleen content.php vervangen voor about.php.  Dit om laadtijden te verbeteren en de server load te verlichten. Het zou dan eigenlijk werken zoals iFrames vroeger werkten... je vervangt alleen hetgeen je wíl vervangen.

Mvg,
Joram

PHP include vraagje
7 april 2011 - 16:59    reactie #5
geplaatst door: willemijngreven
Vaag, heel vaag begin ik het te volgen :smile:

Jouw idee is (denk ik) dat in de tweede pagina ook al header en footer staan, waardoor die niet meer geladen zouden hoeven worden opdat dat op de eerste pagina al is gedaan. Begrijp ik het zo goed???

Zo ja, dan moet ik je hevig teleurstellen. Een browser kan slechts geheel gevormde pagina's correct weergeven. De php include en include once statements zijn met name bedoeld om (aan de server kant) niet telkens dezelfde php codes in een pagina in te voegen. Zodra we het over html hebben is dat wat anders natuurlijk.

(Bewerkt door willemijngreven om 17:00, 7-04-2011)

PHP include vraagje
7 april 2011 - 17:06    reactie #6
geplaatst door: Cailin Coilleach
Het komt er op neer dat je met conditionele statements gaat werken, afhankelijk van de aangeroepen URL.

IF URL="http://www.bla.nl/xxx"
THEN
  include about.php
ELSE
  include content.php
FI

Maar dan veel netter en ingewikkelder.

Bijvoorbeeld, mijn eigen website hangt volledig samen van één PHP bestand. Elke URL is gebaseerd op index.php, maar wat je te zien krijgt is afhankelijk van waar je je op de site bevindt en welke parameters mee worden gegeven.

/index.php = de start pagina
/Sysadmin/index.php = alles over mijn werk
/index.php?tag=anime = alle blogposts over anime
/index.php?Y=2010&M=11 = alle blogposts uit November 2010
/index.php?id=777 = de "about me" pagina

(Bewerkt door Cailin Coilleach om 17:08, 7-04-2011)

PHP include vraagje
7 april 2011 - 17:07    reactie #7
geplaatst door: Kapotlood
Je begreep het helemaal goed :)
Nou, dan is dat even jammer voor me, hehe.

Ik dacht dat het, net zoals www.lifehacker.com bijvoorbeeld lijkt te doen, met de Include-tag alleen bepaalde onderdelen van een website te kunnen inladen, en dat je dus een basis-pagina hebt waar alle vaste elementen in staan zoals bijvoorbeeld een index.html met daarin het menu, de footer en andere vaste elementen, en dan alleen de content (about, portfolio, intro, contact e.d.) los in te laden.

Mvg,
Joram

PHP include vraagje
7 april 2011 - 17:12    reactie #8
geplaatst door: Cailin Coilleach
Dat kan ook, maar niet exact zoals jij het beschrijft... Tenzij je met hele moderne technieken als AJAX gaat werken.

Maar voor de site die jij noemt werkt het net zo als mijn eigen website: elke pagina wordt gemaakt met exact de zelfde code, maar de inhoud verandert afhankelijk van de URLs en de aangevoerde parameters. Nu is het voor die site en de mijne erg gemakkelijk geworden om heel simpel enorm veel content in te voeren omdat beide sites een database gebruiken waar de content in staat.

Als jouw site nog lekker klein is kan het best simpel worden.


<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>Smashing HTML5!</title>
<link rel="stylesheet" href="css/main.css" type="text/css" />
</head>

<body>
<?php<br>include("header.php");<p>if (isset($_GET['p']) && ($_GET['p']=="about"))<br>{ include("about.html") }<br>elseif (isset($_GET['p']) && ($_GET['p']=="leuk"))<br>{ include("leukedingen.html") }<br>elseif (isset($_GET['p']) && ($_GET['p']=="koekjes"))<br>{ include("koekjes.html") }<br>else<br>{ include("startpage.html")}<p>include("footer.php"); <br>?>
</body>
</html>

Je roept het een en ander dan aan als:
index.php
index.php?p=about
index.php?p=leuk
index.php?p=koekjes

(Bewerkt door Cailin Coilleach om 17:22, 7-04-2011)

PHP include vraagje
7 april 2011 - 17:19    reactie #9
geplaatst door: Kapotlood
Kortom, geen "simpele" beginners-PHP met Includes enzo, maar net even een stapje hoger... dan laat ik dat nog even aan me voorbij gaan, hehe.

Oh, terwijl ik dit tik zie ik dat je dat nog best simpel lijkt te vinden als het om een kleine website gaat. De website waar ik zoiets deze zomer mee wil maken is inderdaad behoorlijk klein. Het gaat om zo'n 3-5 pagina's (home, about, portfolio, contact, en misschien een 5e), dus héél ingewikkeld wil ik 't niet maken. Maar als 't relatief "makkelijk" te doen is, zou je dan eens een voorbeeld/hulpje kunnen laten zien? Dan hoef ik niet telkens elke pagina helemaal opnieuw te maken maar kan ik alleen de content-delen in orde maken. :)

PHP include vraagje
7 april 2011 - 17:21    reactie #10
geplaatst door: Cailin Coilleach
Citaat
Oh, terwijl ik dit tik zie ik dat je dat nog best simpel lijkt te vinden als het om een kleine website gaat.

Ik was nog aan het typen :p Zie de post boven je.
PHP include vraagje
7 april 2011 - 17:26    reactie #11
geplaatst door: Kapotlood
Oh te gek, bedankt! :)

Ik zie dat je "about" 2x noemt, 1x als Include, en 1x als Get... kun je misschien uitleggen waarom en/of wat dat precies doet? Maar als deze code bij mij werkt dan ben ik je eeuwig dankbaar, hehe… dat maakt dingen een heel stuk makkelijker in de toekomst!

Mvg,
Joram

PHP include vraagje
7 april 2011 - 17:33    reactie #12
geplaatst door: Cailin Coilleach
Heb je het stukje onder het code blok ook nog gezien? :)

Wat de beschreven code doet:
1. Kijk of in de URL iets staat als "?p=xxx". P is in dit geval de naam die ik voor de variabele heb gekozen (p als kort voor "page"). Variabelen die via de URL worden aangevoerd heten "GET" variabelen.
2. Bestaat de GET variabele "p", is de waarde dan "about?" Ja? Include about.html. Nee? Ga door.
3. Bestaat de GET variabele "p", is de waarde dan "leuk?" Ja? Include leukedingen.html. Nee? Ga door.
4. Bestaat de GET variabele "p", is de waarde dan "koekjes?" Ja? Include koekjes.html. Nee? Ga door.
5. Geen van alle punten was waar? Include dan startpage.html

Het kan nog veel netter worden geschreven, maar op deze manier is het op beginnersniveau ook te begrijpen.

(Bewerkt door Cailin Coilleach om 17:35, 7-04-2011)

PHP include vraagje
7 april 2011 - 19:28    reactie #13
geplaatst door: Kapotlood
Ah, bedankt weer!

HTML en CSS begrijp ik "aardig"... ik kan er prima met de hand (op de meta-tags en doctype na) een site mee in elkaar zetten. Maar voor mij zijn HTML en CSS hetzelfde als 't leren van afkortingen van gewone woorden, en is PHP echt een taal zoals Grieks of Chinees. Compleet andere koek :biggrin:

Maar het stukje wat je als voorbeeld had aangemaakt is gelukkig nog te volgen. Ik weet niet precies wat en waarom er zoveel haakjes e.d. worden gebruikt, maar dat is de Basis-basis die ik nog eens goed moet/wil leren... maar eerst m'n site de lucht in! ;-)

Mvg,
Joram

PHP include vraagje
7 april 2011 - 22:01    reactie #14
geplaatst door: Cailin Coilleach
Haha :)

Het verschil zit'm dan ook dat HTML en CSS puur talen zijn voor opmaak. Wat je zegt, je gebruikt ze om de layout van iets te beschrijven met redelijk begrijpelijke termen. Maar PHP is toch echt een echte programmeertaal waarmee je op procedurele wijze de computer vertelt wat ie voor jouw moet gaan bekokstoven :)

Opmaaktalen zijn statisch. Met programmeertalen kan je dynamiek brengen waar nodig, om zo de statische code precies zoals jij het wilt te genereren :)

PHP include vraagje
8 april 2011 - 09:34    reactie #15
geplaatst door: Hiker
Als je met Get steeds de goede pagina laat inladen, hoe doe je dat met je Title, Keywords, Description? Ofwel, je metatags in de header?
Nu wordt wel de body aangepast, maar je hebt voor de gehele website dezelfde header.

Ik werk tot dusver ook met een simpele Include voor het menu en de footer, maar per onderwerp heb ik een aparte pagina. Kort door de bocht:
header (variabel),
include menu (vast),
content (variabel),
include footer (vast).

PHP include vraagje
8 april 2011 - 10:01    reactie #16
geplaatst door: Cailin Coilleach
Kijk en dan ga je steeds meer werken richting een CMS of een website met een database backend.

Wederom terug kijkend naar mijn eigen website worden ook dergelijke zaken dynamisch gegenereerd, op basis van database content.

/index.php De front page, met basis TITLE en algemene META tags
/index.php?id=777 De contact page, met contact TITLE en persoonlijke META tags
/Sysadmin/index.php Mijn werk pagina, met werk TITLE en bijbehorende META tags
enz...

Om dat te bereiken kan je natuurlijk de eerder getoonde constructie gaan gebruiken. Maar wat ik al zei, dat moet je niet willen zodra je meer dan (zeg pak'm beet) tien pagina's gaat onderhouden. Hoe dan ook, je past dan de conditionele statements zo aan dat ie niet alleen de content, maar ook de headers e.d. aanpast.

In het geval van mijn website gebeurt dat helemaal niet met include statements. Wat ik al eerder zei, mijn hele site bestaat uit een groot PHP bestand. En afhankelijk van hoe die file wordt aangeroepen worden er verschillende stukken code wel of niet uitgevoerd. De enige stukken die eigenlijk altijd worden uitgevoerd zijn die delen die de grafische banner laden, die de search balk laden, die de sectie headers vertonen en die de copyright melding onderin vertonen. Al het andere is volledig onderhevig aan hoe de pagina wordt aangeroepen.

(Bewerkt door Cailin Coilleach om 10:04, 8-04-2011)

PHP include vraagje
8 april 2011 - 10:01    reactie #17
geplaatst door: Kapotlood
Kun je dat misschien wat uitgebreider uitleggen/laten zien Hiker?
In het geval van mijn website blijven de metatags en de title hetzelfde, maar ik kan me voorstellen dat je dat voor sommige websites juist niet wilt.

Met het voorbeeld van Cailin zou ik alleen de body-content telkens opnieuw maken, maar als ik het goed begrijp heb jij, net als gewoon met html, elke pagina helemaal apart, en stop je alleen de vaste elementen er via een Include in... eigenlijk net omgekeerd van wat ik of Cailin dacht toch? :)

Mvg,
Joram

p.s.: voor mij zou 't ook 't leukst en fijnst zijn als ik een CMS heb, het liefst zoals Wordpress omdat ik daar nog het meest van begrijp. Maar ik heb talloze "newbie" tutorials gezien en gelezen maar kom er nog steeds niet helemaal uit hoe ik mijn html-site goed kan opknippen en kan implementeren in een kale Wordpress-template. Een deel ervan begrijp ik wel, maar er zijn een aantal specifieke dingen zoals het widget-ready maken e.d. waar ik niet uit kom.

(Bewerkt door joram om 10:04, 8-04-2011)

PHP include vraagje
8 april 2011 - 10:22    reactie #18
geplaatst door: Cailin Coilleach
Bijvoorbeeld:


<?php<p>echo "<!DOCTYPE html>\n";<br>echo "<html lang="en">\n":<p>if (isset($_GET['p']) && ($_GET['p']=="about"))<br>{ <br> echo "<head>\n";<br> echo "<meta charset="utf-8" />\n";<br> echo "<title>About me, je weet toch?!</title>\n";<br> echo "<meta blabkalbblasdflsdfjsdf />\n";<br> echo "<link rel="stylesheet" href="css/main.css" type="text/css" />\n";<br> echo "</head>\n";<p> include("about.html") <br>}<br>elseif (isset($_GET['p']) && ($_GET['p']=="leuk"))<br>{ <br> echo "<head>\n";<br> echo "<meta charset="utf-8" />\n";<br> echo "<title>We gaan leuke dingen doen!!</title>\n";<br> echo "<meta echt keigaaf />\n";<br> echo "<link rel="stylesheet" href="css/main.css" type="text/css" />\n";<br> echo "</head>\n";<p> include("leukedingen.html") <br>}<br>elseif (isset($_GET['p']) && ($_GET['p']=="koekjes"))<br>{ <br> echo "<head>\n";<br> echo "<meta charset="utf-8" />\n";<br> echo "<title>Vette recepten voor vette koekjes!</title>\n";<br> echo "<meta vanillechocoladekrenten en haver />\n";<br> echo "<link rel="stylesheet" href="css/main.css" type="text/css" />\n";<br> echo "</head>\n";<p> include("koekjes.html") <br>}<br>else<br>{ <br> echo "<head>\n";<br> echo "<meta charset="utf-8" />\n";<br> echo "<title>In den beginne!</title>\n";<br> echo "<meta toffewebsitevanmij />\n";<br> echo "<link rel="stylesheet" href="css/main.css" type="text/css" />\n";<br> echo "</head>\n";<p> include("startpage.html")<br>} <p>echo "<body>\n";<br>echo "</body>\n";<br>echo "</html>\n";<p>?>

En wederom: het kan -veel- netter en beter en mooier. Maar om het niet te ingewikkeld te maken maar even op deze fiets...

PHP include vraagje
15 april 2011 - 16:37    reactie #19
geplaatst door: Hiker
Joram,
Beetje late reactie, kon niet terugvinden waar ik dit gepost had.

Bijgaand een voorbeeld pagina
Alle definities staan in de stylesheet, de footer bevat ook de afsluitende < /div >< /body >< /html >


< head >
   < meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
   < title>titel van de website</title>
   < meta name="keywords" content="key, words, keywords" />
   < meta name="description" content="voorbeeldsite php-include" />
   < meta name="robots" content="index"/>
  < meta name="robots" content="follow"/>
  < meta name="robots" content="all" />
   <link href="style.css" rel="stylesheet" type="text/css" />
   <meta http-equiv="content-language" content="nl" />
< /head >

< body >

< div id="container" >
           
   < div id="header" >< /div>
    < ?php include("menu_top.html"); ?>

   < div id="content-left">
        < h1>kop< /h1>
< p>tekst< /p>
   < /div content-left>

   < div id="content-right">
        < h1>kop< /h1>
< p>tekst< /p>
    < /div content-right>

< ?php include("footer.html"); ?>

(Bewerkt door Hiker om 16:38, 15-04-2011)

(Bewerkt door Hiker om 16:38, 15-04-2011)

PHP include vraagje
15 april 2011 - 16:58    reactie #20
geplaatst door: willemijngreven
frames waren zo gek nog niet. :blush:
PHP include vraagje
15 april 2011 - 17:10    reactie #21
geplaatst door: yichalal
Joram, wat je wil kan dus niet met html, maar wel met AJAX: voorbeeld klik op living example
PHP include vraagje
15 april 2011 - 17:14    reactie #22
geplaatst door: Kapotlood
AJAX is ook interessant! :) Maar het zou met PHP volgens mij (en aan de posts te zien) ook moeten kunnen... als je een website in "stukjes" kan samenvoegen met PHP (zo verzamelt Wordpress ook de header, content, sidebar e.d.), dan zou je ze ook met PHP of AJAX moeten kunnen laden toch?

Mvg,
Joram

PHP include vraagje
17 april 2011 - 10:51    reactie #23
geplaatst door: Steve07
Uit jouw laatste post maak ik op dat je het verschil tussen PHP en Ajax nog niet begrijpt: beide geven een ander resultaat. PHP doet alles op de server, dus de gebruiker zegt tegen de server dat hij deze pagina wil laden -> dan laat die pagina. Op die manier kan je dus dynamische pagina's maken: een pagina geeft afhankelijk van de input van de gebruiker andere resultaten. Zo kan je dus zorgen dat index.php?p=home de home pagina weergeeft.

Met ajax is dit niet mogelijk. Ajax is een combinatie van client-side en server-side: wanneer er op een knop gedrukt wordt stuur je een request naar de server. Die geeft dan een pagina terug en de inhoud van de huidige pagina verander je door die pagina. Het verschil met de pure PHP methode is dat Javascript vereist is, maar dat de pagina's sneller laden, omdat alleen de inhoud en niet de navigatie etc. geladen hoeven te worden. Ook kan je, als je dat wilt, een animatie invoegen.

Persoonlijk zou ik je aanraden deze twee methodes te combineren. Maak een PHP pagina waarin je afhankelijk van de inhoud van $_GET['p'] een bepaald bestand uit de map includes inlaad. Je kan hiervoor één van de codes die eerder in dit topic genoemd zijn gebruiken, maar persoonlijk vind ik dit mooier staan: :biggrin:

<?php<br>// De toegestane pagina's.<br>$pages = array('default', 'home', 'about', 'contact');<p>// Controleer of &eacute;&eacute;n van die pagina's ingeladen wordt.<br>if (in_array($_GET['p']) {<br>   if (!include('includes/' . $_GET['p'] . '.php')) {<br>      print 'Couldn\'t load the content.';<br>   }<br>} else {<br>   // Een andere pagina (of geen pagina) wordt aangevraagd: laat de default pagina zien.<br>   include('includes/default.php');<br>}<br>?>

Je plaatst de toegestane pagina's in een array en geeft een standaard pagina weer wanneer er geen goede pagina wordt aangevraagd. Als je dit nu met Ajax wil combineren moet je d.m.v. Javascript op het moment dat een er op een link wordt geklikt zeggen dat er i.p.v. het laden van de nieuwe pagina een Ajax request moet worden uitgevoerd. Ik gebruik zelf jQuery (een Javascript library) en daarmee doe je dat met de volgende code:


<script type="text/javascript">
// Functie om de pagina te laden.
function loadPage(page) {
  // Doe de ajax request.
  $.ajax({
     success: function(response) {
        // Deze functie wordt uitgevoerd wanneer de pagina succesvol geladen is. Laat hier nu de content zien.
       $('div#content').html(response);
    
       // Zorg dat de gebruiker niet alsnog doorgestuurd wordt volgens de href tag van de link.
       return false;
    },
     url: 'includes/' + page
  });
}

// Doe pas dingen wanneer de DOM er klaar voor is.
jQuery(document).ready(function($) {
  // Controleer of er een hash in de URL staat -> zo ja: laad die pagina.
  if (window.location.hash) {
     loadPage(window.location.hash);
  }

  // Kijk wanneer er op een navigatie-item geklikt wordt.
  $('ul#navigation a').bind('click', function() {
     // Krijg de url naar de te laden pagina (dezelfde die je ook via PHP inlaad). Ervan uitgaand dat die in de "name" tag staat.
     var page = $(this).attr('name') + '.php';

     // Bewaar de aangeroepen pagina in de hash.
     window.location.hash = '#' + page;

     Laad the pagina.
     loadPage(page);
  });
);
</script>

Nu wordt Ajax gebruikt indien mogelijk, en anders de "gewone" server-side methode. :wink:

(Bewerkt door Frog om 12:35, 17-04-2011)

PHP include vraagje
17 april 2011 - 11:57    reactie #24
geplaatst door: Kapotlood
Ik weet wat AJAX en PHP zijn (grofweg in ieder geval), 't probleem is alleen dat ik geen van beide zelf kan schrijven/begrijpen :)  Vandaar dat de vorige voorbeelden nog nét te begrijpen waren voor me, maar jouw voorbeeld is hoewel hij heel mooi klinkt, een beetje ongrijpbaar voor me, hehe.

Maar waar ik op doelde met m'n vorige pagina is dat ik dacht dat je een stukje pagina (bijvoorbeeld de content van een pagina) met PHP kan inladen om het laden sneller te laten gaan, maar dat je dit ook kunt doen met AJAX. De methoden zijn compleet verschillend, maar voor de gebruiker scheelt 't in beide gevallen laadtijd toch? :)

Mvg,
Joram