IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Navigation site PHP


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    37
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 37
    Points : 23
    Points
    23
    Par défaut Navigation site PHP
    Bonjour, j'aurais besoin d'éclaircissements à propos de la navigation que je souhaite réaliser sur mon site en utilisant les includes.
    J'ai une page d'accueil index.php sur laquelle tout le site s'appuie mais je ne sais pas si c'est la bonne solution...:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
    	<head>
    		<meta http-equiv="content-type" content="text/html; charset=iso-8859-1"/>
     
    		<style type="text/css">
    			@import "CSS/design_index.css";
     
    		</style>
     
    		<link rel="shortcut icon" href="images/ico1.ico" /><!-- icône à choisir-->
     
    		<title>
    			Site NERD
    		</title>
    	</head>
     
    <body>
    	<!--<div id="haut_de_page">-->
     
    	<?php include("./pages/en_tete.php"); ?>
    	<!--</div>-->
     
    	<div id="corps">
    	<?php
    		/*echo $_GET;*/
    		if (empty($_GET['page']))	{
    			include('pages/accueil.php');
    		}	else	{
    			if (file_exists($_GET['page'].'.php'))	{
    				include($_GET['page'].'.php');
    				}	else	{
    				include('pages/erreur.php');
    			}
    		}
     
    	?>
    	</div>
     
    	<?php include("pages/pied_de_page.php"); ?>
     
    </body>
     
     
    </html>
    et la page entete.php qui va chercher le "corps" des pages:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    <div id= "haut_de_page">
    	<a href="index.php?page=pages/accueil" title="Accueil"> <h1>µMind Localisation</h1></a>	
    		<ul id="menuhdp">
    			<li><a href="index.php?page=pages/page1" title="cible 1">lien 1</a>
    				<ul class="sous-menu">
    				<li><a href="index.php?page=pages/page11">sous-lien 1.1</a></li>
    				<li><a href="index.php?page=pages/page12">sous-lien 1.2</a></li>
    				<li><a href="index.php?page=pages/page13">sous-lien 1.3</a></li>
    				</ul>
    			</li>
    			<li><a href="index.php?page=pages/page2" title="cible 2">lien 2</a>
    				<ul class="sous-menu">
    				<li><a href="index.php?page=pages/page21">sous-lien 2.1</a></li>
    				<li><a href="index.php?page=pages/page22">sous-lien 2.2</a></li>
    				<li><a href="index.php?page=pages/page23">sous-lien 2.3</a></li>
    				</ul>		
    			</li>, etc...
    Seulement, le style sera le même pour tout le site et je voudrais qu'il change selon le lien choisit; j'ai réussi à le faire en incluant une page entière dans le "div corps" mais ce n'est pas très propre puisque le style est alors chargé deux fois.
    Je me demande alors s'il ne serait pas judicieux de recopier la page index sur tout le site et de changer à chaque fois le corps mais je ne pourrais alors plus utiliser la fonction $_GET qui me renvoie l'adresse de la page à afficher, pourrais-je avoir des avis?

  2. #2
    Expert éminent
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 146
    Points : 9 387
    Points
    9 387
    Par défaut
    Pour ce que tu veux faire tu devrais te pencher vers du MVC (Modèle Vue Contrôleur) ce serait plus facile à manipuler.

    Même si on ne part pas sur un développement POO (la majorité des cours et tutoriaux ne présente cela qu'en orienté objet) il faut savoir qu'on peut très bien implémenter du MVC sans cela. Il suffit de faire le traitement avant tout affichage.
    Ainsi avant même d'afficher du HTML tu auras déjà toutes les informations.

  3. #3
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    +1 pour ci-dessus.

    Cela fait partie d'une des erreurs que font ceux qui débutent.
    En faite, le déroulement du code Php est effectué selon le déroulement de celui du Html, et c'est là grosse erreur.

    Il n'y a pas à tenir compte du déroulement du code Html, faite en 1er tout le Php, et en dernier on génère le code Html.

    Il faut vraiment comprendre que le code Php qui lui est interprété coté serveur sert en partie à générer du code Html, puis ce code Html (uniquement le code Html) sera renvoyé via le réseau vers le post client (navigateur), et ce ne sera qu'à partir de cet instant (donc bien après) que ce code Html sera interprété par ce navigateur.


    Toujours est il que le fait d'avoir effectué le code Php qui s'occupe à vérifier et inclure l'existence du fichier demandé (comme page10.php) après l'inclusion de l'entête, et bien on est coincé.

    Faire ainsi par exemple devient possible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    <?php
    // Partie traitements
    $page = 'index';
    //
    if (isset($_GET[page]) && !empty($_GET['page'])) {
        if (file_exists($_GET['page'].'.php')) {
    	$page = $_GET['page'];
        }
        else {
            $page = 'erreur';
        }
    }
     
    // Partie interface
    ?>
    <html>
    <head>
        <title>UN TITRE</title>
        <link rel="stylesheet" type="text/css" href="/css/<?php echo $page; ?>.css" />
    </head>
    <body>
     
        <?php include('./pages/en_tete.php'); ?>
        <div id="corps">
        <?php include('./pages/'.$page.'.php'); ?>
        </div>
        <?php include('pages/pied_de_page.php'); ?>
     
    </body>
    </html>
    Maintenant on a la possibilité d'exploiter cette variable $page à n'importe quel moment dans la partie Html, comme dans l'exemple ci-dessus pour l'import du Css.

    Encore que dans cet exemple, du fait d'inclure à cet endroit la page demandée les traitements seront exécuté en plein corps de la page Html, ce qui peut être à nouveau problématique.
    On peu améliorer cela en procédant par exemple comme ceci :
    page10.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <?php
    $contenu_corps = 'Il était une fois ...';
    ?>
    index.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    <?php
    // Partie traitements
    $page = 'index';
    //
    if (isset($_GET[page]) && !empty($_GET['page'])) {
        if (file_exists($_GET['page'].'.php')) {
    	$page = $_GET['page'];
        }
        else {
            $page = 'erreur';
        }
    }
    //
    include('./pages/'.$page.'.php');
     
    // Partie interface
    ?>
    <html>
    <head>
        <title>UN TITRE</title>
        <link rel="stylesheet" type="text/css" href="/css/<?php echo $page; ?>.css" />
    </head>
    <body>
     
        <?php include('./pages/en_tete.php'); ?>
        <div id="corps">
        <?php echo $contenu_corps; ?>
        </div>
        <?php include('pages/pied_de_page.php'); ?>
     
    </body>
    </html>
    Grosso modo, on construit le corps de cette page en stockant le contenu dans une variable, et en dernier on génère ce contenu.
    L'exécution du code se faisant avant le moindre renvoie de contenu (avant le doctype, html, etc ...).

    En résumé, la page index.php ferait office de FrontController, et chaque page (page1, page2, etc ...) de controller.
    entete.php, pied_de_page.php sont des Vues.
    Reste donc à séparer les Requêtes SQL pour s'approcher d'une structure MVC.


    mais je ne pourrais alors plus utiliser la fonction $_GET qui me renvoie l'adresse de la page à afficher, pourrais-je avoir des avis?
    Si tu pourras.
    $_GET (qui n'est pas une fonction) est un tableau superglobal, ce qui veut dire que tout ce qu'il contient est disponible dès la toute 1ère ligne de code de la page jusqu'à la dernière, y compris visible dans les fonctions et classes.

  4. #4
    Membre éprouvé Avatar de redoran
    Homme Profil pro
    Développeur-Amateur
    Inscrit en
    Juin 2010
    Messages
    1 346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur-Amateur
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 346
    Points : 1 031
    Points
    1 031
    Par défaut
    Re ;
    ....if (empty($_GET['page'])).....

    là avec $_Get sa pose pas un problème de sécurité parce que tous est affiché dans la barre bien sur si je me trompe pas!!!!

  5. #5
    Expert éminent
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 146
    Points : 9 387
    Points
    9 387
    Par défaut
    Tant que tu gères un array contenant la liste des scripts autorisés cela ne pose aucun souci que ça soit visible ou non dans l'url.

    Et si le problème est que les visiteurs auront l'url pour accéder directement au fichier il suffit de jouer sur une constante :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    if( !defined('MA_CONSTANTE') ) exit();

  6. #6
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Citation Envoyé par redoran
    Là avec $_Get sa pose pas un problème de sécurité
    Oui et non, disons qu'il faut éviter la paranoïa sur les données en GET.
    Tu omets tout de même qu'il y a ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (file_exists($_GET['page'].'.php'))
    Il faut bien au départ qu'une demande soit faite de la part de l'internaute, il faut donc que la donnée soit clairement lisible.

    Si on a une URL comme :
    -http://www.domaine.com/contact.php
    ou encore -http://www.domaine.com/partenaires.php
    domaine.com, contact ou partenaires sont bien en clair, non ? donc quelque part en GET.

    Si on regarde par exemple ce forum pour ce topic, le lien est :
    -http://www.developpez.net/forums/d1182536/php/langage/debuter/navigation-site-php/
    Ce qui peu donner quelque chose comme : (dû à la réécriture)
    -http://www.developpez.net?forums=d1182536&php=langage&debuter=navigation-site-php
    Donc tout passe en GET.
    Le but étant que les topics puissent être référencés dans des moteurs de recherches.

    Si on ne fait pas ça on ne sera jamais "visible" nulle part.

    Il faut juste vérifier que les contenus demandés soient conforment, comme par exemple l'existence d'une page.
    Si toutes les pages sont stockées dans un répertoire bien précis (comme "pages"), et bien si quelqu'un demande une page inexistante, alors on rejette ou on fournis une page par défaut.
    Son principe repose la dessus, ça me semble une solution valable.

    Si dans ce même répertoire "pages" il y a certaines contenant des données sensibles/confidentielles, là il peu avoir un problème.
    Mais on ne sait pas.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    37
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 37
    Points : 23
    Points
    23
    Par défaut
    Euh, désolé de relancer le sujet mais je ne m'y suis pas attelé depuis...
    J'ai donc choisi la réponse de RunCodePhp pour naviguer sur le site et j'ai des questions par rapport aux réponses que vous m'avez expliqué mais j'ai maintenant un autre souci mineur que je n'avais pas avant avec la fonction file_exist; il ne trouve pas la page que je lui envoieen $_GET mais il trouve quand même la page erreur, ce doit être le file_exist qui ne cherche pas au bon endroit mais je n'arrive pas à lui "dire" où chercher:
    J'ai ceci au début de ma page index.php et mes pages sont dans /pages par rapport à index
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    <?php
    /*echo $_GET;*/
    /*$page = 'index';*/
     
    	if (empty($_GET['page']))	{
    		$page = 'accueil';
    	}	else	{
    		if (file_exists('/pages/'$_GET['page'].'.php'))	{
    			$page = $_GET['page'];
    		}	else	{
    			echo 'le file existe pas!!!';
    			echo $_GET['page'];
    			$page = 'erreur';
    		}
    	}
    ?>
    Cette syntaxe me donne une erreur division par zéro et ne trouve pas la page autremet si je mets seulement $_GET['page'] !

  8. #8
    Expert éminent
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 146
    Points : 9 387
    Points
    9 387
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (file_exists('/pages/'$_GET['page'].'.php'))	{
    Il te manque un opérateur de concaténation et là il recherche dans le dossier racine à cause du premier slash.

Discussions similaires

  1. Réponses: 11
    Dernier message: 10/01/2006, 07h23
  2. Problème changement serveur pour un site PHP
    Par izzy dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 5
    Dernier message: 06/01/2006, 11h34
  3. [CKEditor] Qui utilise FCKeditor sur son site php pour config ?!
    Par guy2004 dans le forum Bibliothèques & Frameworks
    Réponses: 62
    Dernier message: 26/10/2005, 18h24
  4. Question pour un site PHP/MySQL et Javascript
    Par DvP dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 22/09/2005, 08h23
  5. Réponses: 2
    Dernier message: 20/05/2005, 01h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo