2010-09-16 10 views
1

Comment puis-je référencer des variables d'un fichier inclus avant qu'il ne soit inclus? Ou puis-je en quelque sorte inclure le fichier (afin que je puisse diriger ses variables plus tard) avant que son code HTML ne soit littéralement inséré dans la balise body? Ou est-ce que je peux contenir tout le contenu du corps de la maison dans une grande variable que je peux écho aussi bien dans l'index?PHP: Comment puis-je référencer les variables d'un fichier inclus avant qu'il ne soit inclus?

Voici ce que je suis en train de faire:

index.php

<html> 
<head> 
<title><?php echo $title; ?></title> 
<meta name="description" content="<?php echo $description; ?>" /> 
<meta name="keywords" content="<?php echo $keywords; ?>" /> 
</head> 
<body> 

<?php include 'home.php'; ?> 

</body> 
</html> 


home.php

<?php 
$title="home page"; 
$description="this is the home page"; 
$keywords="home, awesome, yes"; 
?> 

this is the home page content that gets inserted into the body! 

Répondre

0

il suffit de déplacer l'instruction include au haut du fichier. Ceci exposera toutes les valeurs, fonctions et variables à toutes les lignes suivantes.

<?php include 'home.php'; ?> 
<html> 
<head> 
<title><?php echo $title; ?></title> 
<meta name="description" content="<?php echo $description; ?>" /> 
<meta name="keywords" content="<?php echo $keywords; ?>" /> 
</head> 
<body> 



</body> 
</html> 
+0

Bon, alors je ferais alors l'intégralité du contenu principal de home.php dans une variable longue? –

+0

OUI. Vous pouvez mettre toutes vos variables dans HOME.PHP, assurez-vous de l'inclure en haut de votre fichier. –

0

Version courte: Vous ne pouvez pas. Si vous faites cela, vous obtiendrez une notification "variable indéfinie".

Je trouve qu'il est généralement beaucoup plus pratique d'avoir un header.php (et un footer.php d'ailleurs) qui est inclus dans l'index, la maison, le contact ou tout autre fichier. L'avantage est que vous n'avez pas de code redondant, et si vous devez apporter une modification dans l'en-tête ou le pied de page, vous devez seulement modifier un fichier.

Ainsi, par exemple, 'about_us.php' ressemblerait à ceci:

<?php 
include('path/to/header.php'); 
#body goes here 
include('path/to/footer.php'); 
?> 

Et votre tête serait quelque chose comme:

<?php 
$title = ucfirst(str_replace('_', ' ', substr(basename($_SERVER['PHP_SELF']), 0, -4)); 
?> 
<html> 
    <head> 
     <title><?php echo $title; ?> page</title> 
     <meta name="description" content="this is the home page" /> 
     <meta name="keywords" content="home, awesome, yes" /> 
    </head> 
    <body> 

La variable $title sera le nom du fichier, moins le extension, avec tous les traits de soulignement remplacés par des espaces et la première lettre du premier mot en majuscule. Donc, fondamentalement, about_us.php serait converti en "A propos de nous". C'est pas nécessairement une solution générale, mais je l'ai donné en exemple en gardant à l'esprit que vous vouliez utiliser un titre dynamique dans votre exemple original. Pour la description dynamique et les mots-clés, en fonction du nom de fichier, vous pouvez également affecter différentes valeurs à l'aide d'une instruction switch().


MISE À JOUR:

Une autre solution, bien que sorte de l'inverse de ce que vous demandez, mais en même temps beaucoup plus proche de ce que vous cherchez serait d'écrire le header.php comme

<html> 
    <head> 
     <title><?php echo $title; ?> page</title> 
     <meta name="description" content="<?php echo $desc; ?>" /> 
     <meta name="keywords" content="<?php echo $keywords; ?>" /> 
    </head> 
    <body> 

... le pied comme ...

</body> 
</html> 

...puis les inclure dans vos autres fichiers:

<?php 
$title = 'Your title'; 
$desc = 'Your description'; 
$keywords = 'The, big, brown, fox, jumps, over, the, lazy, dog'; 
include('path/to/header.php'); 
?> 

<!-- body goes here --> 

<?php 
include('path/to/footer.php'); 
?> 

De cette façon, vous assignez toutes les variables avant de vous incluez les fichiers dans lesquels ils sont référencés, vous avez des fichiers distincts pour tous les liens et vous n » t besoin de commutateurs sophistiqués. Aussi, en guise de remarque, encapsuler le HTML du corps en PHP est tout simplement une mauvaise pratique. Essayez de garder le HTML séparé du PHP autant que possible en général. Il vous aidera à la fois, et celui qui va travailler sur le code à l'avenir.

Espérons que cela aide!

+0

C'est une excellente solution, et ce sera certainement ma retombée, mais je suis toujours curieux de savoir comment vous pouvez avoir un fichier modèle principal, puis des fichiers de pages enfants individuels qui contiennent leurs propres données d'en-tête (titre, balises meta) ainsi que le contenu du corps. –

+1

Vous pouvez utiliser la solution de John Ballinger et stocker le contenu du corps dans une variable, mais vous devrez alors envoyer une variable au fichier d'index (voir ['$ _GET'] (http://php.net/manual/fr/ reserved.variables.get.php)), et l'utiliser dans une instruction 'switch()' pour faire savoir au script QUELLE page devrait-elle réellement inclure et afficher. Cependant, je ne suis pas sûr de la qualité d'avoir un seul fichier de base pour tous les liens (par exemple index.php? Do = home ou index.php? Do = about_us etc) et ce que cela signifie pour les différents mots-clés et descriptions 't jouer beaucoup avec le référencement. –

+0

S'il vous plaît voir ma réponse mise à jour, je crois que c'est beaucoup plus proche de ce que vous essayez d'atteindre. –

0

J'examinerais l'utilisation d'un système de gabarit. Séparer votre code du contenu vous épargnera beaucoup de problèmes à l'avenir. il vous permettra également de changer le modèle html facilement à l'avenir. De plus, vous pouvez voir votre modèle sans avoir à exécuter le code php.

un coup d'oeil à des modèles Smarty http://www.smarty.net/

alors vous construire un fichier modèle: "template.tpl"

<html> 
    <head> 
    <title>{$title}</title> 
    <meta name="description" content="{$description}" /> 
    <meta name="keywords" content="{$keywords}"/> 
    </head> 
    <body> 
    {$home_content} 
    </body> 
</html> 

et un code PHP pour exécuter:

<?php 
require_once('Smarty.class.php'); 
$smarty = new Smarty(); 
$smarty->assign('title'  , 'Your title'); 
$smarty->assign('description' , 'Your description'); 
$smarty->assign('keywords'  , 'The, big, brown, fox, jumps, over, the, lazy, dog'); 
$smarty->assign('home_content' , 'this is the home page content that gets inserted into'); 
$smarty->display('template.tpl'); 
?> 

Et cela ne fait que gratter la surface de ce qu'un système de templates peut faire. vous pouvez répéter ou des blocs facultatifs, inclure d'autres modèles, etc