Использование PHP include для разделения содержимого сайта - PullRequest
5 голосов
/ 03 марта 2011

Я ищу совет относительно лучшей практики для разделения контента сайта на логические блоки.Я хочу, чтобы верхний и нижний колонтитулы были постоянными по всему сайту, поэтому, если у меня есть несколько страниц различного контента, они будут выглядеть так, как показано ниже - изменения, внесенные в верхний и нижний колонтитулы, будут обновляться автоматически, и мне не придется менять каждую отдельную страницу.

<?php
include 'header.php';
?>
<body>
    <p>page content here</p>
</body>
<?
include 'footer.php';
?>

header.php будет содержать начальный <html>, <head> и статический контент, а footer.php будет содержать любой дополнительный статический контент и закрывающий тег </html>.Итак, мой вопрос: Это хороший подход? Я беспокоюсь, что распространение тегов <html> на несколько файлов - плохая практика.Если да, то как правильно подходить к дизайну такого типа?

Ответы [ 4 ]

14 голосов
/ 03 марта 2011

Нет, ваш подход неверен.
Вот основные недостатки вашего дизайна:

  1. Вы предполагаете, что header.php будет вызываться при каждом вызове страницы. Это неправильно.
  2. Вы предполагаете, что header.php всегда будет статическим. Это неверно.
  3. Вы забыли создать шаблон для самой страницы.

Главное правило, которое каждый должен выучить наизусть:

Ни один символ не должен быть отправлен в браузер, пока все данные не будут готовы.

Почему?

  • Сегодня 2011 год. Эра AJAX. Что если ваш код должен будет отправлять данные в формате JSON вместо всей HTML-страницы?
  • есть вещь, которая называется HTTP header. Иногда мы должны отправить их. И это становится невозможным, если вы уже отправили свой богато украшенный HTML-заголовок.
  • это всего лишь 4-страничный сайт. Хорошо. Представьте, что вам повезло, и вы получили запрос на другой 4-страничный сайт. Вам придется менять только шаблоны и не трогать файлы движка. Это действительно большое преимущество.
  • Представьте, что вы собираетесь создать собственный тег <title> для своих страниц на основе содержимого страницы. Разве это не очень распространенная вещь? Но вы не можете сделать это без использования шаблонов.

Итак, у вас должен быть один общий шаблон сайта, содержащий верхний и нижний колонтитулы, а также выделенные шаблоны для каждого php-скрипта.

Пример макета будет выглядеть следующим образом:

0,1. сама страница.

выводит ничего , но собирает только необходимые данные и вызывает шаблон:

<?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";
?>

0,2. template.php который является вашим основным шаблоном сайта,

состоит из вашего верхнего и нижнего колонтитула:

<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>

0,3. и наконец links.tpl.php - это фактический шаблон страницы:

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

легко, чисто и ремонтопригодно.

9 голосов
/ 08 апреля 2013

При построении ответа Your Common Sense нет веской причины иметь по 2 файла на каждую страницу.Вы можете легко объединить ваш шаблон (YCS назвал это .tpl.php) и вашу фактическую страницу в один файл.

Сначала начните с класса, который можно расширять по мере необходимости расширения вашего шаблона:

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

Затем создайте свой макет:

<?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>

И, наконец, добавьте свою страницу с содержимым тела:

<?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>
4 голосов
/ 03 марта 2011

Это базовый подход, но, да, он работает :) Я уверен, что это будет беспокоить много шаблонов и ООП, но вы определенно на правильном пути

Поскольку я не могу больше комментировать,тогда я отвечу здесь;) Если ему нужен пользовательский заголовок, то ему нужны более продвинутые функции.Итак, как я уже сказал, это базовый подход.Но, в конце концов, если у него действительно есть статический колонтитул, и он действительно используется везде, ну, да, это хороший путь.

Итак, вы могли бы возиться с некоторыми продвинутыми заголовками с параметрамиВы могли бы кормить на каждой странице.Вы могли бы пойти на целый материал MVC.В конце просто скажите ему, чтобы использовать готовые рамки и прекратить беспокоиться.Как он мог узнать, если ты не позволил ему сделать несколько проб и ошибок?

0 голосов
/ 03 марта 2011

index.php - включает верхний и нижний колонтитулы и содержимое на основе переменной REQUEST.
header.php - содержимое заголовка
footer.php - содержимое нижнего колонтитула

content1.php, content2.php и т. Д.


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');
?>

, если вы хотите, чтобы URL-адрес шел www.domain.com/pagename, где страница, которую вы пытаетесь загрузить в index.php, называется «pagename», используйте HTACCESS и выполните некоторую перезапись URL-адреса.: http://corz.org/serv/tricks/htaccess2.php

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...