2013-04-26 3 views
0

J'ai deux en-têtes: un à afficher pour un utilisateur connecté, et un à afficher lorsqu'il est déconnecté/pas un membre. J'ai aussi un pied de page qui devrait être dupliqué sur chaque page. J'ai eu l'idée d'utiliser SSI pour inclure l'en-tête et le pied de page.Autres en-têtes avec SSI et PHP

Pour l'instant, nous n'avons pas commencé beaucoup de traitement côté serveur, et donc ne gardons pas trace des utilisateurs connectés/déconnectés. En tant que tel, pour l'instant, je veux juste utiliser la page qui comprend l'en-tête pour déterminer ce qu'il faut afficher. J'ai eu l'idée d'utiliser un fichier PHP comme en-tête au lieu d'un fichier SHTML, donc je pourrais faire un peu de traitement pour déterminer quel en-tête afficher.

Alors, est-il possible de déterminer quelle page appelle l'include avec PHP?

Est-ce que je vais tout à fait faux? Si oui, quelle est la solution la plus appropriée?

Par exemple, chaque page html correspond à cette disposition générale:

<html> 
<header> 
    <!-- relevant header calls --> 
<header> 
<body> 
    <div id="body"> 
     <!--#include virtual="header.php"--> 
     <!-- actual page content --> 
    </div> 
    <!--#include virtual="footer.shtml"--> 
</body> 
</html> 

Et dans header.php Je veux quelque chose comme:

<?php 
if(/*page is a non-logged in page*/){ 
    echo(/*logged out header*/); 
} else { 
    echo(/*logged in header*/); 
} 
?> 
+0

if ($ _ SESSION ['connecté_in']) include ('logged_in_header.php'); else include ('visitor_header.php'); – Waygood

+0

cela fonctionnera même pour SSI? J'étais un peu inquiet que, étant côté serveur, cela obscurcirait la session. Aussi, ma principale préoccupation en ce moment est de détecter quelle page appelle l'include. – Jaws212

+0

sans un peu de code c'est difficile à dire mais avez-vous regardé: http://en.wikipedia.org/wiki/Server_Side_Includes – Waygood

Répondre

0

est-il donc possible de déterminer quelle page appeler l'include avec PHP?

Aucune idée. Mais si c'est possible, ce sera via $_SERVER. Mettez dans votre header.php pour les tests:

<?php 
echo '<pre>'; 
print_r($_SERVER); 
echo '</pre>'; 

Cependant, si la page est demandée comme *.html avec le serveur-Side Includes je ne peux même pas commencer à prédire quel genre de ravages que cela va jouer avec Sessions PHP. J'ai des doutes que session_start() sera jamais en mesure de définir les en-têtes appropriés dans ce contexte, ou si le cookie de session PHP sera jamais envoyé au client ou être passé par SSI à PHP. Pour autant que je sache, SSI ne doit être utilisé que pour inclure du contenu statique ou dynamique ne reposant sur aucune interaction avec l'utilisateur, y compris quelque chose de basique comme s'il était connecté ou ne pas. SSI est un kludge entre les pages statiques et dynamiques et devrait être appelé "kinda-sorta-dynamic-but-not-really". Réponse courte: SSI va être une douleur massive dans le cul, fossé et il suffit d'utiliser PHP include().

Edit: page Votre ressemblerait à quelque chose comme cela au niveau le plus élémentaire, et est vraiment plus complexe que l'utilisation de SSI. Si vous avez pris une plus MVC-oriented approche [à savoir le C et V parties], il deviendrait plus facile à gérer:

<?php 
session_start(); 
// other initialization 
?><html> 
<head> 
    <!-- relevant header calls --> 
<head> 
<body> 
    <div id="body"> 
     <?php 
if($_SESSION['is_logged_in']){ 
    echo(/*logged out header*/); 
} else { 
    echo(/*logged in header*/); 
} 
?> 
     <!-- actual page content --> 
    </div> 
    <?php include("footer.php"); ?> 
</body> 
</html> 
0

Par souci de faciliter la programmation, il est préférable d'utiliser l'un ou l'autre. Il est préférable d'aller avec PHP exclusivement parce que:

  1. Soutien massif communauté php.net
  2. Dans la plupart des implémentations il est plus rapide que d'utiliser le SSI parce que PHP est conçu pour faire tout le traitement et l'analyse syntaxique du code de PHP, alors qu'une SSI doit lire votre page SHTML (après l'avoir écrite) et passer au crible les commentaires et les inclusions, puis inclure tous les composants.
  3. Si vous incluez des pages PHP en tant que SSI, vous faites en sorte que Apache attende PHP, alors que si vous utilisiez PHP seul, il aurait déjà livré la page.
  4. Vous pouvez faire des choses avec des bases de données et beaucoup plus avec PHP.
  5. Les pages PHP ne sont pas accessibles depuis le serveur sans être traitées, ce qui réduit le risque que quelqu'un exploite vos vulnérabilités de code si vous utilisez des pratiques standard.
  6. Les SSI sont clairement lisibles en tant que code (et très limité).

Vous pouvez inclure un SSI avec PHP si vous utilisez PHP comme un module Apache, en utilisant la fonction virtual(), mais pourquoi voudriez-vous? Vous pouvez include() à peu près n'importe quoi dans PHP.

Exemple

Je vais utiliser un site de gestion de compte à titre d'exemple. Pour rendre l'en-tête dynamique, vous devrez trouver le $var pour la page l'appelant (je vais utiliser $_SERVER['REQUEST_URI']). Il existe plusieurs reserved server variables in PHP que vous pouvez référencer pour effectuer des appels en fonction des circonstances. Alors disons que le répertoire autorisé où tout connecté pages go est appelé « auth » votre fichier shell commun pourrait ressembler à ceci:

<?php 
//Check for the page the person is asking for 
session_start(); 

$root = $_SERVER['DOCUMENT_ROOT']; 

//Check for the "auth" directory 
if(preg_match('!^/?auth!',$_SERVER['REQUEST_URI'])){ 
    //Do some check to see if they've been authenticated... this one is not secure, but you get the idea 
    if($_SESSION['logged_in']){ 
    //Require the correct header 
     require_once($root.'/includes/logged-in-header.php'); 
    } else { 
//They don't belong or they're not logged in, kick them back to the login page.  
header("Location: /login.php?e=1"); 
die();  
    } 
} else { 
//It's not an authorization required page, so show the standard header. 
require_once($root.'/includes/non-auth-header.php'); 
} 

//let's find out the page that's loading the shell. 
$pageName = preg_replace('!/([^/]+)$!',"$1",$_SERVER['SCRIPT_NAME']); 

switch($pageName){ 
    /*Auth pages*/ 

    case "billing.php": 
    require_once($root.'/includes/billing.php'); 
    break; 

    case "account.php": 
    require_once($root.'/includes/account.php'); 
    break; 

    case "logout.php": 
    require_once($root.'/includes/logout.php'); 
    break; 

    default: 
    //show the login page 
    require_once($root.'/includes/login.php'); 

} 
require_once($root.'/../shell.php'); 
require_once($root.'/includes/footer.php'); 


?> 

Donc, si vous étiez dans le répertoire auth et vous n'êtes pas connecté, vous le feriez obtenir la page d'accueil. Si vous êtes dans le répertoire auth sur la page billing.php et que vous êtes connecté, le site chargera la page de facturation.

Le auth/billing.php code pourrait ressembler à ceci:

require_once("$_SERVER['DOCUMENT_ROOT'].'/../shell.php'); 

Le include/billing.php Code contiendrait tous fonctionnement de la page et il peut être formaté en HTML, mais vous tireriez probablement ce truc d'une base de données.