Using PHP include to separate site content

前端 未结 4 610
梦毁少年i
梦毁少年i 2020-12-03 16:17

I\'m looking for advice on the best practice for separating site content up into logical blocks. I want a header and footer that are constant throughout the site, so that if

相关标签:
4条回答
  • 2020-12-03 16:35

    index.php -- includes header, footer, and content based on REQUEST variable.
    header.php -- header content
    footer.php -- footer content

    content1.php, content2.php, etc.


    index.php:

    <?php
    include ('header.php');
    
    // VERY IMPORTANT - do not use the GET variable directly like this
    // make sure to filter it through a white-list
    include(basename($_GET['page']).'.php');
    
    include ('footer.php');
    ?>
    

    if you want the URL to go www.domain.com/pagename where the page you're trying to load into index.php is "pagename", use HTACCESS and do some URL Rewriting: http://corz.org/serv/tricks/htaccess2.php

    0 讨论(0)
  • 2020-12-03 16:36

    This is a basic approach but, yeah, it does work :) I sure would bother with a lot of templating and OOP but you are definitely on the right path

    As i can't comment anymore, then i will answer here ;) If he need a custom title then he needs some more advanced functions. So, as i told, this is a basic approach. But in the end, if he really have a static header/footer, and really use them everywhere, well, yes, this is a good way to go.

    So ofc you could bother with some advanced headers with parameters you could feed on each page. You could go on a whole MVC stuff. In the end just tell him to use a pre-made framework and stop bothering. How could he learn if you don't let him do some trial and error ?

    0 讨论(0)
  • 2020-12-03 16:52

    In building off of Your Common Sense's answer, there's not a good reason to have 2 files for every page. You can easily combine your template (YCS called this .tpl.php) and your actual page into one file.

    First, start off with a class that you can expand as your template needs expand:

    <?php
    #lib/PageTemplate.php
    class PageTemplate {
        public $PageTitle;
        public $ContentHead;
        public $ContentBody;
    }
    

    Then, make your layout:

    <?php
    # layout.php
    require_once('lib/PageTemplate.php');
    ?>
    <!DOCTYPE HTML>
    <html>
    <head>
        <title><?php if(isset($TPL->PageTitle)) { echo $TPL->PageTitle; } ?></title>
        <?php if(isset($TPL->ContentHead)) { include $TPL->ContentHead; } ?>
    </head>
    <body>
        <div id="content">
            <?php if(isset($TPL->ContentBody)) { include $TPL->ContentBody; } ?>
        </div>
    </body>
    </html>
    

    And finally, add your page with the body content:

    <?php
    #Hello.php
    require_once('lib/PageTemplate.php');
    # trick to execute 1st time, but not 2nd so you don't have an inf loop
    if (!isset($TPL)) {
        $TPL = new PageTemplate();
        $TPL->PageTitle = "My Title";
        $TPL->ContentBody = __FILE__;
        include "layout.php";
        exit;
    }
    ?>
    <p><?php echo "Hello!"; ?></p>
    
    0 讨论(0)
  • 2020-12-03 16:58

    Nope, your approach is wrong.
    Here are main faults in your design:

    1. You're assuming that header.php would be called on the every page call. That's wrong.
    2. You're assuming that header.php will always be static. That's wrong.
    3. You forgot to create a template for the page itself.

    The main rule everyone have to learn by heart:

    Not a single character has to be sent into browser, until all data gets ready.

    Why?

    • it's 2011 today. AJAX era. What if your code will have to send JSONed data instead of whole HTML page?
    • there is a thing called HTTP header. Sometimes we have to send them. And it's gets impossible if you already have your ornate HTML header sent.
    • it's for just 4-page site. Okay. Imagine you've got lucky and got a request for another 4-page site. You will have to change only templates and don't touch engine files. That's really great benefit.
    • Imagine you're going to make a custom <title> tag for your pages, based on the page content. Isn't it extremely common thing? But you can't make it without using templates.

    So, you have to have one common site template containing header and footer and also dedicated templates for the every php script.

    An example layout is going to be like this:

    .1. page itself.

    it outputs nothing but only gather required data and calls a template:

    <?php
    //include our settings, connect to database etc.
    include dirname($_SERVER['DOCUMENT_ROOT']).'/cfg/settings.php';
    //getting required data
    $DATA=dbgetarr("SELECT * FROM links");
    $pagetitle = "Links to friend sites";
    //etc
    //and then call a template:
    $tpl = "links.tpl.php";
    include "template.php";
    ?>
    

    .2. template.php which is your main site template,

    consists of your header and footer:

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <title>My site. <?=$pagetitle?></title>
    </head>
    <body>
    <div id="page">
    <?php include $tpl ?>
    </div>
    </body>
    </html>
    

    .3. and finally links.tpl.php is the actual page template:

    <h2><?=$pagetitle?></h2>
    <ul>
    <?php foreach($DATA as $row): ?>
    <li><a href="<?=$row['link']?>" target="_blank"><?=$row['name']?></a></li>
    <?php endforeach ?>
    <ul>
    

    easy, clean and maintainable.

    0 讨论(0)
提交回复
热议问题