• Basis scheiding tussen html en php code (geen OOP)

    16 May 2010 00:28 door
    Deze tutorial is voor mensen die een aardige basis kennis PHP hebben. Eveneens is het script er als voorbeeld niet om klakkeloos te kopiëren. Noch minatica.be noch ikzelf zijn verantwoordelijk voor mogelijke schade die het script zou kunnen veroorzaken.

    Hoe een scheiding tussen php code en html maken. Deze vraag word mij geregeld gesteld. De eerste vraag die zich dan vormt voor mij is hoe ver wil je hierin gaan. Willen we gebruik maken van OOP (Object-oriented programming) of gewone php gebruiken (die tevens sneller is). Bij deze eerste optie zouden we nog kunnen kiezen voor een MVC aanpak.

    De keuze hierboven hangt vaker af van wat voor mogelijkheden je op de server hebt en hoeveel kennis en tijd je voor het project hebt. Bij een OOP aanpak is er al snel meer tijd nodig en je code zal ook meer van de server vragen hier tegenover staat dan wel dat het achteraf makkelijker uit te breiden is. Alsook dat de code herbruikbaar is voor latere projecten.

    In deze tutorial (zoals ik al in de titel vermeld had) ga ik een voorbeeld geven zonder OOP. Nu het kan zijn dat je geen nut ervan inziet om een scheiding te maken tussen je php en html code. Op het eerste zicht kost het ook enkel meer werk. Maar achteraf kan je makkelijk van website layout wijzigen. Je kan zelfs een designer laten werken aan je webdesign (indien hij basis php kennis heeft).

    Natuurlijk bestaan er ook template systemen die je zo kan downloaden en gebruiken in je php code. Zoals onder andere smarty, deze gaan we hier niet behandelen (misschien een een volgende tutorial).

    Mappenstructuur
    Om een duidelijk overzicht te houden maak ik gebruik van de volgende mappen structuur.

    public_html (root directory waarin je dus je site upload)
    -- applications (hierin zal ons script zich bevinden)
    ----- languages (taal bestanden zodanig dat we kunnen werken met meerderen talen)
    ------- nl (de nederlandse taal spreekt voor zich)
    ---- modules (we maken gebruik modules om een duidelijk structuur te vormen)
    ------ default (dit is de standaard aangeroepen module)
    ---------- 404.php (indien de pagina niet gevonden kon worden)
    ---------- index.php (de voorpagina)
    ------ gebruikers (een extra module om een voorbeeld te geven)
    ---- templates (hierin bevinden zich templates
    ------ default (standaard template)
    -------- default (templates voor module default)
    ---------- 404.php (indien de pagina niet gevonden kon worden template)
    ---------- index.php (de voorpagina template)
    -------- gebruikers (templates voor gebruikers)
    -------- template.php (default template bestand)
    ---- config.php (bevat de website configuratie)
    -- jsscripts (hierin steken we onze javascripts)
    -- library (hierin steken we allerlei handige scripts)
    ---- core-functions.php (deze functies zorgen dat alles netjes kan werken)
    -- media (hierin zullen we afbeeldingen enz neerzetten)
    ---- images (gewone afbeeldingen voor de website zelf)
    ---- templates (benodigde media voor template)
    ------ default (voor het default template)
    -------- images (afbeeldingen van het default template)
    -------- stylesheets
    -- index.php

    Deze structuur zal je waarschijnlijk doen verschieten maar dankzij deze structuur kan je achteraf alles makkelijk terug vinden. We zullen ook niet alle folders gebruiken, deze vormen enkel een basis zodanig dat je het systeem makkelijk kan uitbreiden.

    Voor dat je verder naar onder gaat lezen, wil ik even vermelden dat deze code geschreven is voor deze tutorial. Er kunnen dus nog fouten in zitten neem deze niet letterlijk over voor een project. Je kan hiervan wel de basis gebruiken eveneens. Laten we beginnen met onze index.php.

    public_html/index.php
    We starten hieronder alles op zorgen ervoor dat we zeker errors op het scherm tezien krijgen dit is zeker handig bij het ontwikkelen. Ook roepen we benodigde bestanden op en controleren de binnengekomen data.

    PHP-code:
    <?php
    /**
     * Public release for education purpose
     *
     * @author     Kurt Aerts <info[a]ilabsolutions.net> (replace: [a] with: @)
     */

    # Alle errors weergeven! (uitzetten in productie! dmv E_NONE)
    error_reporting(E_ALL); 

    # Aanzetten output buffer! (normaal niet nodig)
    ob_start();

    # Sessions starten!
    session_start();

    # Aanroepen config bestand!
    require_once('applications/config.php');

    # De core functions belangrijk voor de werking van het systeem
    require_once('library/core-functions.php');

    # Hier kan je je database connectie aanroepen (zorg voor dat database connectie op $_mysql zit dan kan je deze overal bereiken)!
    //require_once('library/database.php');

    # Kijken of taal werd toegewezen?
    if(isset($_GET['lang']) && is_dir('applications/languages/'.$_GET['lang'])) 
    {
        
    # Taal toewijzen!
        
    $_config['language'] =     $_GET['lang'];
        
    $_language $_config['language'];
    }
    # Anders standaard uit config!
    else
        
    $_language $_config['language'];

    # Toewijzen template!
    $_template $_config['template'];

    # Pagina script!
    # Wanneer we een pagina ontvangen gebruiken we deze anders gebruiken we index!
    $page = (isset($_GET['page'])) ? addslashes($_GET['page']) : "default/index";

    # Als de pagina index is gebruiken we frontpage zijn waarde!
    if($page == "index"
        include_once(
    'applications/modules/default/index.php');
    # Wanneer wat anders dan index dan kijken we of die bestaat!
    else
        include_once((
    file_exists('applications/modules/'.$page.'.php')) ? 'applications/modules/'.$page.'.php' 'applications/modules/default/404.php');

    # Einde van output buffer!
    ob_end_flush();

    # Geef output!
    display();

    ?>
    public_html/applications/config.php
    Hier zetten we al wat variables ik heb deze opvoorhand al gemaakt; sommige zullen later niet gebruikt worden.

    PHP-code:
    <?php
    /**
     * Public release for education purpose
     *
     * @author     Kurt Aerts <info[a]ilabsolutions.net> (replace: [a]  with: @)
     */

    # Database
    $_config['sql_host'] = "localhost"// Hostname.
    $_config['sql_dbname'] = 'databasenaam'// Database naam.
    $_config['sql_user'] = 'databasegebruikersnaam'// Database gebruikersnaam.
    $_config['sql_passwd'] = 'indiennodigjewachtwoord'// Database wachtwoord.

    # Template
    $_config['template'] = 'default'// Template zelf!

    # Taal
    $_config['language'] = 'nl'// Standaard taal!

    ?>
    public_html/library/core-functions.php
    Hierin hebben we allerlei functies die we overal kunnen aanroepen waarmee we template kunnen selecteren en dergelijke.

    PHP-code:
    <?php
    /**
     * Public release for education purpose
     *
     * @author     Kurt Aerts <info[a]ilabsolutions.net> (replace: [a]  with: @)
     */

    # Kiezen van het template!
    function setTemplate($template NULL)
    {    
        
    # Global variable
        
    global $_config$_tp;
        
        
    # Kijken of er wat werd mee gegeven en dit ook klopt
        
    if($template != NULL && is_dir('applications/templates/'.$_config['template'].'/'.$template.'/'))
        {
            
    # Weg schrijven naar registry!
            
    $_tp 'applications/templates/'.$_config['template'].'/'.$template.'/';
            
            
    # Alles correct verlopen dus true terug geven!
            
    return TRUE;
        }
        
    # Er werd niks mee gegeven of bestand bestaat niet!
        
    else
            return 
    FALSE;
    }

    # Kiezen van het hoofd template bestand (template.php standaard)
    function setDisplayTemplate($tpDisplay NULL)
    {
        
    # Global variable
        
    global $_config$_tpl_display;
        
        
    # Kijken of er wat werd mee gegeven en dit ook klopt
        
    if($tpDisplay != NULL && file_exists('applications/templates/'.$_config['template'].'/'.$tpDisplay.'.php'))
        {
            
    # Weg schrijven naar registry!
            
    $_tpl_display 'applications/templates/'.$_config['template'].'/'.$tpDisplay.'.php';
            
            
    # Alles correct verlopen dus true terug geven!
            
    return TRUE;
        }
        
    # Er werd niks mee gegeven of bestand bestaat niet!
        
    else
            return 
    FALSE;
    }

    # Kiezen van pagina zijn template standaard niks toegewezen!
    function setPageTemplate($tpPage NULL)
    {
        
    # Global variable
        
    global $_config$_tpl_page;
        
        
    # Kijken of er wat werd mee gegeven en dit ook klopt
        
    if($tpPage != NULL && file_exists('applications/templates/'.$_config['template'].'/'.$tpPage.'.php'))
        {
            
    # Weg schrijven naar registry!
            
    $_tpl_page 'applications/templates/'.$_config['template'].'/'.$tpPage.'.php';
            
            
    # Alles correct verlopen dus true terug geven!
            
    return TRUE;
        }
        
    # Er werd niks mee gegeven of bestand bestaat niet!
        
    else
            return 
    FALSE;
    }

    # Zorgt voor een uiteindelijk output!
    function display()
    {
        
    # variables die global zijn!
        
    global $_template$_language$_tpl_vars$_tp$_tpl_display$_tpl_page;
        
        
    # geen template gezet dus default gebruiken!
        
    if(!isset($_tp))
            
    $_registry['_tp'] = 'default';
            
        
    # Geen display template ingesteld!
        
    if(!isset($_tpl_display))
            
    $_tpl_display 'applications/templates/'.$_template.'/template.php';
        
        
    # wanneer gezet, Oproepen template!
        
    if(isset($_tpl_page))
            include_once(
    $_tpl_display);
    }

    ?>
    public_html/applications/modules/default/index.php
    De voorpagina zal hierin verwerkt worden; zoals je ziet gebruiken we een functie waarmee we een template pagina zetten. Indien dit mislukt stoppen we het script! Eveneens zijn de eerste 3 variables gedefineerd in template.php dus deze zijn zowat verplicht mee te geven. De variable eronder genaamd $_tpl_vars['content'] kunnen we zelf bepalen welke naam we deze geven. Dit zie je ook bij de volgende paginas.

    PHP-code:
    <?php
    /**
     * Public release for education purpose
     *
     * @author     Kurt Aerts <info[a]ilabsolutions.net> (replace: [a]  with: @)
     */

    # Template bestaat en instellen!
    if(setPageTemplate('default/index') == TRUE)
    {
        
    $_tpl_vars['_title'] = 'Hoofdpagina';
        
    $_tpl_vars['_keywords'] = 'wat sleutelwoorden!';
        
    $_tpl_vars['_description'] = 'Een beschrijving!';
        
        
    $_tpl_vars['content'] = 'Test template scheiding!';
    }
    else
        die(
    'Fatal Error: Page Template');

    ?>
    public_html/applications/modules/default/404.php
    PHP-code:
    <?php
    /**
     * Public release for education purpose
     *
     * @author     Kurt Aerts <info[a]ilabsolutions.net> (replace: [a]  with: @)
     */

    # Template bestaat en werd gezet!
    if(setPageTemplate('default/404') == TRUE)
    {
        
    $_tpl_vars['_title'] = '404 Error';
        
    $_tpl_vars['_keywords'] = '404, error, fout';
        
    $_tpl_vars['_description'] = 'Oeps er ging wat mis!';
        
        
    $_tpl_vars['error'] = 'Oeps er ging wat mis! De gezochte pagina kon niet gevonden worden';
    }
    else
        die(
    'Fatal Error: Page Template');

    ?>
    public_html/applications/modules/gebruikers/inloggen.php
    PHP-code:
    <?php
    /**
     * Public release for education purpose
     *
     * @author     Kurt Aerts <info[a]ilabsolutions.net> (replace: [a]  with: @)
     */

    # Template bestaat en werd gezet!
    if(setPageTemplate('gebruikers/inloggen'))
    {
        
    $_tpl_vars['_title'] = 'Inloggen';
        
    $_tpl_vars['_keywords'] = 'inloggen, gebruikers';
        
    $_tpl_vars['_description'] = 'Hier kan je dan inloggen!';
        
        
    $_tpl_vars['text'] = 'Hier kan je dan inloggen!';
    }
    else
        die(
    'Fatal Error: Page Template');

    ?>
    public_html/applications/templates/default/default/index.php
    Ons eerste template bestand hier zie je dat we enkel de het nodigde voor het item weergeven.

    PHP-code:
    <div id="content">
    <?php echo $_tpl_vars['content']; ?>
    </div>
    public_html/applications/templates/default/default/404.php
    PHP-code:
    <div id="content">
    <?php echo $_tpl_vars['error']; ?>
    </div>
    public_html/applications/templates/default/gebruikers/inloggen.php
    PHP-code:
    <div id="content">
    <?php echo $_tpl_vars['text']; ?>
    </div>
    public_html/applications/templates/default/template.php
    Ons hoofd template bestand waarin we de andere oproepen zoals je ziet blijft de code nogal php vrij.

    PHP-code:
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
    <html xmlns="https://www.w3.org/1999/xhtml" xml:lang="nl" lang="nl">

    <head>

        <title><?php echo $_tpl_vars['_title'?></title>

        <meta name="description" content="<?php echo $_tpl_vars['_description'?>" />
        <meta name="keywords" content="<?php echo $_tpl_vars['_keywords'?>" />
        <meta http-equiv="content-type" content="text/html;charset=utf-8" />
        <meta http-equiv="Content-Language" content="<?php echo $_language?>" />

        <meta name="robots" content="index, follow" />
        <meta http-equiv="imagetoolbar" content="no" />

        <link href="/media/templates/default/stylesheets/template.css" rel="stylesheet" type="text/css" />
    </head>

    <body>

    <?php include_once($_tpl_page); ?>

    </body>

    </html>
    Hiermee hoop ik een aantal mensen een ander beeld te hebben gegeven op het scheiden van de php code van de html code. Ik zal deze tutorial binnenkort nog wat verder uitwerken zodanig dat er meer praktische voorbeelden inkomen.

    © 2010 Kurt0015 voor minatica.be
    Reacties 1 Reactie
    1. Spoorzoeker's schermafbeelding
      Spoorzoeker -
      Ik bouw mijn sites tegenwoordig modulair op met de index.php als toonpagina.

      De titel, het menu en de footer worden als module geinclude en de veranderende tekst wordt steeds naar behoefte geinclude in het index.php bestand.
      Zo heb ik op zich één template met steeds wisselende inhoud.

      Ook het webcrawlen wordt hiermee een klein beetje tegengegaan want alles wat er verzameld wordt wordt opgeslagen als index.php. Enige samenhang is dan ver te zoeken!.