Nieuwe BellewaerdeFun bijna online. Of toch niet?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Sam Clauw

Sam Clauw

16/06/2011 08:41:20
Quote Anchor link
Hallo iedereen,

ik heb enkele jaren terug een website ontwikkeld waarin ik m'n interesse aan Bellewaerde Park naar buiten probeer te brengen: www.bellewaerdefun.be

Apetrots was ik toen ik dit ontwerp aan de buitenwereld kon tonen, maar een goede twee jaar later vond ik er helemaal niets meer aan. Ondertussen ben ik volop bezig met de ontwikkeling van een nieuwe versie. Van het ontwerp ben ik best wel tevreden: beta.bellewaerdefun.be.

Zoals jullie kunnen zien heb ik al heel wat pagina's voor deze website gemaakt. Ik zit echter nog met een knagend gevoel over mijn manier van werken tot nu toe, en dat is meteen de reden waarom ik jullie hulp in probeer te roepen.

Ik probeer het zo goed mogelijk voor jullie uit te leggen!

1) Hoe de opbouw van de meeste menu pagina's van de beta website in elkaar zit

Ik heb alle pagina's die je in het menu te zien krijgt, in een kleine (tot nu toe nutteloze) tabel gestopt:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
--------------------------------------------------------------------------------------------------
-----id----title--------parent--------weight-----active-----link-----keywords-----description-----
--------------------------------------------------------------------------------------------------
-----1-----Home---------0-------------1----------1------------------------------------------------
-----2-----Nieuws-------0-------------2----------1------------------------------------------------
-----3-----Het park-----0-------------3----------1------------------------------------------------
-----4-----Info---------0-------------4----------1------------------------------------------------
-----5-----Media--------0-------------5----------1------------------------------------------------
-----6-----Forum--------0-------------6----------1------------------------------------------------
-----7-----Links--------0-------------7----------1------------------------------------------------
-----8-----About us-----0-------------8----------1------------------------------------------------
-----9-----Contact------0-------------9----------1------------------------------------------------
--------------------------------------------------------------------------------------------------


Bovenstaande pagina's worden via mysqli en php opgeroepen zodat ik m'n menu bovenaan de website krijg:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?php

$menu
= new mysqli(MYSQL_SERVER,MYSQL_USER,MYSQL_PASS,MYSQL_DB);

$sql = "SELECT id, title, parent, weight, active, link, keywords, description FROM pages WHERE active = 1 ORDER BY weight ASC";

if(!$result = $menu->query($sql)){
    trigger_error('Fout in query:' . $menu->error);
}
else{
    $i = 1;
    while($row = $result->fetch_assoc()){

        // Spaties in de URL vervangen door koppeltekens
        $title = str_replace(' ', '-', $row['title']);
        // URL omzetten naar kleine letters
        $title = strtolower($title);
        
        // Pagina actief?
        if(strstr($page, $title)){
            echo '<li class="active"><a href="/' . $title . '" title="' . $row['title'] . '">' . $row['title'] . '</a></li>' . "\n";
        }
else{
            if($title == 'forum'){
                echo '<li><a class="forumPopup" href="http://www.bellewaerdefun.be/forum" title="">' . $row['title'] . '</a></li>' . "\n";
            }
else{
                echo '<li><a href="/' . $title . '" title="' . $row['title'] . '">' . $row['title'] . '</a></li>' . "\n";
            }
        }

        $i++;
    }
}


$menu->close();

?>


De waardes voor de kolom "link", "keywords" en "description" zijn momenteel leeg, in het derde onderdeel probeer ik dit verder uit te leggen.

Mijn FTP/bestandenstructuur ziet er als volgt uit:

css
-----> bellewaerdefun.css
-----> content.css
-----> ...

images
-----> ...

includes
-----> config.inc.php
-----> foot.inc.php
-----> head.inc.php
-----> highlights.inc.php
-----> right.inc.php

js
-----> bellewaerdefun.js
-----> jquery-1.5.1.min.js
-----> ...

libs
-----> class.phpmailer.php
-----> class.weather.php
-----> class.xmlParser.php

.htaccess
about-us.php ------> (/about-us)
attracties.php ----> (/het-park/attracties)
contact.php -------> (/contact)
diensten.php ------> (/diensten)
dieren.php --------> (/het-park/dieren)
disclaimer.php ----> (/disclaimer)
diensten.php ------> (/info/diensten)
evenementen.php ---> (/het-park/evenementen)
geschiedenis.php --> (/het-park/geschiedenis)
het-park.php ------> (/het-park)
index.php ---------> (/ of /home)
info.php ----------> (/info)
kalender.php ------> (/info/kalender)
ligging.php -------> (/info/ligging)
links.php ---------> (/links)
media.php ---------> (/media)
nieuws.php --------> (/nieuws)
parkplan.php ------> (/info/parkplan)
shows.php ---------> (/het-park/shows)
tarieven.php ------> (/info/tarieven)

De file index.php en alle andere pagina's in de root map worden via eenzelfde stramien opgebouwd: include eerst head.inc.php, plaats daarna de content en include vervolgens right.inc.php en foot.inc.php. In de file head.inc.php wordt overigens de config file geïncluded (config.inc). Dit bestand bevat onder andere de databasegegevens, de __autoload functie en een tweetal andere functies.

Het .htaccess bestand ziet er als volgt uit:

Quote:
Options +FollowSymLinks
RewriteEngine On
RewriteBase /

RewriteRule ^home$ index.php
RewriteRule ^forum$ forum/index.php
RewriteRule ^([^/\.]+)$ $1.php
RewriteRule ^nieuws/([^/\.]+)/([0-9]+)/([0-9]+)/([^/\.]+)$ nieuws.php?y=$1&m=$2&d=$3
RewriteRule ^het-park/attracties/([^/\.]+)$ attracties.php?attractie=$1
RewriteRule ^het-park/dieren/([^/\.]+)$ dieren.php?dier=$1
RewriteRule ^het-park/geschiedenis$ geschiedenis.php
RewriteRule ^het-park/shows$ shows.php
RewriteRule ^info/ligging$ ligging.php
RewriteRule ^info/parkplan$ parkplan.php
RewriteRule ^info/tarieven$ tarieven.php
RewriteRule ^info/diensten$ diensten.php


2) Hoe de opbouw van de "item pagina's" van de beta website in elkaar zit

Met item pagina's bedoel ik: pagina's die uitgebreide informatie geven nadat je op een "lees meer" geklikt hebt in een overzichtspagina. In mijn voorbeeld zijn dat bijvoorbeeld de pagina's "attracties.php" en "dieren.php". Ik check bovenaan de pagina of er op de "lees meer" knop geklikt werd. Indien "ja", dan toon ik de info over de betreffende keuze. Indien "nee", dan toon ik een overzichtslijst. Hier zijn de tabellen die betrekking hebben tot de attracties:

Tabel "attractions"

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
------------------------------------------------------------------------
-----id----name------------intro--------extra-----active-----detail-----
------------------------------------------------------------------------
-----1-----Boomerang------------------------------1----------1----------
-----2-----Los Piratas----------------------------1----------1----------
-----3-----4D cinema------------------------------1----------1----------
-----4-----El Toro--------------------------------1----------1----------
-----5-----El Volador-----------------------------1----------1----------
-----...---...------------------------------------...--------...--------
------------------------------------------------------------------------


Tabel "attraction-property-types"

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
-------------------------------
-----id----type----------------
-------------------------------
-----1-----Type----------------
-----2-----Subtype-------------
-----3-----Constructeur--------
-----4-----Decorateur----------
-----5-----Constructiejaar-----
-----...---...-----------------
-------------------------------


Tabel "attraction-properties"

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
----------------------------------------------------------------------
-----id----attraction_id-----property_id-----value--------------------
----------------------------------------------------------------------
-----1-----1-----------------1---------------Rollercoaster------------
-----2-----1-----------------2---------------boomerang----------------
-----3-----1-----------------3---------------Vekoma-------------------
-----4-----1-----------------5---------------1984---------------------
-----5-----1-----------------9---------------760 personen per uur-----
-----...---...---------------...-------------...----------------------
----------------------------------------------------------------------


En hier is de code van de pagina om de attracties te tonen:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
<?php

if(isset($_GET['attractie'])){
    $id = $_GET['attractie'];

    $attraction = new mysqli(MYSQL_SERVER,MYSQL_USER,MYSQL_PASS,MYSQL_DB);

    if(mysqli_connect_errno()){
        trigger_error('Fout bij verbinding: ' . $attraction->error);
    }

    
    $sql = "SELECT        attractions.name,
                        attractions.intro,
                        attractions.extra
            FROM        attractions
            WHERE        attractions.id = '"
. $id . "
            '"
;
    
    if(!$result = $attraction->query($sql)){
        trigger_error('Fout in query: ' . $attraction->error);
    }
else{
        $row = $result->fetch_assoc();
        
        $attractieKort = urlNotatie($row['name']);
        
        echo '<h2>' . $row['name'] . '</h2>';
        
        echo '<p>' . $row['intro'] . '</p>';
        
        $dir     = 0;
        $files   = 0;
        $dirname = 'images/attracties/thumbs/' . $attractieKort . '';

        if($handle = opendir($dirname)){
        
            while(false !== ($file = readdir($handle))){

                if($file != '.' AND $file != '..'){

                    if(is_dir($dirname."/".$file))
                        $dir++;
                    else
                        $files++;

                }
            }
        }


        closedir($handle);

        //echo $files." files, en ".$dir." mappen in: ".$dirname;
        
        $teller = 0;
        
        if($files > 0){
            echo '<h3>Foto album</h3>';
            echo '<p id="grotere-fotos">Klik op de foto\'s voor een groter formaat</p>';
        
            echo '<ul class="foto-album overflow">';
            for($teller = 1; $teller <= $files; $teller++){
                echo '<li><a rel="' . $attractieKort . '" href="/images/attracties/photos/' . $attractieKort . '/' . $teller . '.jpg" title="' . $row['name'] . ' Bellewaerde Park"><img class="foto_attractie" src="/images/attracties/thumbs/' . $attractieKort . '/' . $teller . '.jpg" alt="' . $row['name'] . ' Bellewaerde Park" title="' . $row['name'] . ' Bellewaerde Park" /></a></li>';
            }

            echo '</ul>';
        }

        
        echo '<h3>Technische fiche</h3>';
        
        ?>


<ul class="technische-fiche">
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
            
            $sql
=     "SELECT     attraction_properties.property_id,
                                attraction_property_types.type,
                                attraction_properties.value
                    FROM         attractions
                    LEFT JOIN    attraction_properties ON attractions.id = attraction_properties.attraction_id
                    LEFT JOIN    attraction_property_types ON attraction_properties.property_id = attraction_property_types.id
                    WHERE        attractions.id = '"
. $id . "'
                    ORDER BY    attraction_properties.property_id
            "
;
            
            if(!$result = $attraction->query($sql)){
                trigger_error('Fout in query: ' . $attraction->error);
            }
else{
                $teller = 0;
                while($kenmerk = $result->fetch_assoc()){
                    echo '<li><dfn>' . $kenmerk['type'] . '</dfn><span>' . $kenmerk['value'] . '</span></li>';
                }
            }

            ?>

</ul>

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
        
        if($row['extra'] != ''){
            echo '<h3>Leuke weetjes</h3>';
            echo $row['extra'];
        }

        
?>


Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php include_once('includes/addthis.inc.php'); ?>


<p><a class="vorige" href="/het-park/attracties#
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php echo $attractieKort; ?>
" title="Attracties Bellewaerde Park">Ga naar het attractie overzicht</a></p>

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php

    }
}
else{

?>


<h2>Attracties Bellewaerde Park</h2>

<div class="overflow">
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
<?php

$attracties
= new mysqli(MYSQL_SERVER,MYSQL_USER,MYSQL_PASS,MYSQL_DB);

if(mysqli_connect_errno()){
    trigger_error('Fout bij verbinding: ' . $attracties->error);
}


$sql = "SELECT        attractions.id,
                    attractions.name,
                    attractions.intro,
                    attractions.active,
                    attractions.detail
        FROM        attractions
        ORDER BY    attractions.id
        ASC
        "
;

if(!$result = $attracties->query($sql)){
    trigger_error('Fout in query: ' . $attracties->error);
}
else{
    $teller = 0;
    while($row = $result->fetch_assoc()){
        $attractie = urlNotatie($row['name']);
        
        if($teller % 2 == 0){
            echo '<div class="park-item"><a name="' . $attractie . '"></a>' . "\n";
        }
else{
            echo '<div class="park-item last"><a name="' . $attractie . '"></a>' . "\n";
        }

        
        if($row['active'] != 1){
            echo '<a href="/het-park/attracties/' . $attractie . '" title="' . $row['name'] . ' Bellewaerde Park"><img class="demolished" src="/images/demolished.png" alt="' . $row['name'] . ' Bellewaerde Park" title="' . $row['name'] . ' Bellewaerde Park" /></a>' . "\n";
        }

        
        if($row['detail'] == 1){
            echo '<a href="/het-park/attracties/' . $attractie . '" title="' . $row['name'] . ' Bellewaerde Park"><img src="/images/attracties/' . $attractie . '.png" alt="' . $row['name'] . ' Bellewaerde Park" title="' . $row['name'] . ' Bellewaerde Park" /></a>' . "\n";
        }
else{
            echo '<img src="/images/attracties/' . $attractie . '.png" alt="' . $row['name'] . ' Bellewaerde Park" title="' . $row['name'] . ' Bellewaerde Park" />' . "\n";
        }


        echo '<h3>' . $row['name'] . '</h3>' . "\n";
        echo '<p>' . $row['intro'] . '</p>' . "\n";
        
        if($row['detail'] == 1){
            echo '<p><a class="lees-meer" href="/het-park/attracties/' . $attractie . '" title="' . $row['name'] . ' Bellewaerde Park">Lees meer</a></p>' . "\n";
        }

        
        echo '</div>' . "\n";
        $teller += 1;
    }
}


$attracties->close();

?>

</div>

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php

}

?>


Alle andere pagina's met items (bijvoorbeeld de pagina "dieren") hebben een soortgelijke opbouw zoals de attracties. 3 tabellen waaruit de gegevens komen dus. Ik hoop dat ik jullie voldoende geïnformeerd heb over hoe deze website opgebouwd werd. Nu komt het moeilijkste punt er aan ;)

3) Wat ik anders en beter wil en wat ik wil bereiken

Zoals jullie in de php code hierboven kunnen zien, heb ik mijn php code gemixed in mijn HTML code. Hoewel ik ervan bewust ben dat dit niet goed is, leek ik niet meteen een andere keuze te hebben gezien mijn kennis niet verder reikt om dit op een andere manier te doen.

Wat ik nu écht wil bereiken is het volgende: ik had graag dat de title, meta keywords en meta description allemaal uit de database komen. Het principe voor de gewone pagina's lijkt eenvoudig: in head.inc.php een connectie leggen met de database, een sql runnen en de gegevens uit de tabel "menu" te halen. Voor de "item" pagina's ligt het echter anders. Deze zijn helemaal niet terug te vinden in de tabel "menu", maar wél in de tabel "attractions".

Ik had dus graag bij het laden van de pagina een array gekregen met alle pagina info er in: pagina naam, titel, keywords, description, ... Volgens mij is de beste oplossing om OOP te combineren met Smarty ofzo. Ik zocht ondertussen heel wat websites af om een goede manier van werken te vinden, maar nergens (echt nergens) wordt dit eens uitgebreid uitgelegd. Ik hoop dat ik dit via deze manier misschien wat uitgelegd kan worden!

Tips over de website juich ik met mijn volle 100% motivatie toe! Ik hoor dus graag kritische opmerkingen over mijn opbouw, want ik wil het écht gaan verbeteren. Ik wil jullie alvast bedanken voor het lezen van deze super lange post en voor jullie eventuele reacties, écht waar!
Gewijzigd op 16/06/2011 08:44:25 door Sam Clauw
 
PHP hulp

PHP hulp

24/10/2020 13:28:20
 
Arjan -

Arjan -

16/06/2011 11:37:44
Quote Anchor link
Wat ik altijd gebruik is een zogeheten bootstrapper. Hiermee parse je de url's die binnen komen en onderscheid je de controller van de action en een eventuele id.

Hierdoor heb je maar één rewriterule nodig in je htaccess bestand en gebruik je php om de url's te parsen.

Een voorbeeld:

.htaccess:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule .* /index.php?%{QUERY_STRING}


Hiermee sluis je alles door naar index.php, waarbij je in dit bestand de bootstrapper laat en middels onderstaand (simpistisch) voorbeeld de url parsed:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
$pathinfo
= parse_url($_SERVER['REQUEST_URI']);
                
            if($pathinfo) {
                
                $pathinfo['path'] = strtolower ( trim ( $pathinfo['path'] , '/' ) );
                
                $parts = explode ( '/', $pathinfo['path']);
                
                $path = array();
                
                $path['controller'] = ( current ( $parts ) ) ? array_shift ( $parts ) : 'home';
                $path['action'] = (current ( $parts ) ) ? array_shift ( $parts ) : 'index';
                $path['id'] = (current ( $parts ) ) ? array_shift ( $parts ) : '0';

                if(isset($pathinfo['query'])) {
                    
                    parse_str($pathinfo['query'], $querystring);
                    
                    if(is_array($querystring))
                        $path['query'] = $querystring;
                    
                }


                print_r($path);
            }

?>


Dit is een versimpelde weergave van het geheel, maar het gaat om het principe. Deze kan je dan in bootstrapper class gebruiken en de nodige gegevens ophalen.

De controller is het bestand dat wordt geïnclude. Met deze controller zou je ook eventueel gegevens uit de database kunnen halen. De action geeft aan wat je wilt doen (bekijken, wijzigen, verwijderen, etc.) en de eventuele id geeft uiteraard aan om welk item het gaat.

Op deze manier heb je een overzichtelijke structuur (naar mijn inziens).

Voor een dergelijke website als die van jou kan je volgens mij goed uit de voeten met smarty (client side en server side gescheiden!). Smarty levert vooral veel op bij grotere, complexere websites, aangezien Smarty zelf ook redelijk uitgebreid is.

En inderdaad is OOP een goede manier om gestructureerd te werk te gaan, maar let wel op dat het enige tijd duurt voordat je echt OOP kunt programmeren. Maar deze website is hiervoor wellicht een goede opstap. Het belangrijkste is om overzicht te houden en gestructureerd te werk te gaan!

Succes!
Gewijzigd op 16/06/2011 11:38:23 door Arjan -
 
Sam Clauw

Sam Clauw

16/06/2011 17:03:27
Quote Anchor link
Hallo Arjan,

als ik het goed begrijp, dan is de opbouw van mijn huidige .htaccess de oorzaak van m'n probleem? Ik ben alvast wat online cursussen aan't zoeken om het voorgestelde script te kunnen snappen (tot nu toe zitten er nog heel wat onduidelijkheden in). Ik wil je nu al héél erg bedanken voor je uitgebreide reactie op mijn uitgebreide topic. Ik hou je vast en zeker op de hoogte als het gelukt is, dan kan ik hopelijk verder gaan met de volgende stap(pen)!

P.S.: Arjan, volg jij m'n topic wat op? Ik wil absoluut NIET pushen, maar op deze manier weet ik of ik met m'n andere subproblemen al dan niet een nieuw topic in de andere onderwerpen moet plaatsen ;)
 
Arjan -

Arjan -

16/06/2011 17:26:53
Quote Anchor link
Als jij vragen hebt met betrekking tot de opzet en structuur van je website, dan kan je altijd reageren in deze topic.

En jouw htaccess is niet zo zeer hét probleem, maar bij een logische structuur hoort wel een andere invulling van jouw htaccess inderdaad.
Gewijzigd op 16/06/2011 17:28:33 door Arjan -
 
Sam Clauw

Sam Clauw

17/06/2011 12:47:19
Quote Anchor link
Ondertussen heb ik heel wat opgezocht rond bootstrapping en... waw! Het lijkt me een sterke manier van werken in vergelijking met de opbouw dat ik nu handhaaf :)

Ik ben volledig overtuigd dat ik op deze manier wil werken, alleen... Het vinden van goede tutorials is een hele opgave! Deze tut ging in de goede richting, maar jammer genoeg is men niet verder dan 2 hoofdstukken geraakt: http://devzone.zend.com/node/view/id/119

Ik heb in ieder geval begrepen dat je het best een bepaalde structuur aanhoudt om je files in te stoppen. Ik pas de boomstructuur van in de bovenvermelde url zo goed mogelijk toe op mijn situatie:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
/
|-- private
|    |-- app
|    |    |-- php
|    |    |    |-- classes
|    |    |    +-- scripts
|    |    |-- settings
|    |    +-- sql
|    +-- lib
|         +-- ZendFramework-HEAD
+-- httpdocs
    |-- css
    |-- images
    |-- js


Hetgeen in de httpdocs map moet is overduidelijk, maar welke files je in welke mappen van de private map stopt, dát is andere koek!

- Stop ik mijn config.inc.php file in private/app/setting?
- Stop ik de smarty map in private/lib?
- Wat stop ik in private/app/php/scripts?
- Private/app/sql... waarom?
- En belangrijk: waar komt mijn index.php file en de .htaccess file te staan???

Phoeh, da's alvast een hele brok heb ik de indruk. Jammer dat zoiets niet uitgelegd word in een 800 pagina tellend "Beginning PHP and PostgreSQL 8" boek :(

Alvast dank aan de mensen die mij verder op weg willen helpen!
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.