2010-07-23 3 views
1

Pour le moment, j'ai un fichier de modèle HTML de base. Lorsque je veux créer une nouvelle page, je copie le modèle et place des instructions require_once entre des balises spécifiques. Je me demandais s'il y avait une meilleure façon de rendre inutile la copie du modèle à chaque fois. Voici un exemple typique:Comment pourrais-je améliorer ce système de template?

<html> 
    <head> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
    <link rel="stylesheet" type="text/css" href="css/second.css" /> 
    <script language="JavaScript" type="text/javascript" 
     src="js/validation_functions.js"></script> 
    <title>Order a Ticket for the ball</title> 
    </head> 
    <body> 

    <div id="banner">St. Tom's Ambulance Ball</div> 

    <!-- START[container] --> 
    <!-- "body" --> 
    <div id="container"> 

     <!-- START[header] --> 
     <div id="header"> 

      <!-- header --> 
      <div id="header_text">introduction</div> 
      <div id="header_cell2">the process</div> 
      <div id="header_cell3">start</div> 

     </div> 
     <!-- END[header --> 

     <!-- START[content] --> 
     <!-- "other container" --> 
     <div id="content"> 

      <!-- START[form] --> 
      <div id="form"> 
       <?php 
       require_once(realpath($config["directories"]["views"]."/index.form.view.php")); 
       ?> 
      </div> 
      <!-- END[form] --> 

      <!-- START[data] --> 
      <!-- "main content" --> 
      <div id="data"> 
       <?php 
       require_once(realpath($config["directories"]["views"]."/index.data.view.php")); 
       ?> 
      </div> 
      <!-- END[data] --> 

      <!-- START[side] --> 
      <div id="side"> 
       <?php 
       require_once(realpath($config["directories"]["views"]."/index.side.view.php")); 
       ?> 
      </div> 
      <!-- END[side] --> 

     </div> 
     <!-- END[content] --> 

     <!-- START[footer] --> 
     <div id="footer"> 
      <!-- footer --> 
      <div id="footer_text"> 
       <ul> 
        <li><a href="index.php">home</a></li> 
        <li><a href="">partners</a></li> 
        <li><a href="">projects</a></li> 
        <li><a href="">contact us</a></li> 
       </ul> 
      </div> 

      <div id="footer_cell2">&nbsp;</div> 
      <div id="footer_cell3">&nbsp;</div> 

     </div> 
     <!-- END[footer] --> 

    </div> 
    <!-- END[container] --> 

    </body> 
</html> 

EDIT: Je ai pris note de vos suggestions pour utiliser GET. La nouvelle idée est d'avoir chaque url de demande formée comme index.php? Page = nom_page. Cette requête serait alors traitée par un contrôleur principal qui définit ensuite les variables du modèle en fonction de la valeur de $ _GET ['page']. Pour cela, le modèle sera maintenant:

<html> 
    <head> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
    <link rel="stylesheet" type="text/css" href="css/second.css" /> 
    <script language="JavaScript" type="text/javascript" 
     src="js/validation_functions.js"></script> 
    <title><?php h($title) ?></title> 
    </head> 
    <body> 

    <div id="banner">St. Tom's Ambulance Ball</div> 

    <!-- START[container] --> 
    <!-- "body" --> 
    <div id="container"> 

     <!-- START[header] --> 
     <div id="header"> 

      <!-- header --> 
      <div id="header_text"><?php h($header_1) ?></div> 
      <div id="header_cell2"><?php h($header_2) ?></div> 
      <div id="header_cell3"><?php h($header_3) ?></div> 

     </div> 
     <!-- END[header --> 

     <!-- START[content] --> 
     <!-- "other container" --> 
     <div id="content"> 

      <!-- START[form] --> 
      <div id="form"> 
       <?php 
       require_once(realpath($view_1)); 
       ?> 
      </div> 
      <!-- END[form] --> 

      <!-- START[data] --> 
      <!-- "main content" --> 
      <div id="data"> 
       <?php 
       require_once(realpath($view_2)); 
       ?> 
      </div> 
      <!-- END[data] --> 

      <!-- START[side] --> 
      <div id="side"> 
       <?php 
       require_once(realpath($view_3)); 
       ?> 
      </div> 
      <!-- END[side] --> 

     </div> 
     <!-- END[content] --> 

     <!-- START[footer] --> 
     <div id="footer"> 
      <!-- footer --> 
      <div id="footer_text"> 
       <ul> 
        <li><a href="index.php">home</a></li> 
        <li><a href="">partners</a></li> 
        <li><a href="">projects</a></li> 
        <li><a href="">contact us</a></li> 
       </ul> 
      </div> 

      <div id="footer_cell2">&nbsp;</div> 
      <div id="footer_cell3">&nbsp;</div> 

     </div> 
     <!-- END[footer] --> 

    </div> 
    <!-- END[container] --> 

    </body> 
</html> 

Note: h() est une fonction qui supprime d'abord tous les tags d'entités indésirables avant l'écho d'une chaîne. Sur une note connexe, en haut de chaque page, j'ai des fichiers de contrôleur qui sont inclus avec require_once. Je me demandais s'il serait possible de mettre en œuvre une fonction qui inclut simplement les fichiers basés sur une chaîne d'entrée spécifique (nom de la fonctionnalité/page)-à-dire « index » de cette façon:

function include_controller($page){ 
    switch($page){ 
    case "index": 
     require_once(realpath($config["directories"]["controllers"]."/index_.php")); 
     break; 
    case "checkout": 
     require_once(realpath($config["directories"]["controllers"]."/checkout_.php")); 
     break; 
    default: 
     break; 
    } 
} 
+0

Utilisez le Zend, ou un autre framework grand public? – PurplePilot

+0

Avez-vous regardé quelque chose comme: http://www.smarty.net/? – Rimian

Répondre

1

Au lieu de coder en dur la inclut dans chaque fichier, vous pourriez avoir un fichier de contrôleur dans lequel vous passez la page à afficher à travers une variable $ _GET. Le contrôleur gère ensuite la logique et inclut la ou les pages appropriées. C'est ainsi que beaucoup de frameworks MVC le font.

Modifier: Pour répondre à votre deuxième question, au lieu d'utiliser un commutateur, vous pouvez simplement vérifier que le fichier existe. Si c'est le cas, incluez ce fichier, sinon renvoyez une erreur ("Page n'existe pas" ou quelque chose de similaire).

function include_controller($page){ 
    if (file_exists($config["directories"]["controllers"]."/$page_.php")) { 
     // page exists, include it 
     require_once($config["directories"]["controllers"]."/$page_.php")); 
    } else { 
     // page not found 
    } 
} 

Il est évident que vous devriez probablement faire fonctionner un peu plus robuste et probablement limiter les fichiers qui seront inclus à un répertoire ou quelque chose. Assurez-vous également de bien filtrer la variable $ page afin que les utilisateurs ne puissent accéder à aucun fichier.

+0

Merci pour vos commentaires. Ils ont été très utiles. – Fortisimo

0

Si votre serveur prend en charge, vous pouvez les références aux choses que vous voulez inclure dans toutes les pages de .htaccess:

php_value auto_prepend_file "header.php" 
php_value auto_append_file "footer.php" 

(trouvé sur codingforums.com)

+0

Il y a d'autres astuces sur cette page sur la façon de le faire avec les règles de réécriture. – Curtis

1

Conservez ce un seul fichier comme modèle fichier. Ensuite, pour toutes les fonctionnalités de votre site, cliquez toujours sur ce fichier. Laisse reposer ce fichier est index.php. Toutes les demandes de fonctionnalité vont donc à index.php. Mais avec des paramètres différents donc pour la fonctionnalité A.

index.php? Fonction = a Pour la fonctionnalité b

index.php? Fonction = b

vous pouvez ajouter plusieurs paramètres également.

Maintenant, sur la base de a, b et de l'ensemble des paramètres, voyez quels fichiers vous voulez inclure comme requis une seule fois.

+0

votre suggestion semble intrigante. Je me demandais, comment pourrais-je configurer que toutes les demandes de fonctionnalité vont à index.php? – Fortisimo

0

Vous pouvez vous débrouiller avec un modèle si vous choisissez une autre façon de spécifier quelle page est demandée, par exemple en utilisant une variable GET.Vous pouvez charger les pages dans une base de données et spécifier chacune des pièces incluses, puis avoir un 'moteur de template' php qui charge la page demandée depuis la base de données et sort le template avec les bons includes.

1

Comme les autres l'ont déjà dit, il serait préférable d'utiliser une sorte de framework MVC. Ou au moins utiliser un moteur de template (par exemple Smarty). Votre exemple est correct cependant, pour les années 90 :)

Questions connexes