Я ищу совет по наилучшей практике для разделения содержимого сайта на логические блоки. Я хочу, чтобы верхний и нижний колонтитулы были постоянными на всем сайте, так что, если у меня есть несколько страниц с различным контентом, все они будут выглядеть как ниже – изменения, сделанные в верхнем и нижнем колонтитулах, а затем автоматически обновляться без меня, чтобы изменить каждую отдельную страницу.
<?php include 'header.php'; ?> <body> <p>page content here</p> </body> <? include 'footer.php'; ?>
header.php
будет содержать открывающий <html>
, <head>
и статический контент, а footer.php
будет содержать дополнительный статический контент и закрывающий </html>
. Итак, мой вопрос: это хороший подход? Я обеспокоен тем, что распространение тегов <html>
для нескольких файлов является плохой практикой. Если да, то каков правильный подход к такому дизайну?
Нет, ваш подход ошибочен.
Вот основные ошибки в вашем дизайне:
Главное правило, которое каждый должен выучить наизусть:
Ни один символ не должен быть отправлен в браузер, пока все данные не будут готовы.
Зачем?
HTTP header
. Иногда нам приходится их отправлять. И это становится невозможным, если вы уже отправили свой богатый HTML-заголовок. <title>
для своих страниц на основе содержимого страницы. Разве это не обычная вещь? Но вы не можете сделать это без использования шаблонов. Таким образом, у вас должен быть один общий шаблон сайта, содержащий верхний и нижний колонтитулы, а также выделенные шаблоны для каждого скрипта php.
Пример макета будет таким:
0,1. самой страницы.
он ничего не выводит, а только собирает необходимые данные и вызывает шаблон:
<? //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"> <? include $tpl ?> </div> </body> </html>
0,3. и, наконец, links.tpl.php
является фактическим шаблоном страницы:
<h2><?=$pagetitle?></h2> <ul> <? foreach($DATA as $row): ?> <li><a href="<?=$row['link']?>" target="_blank"><?=$row['name']?></a></li> <? endforeach ?> <ul>
простой, чистый и обслуживаемый.
При построении ответа на 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>
Это базовый подход, но, да, он работает 🙂 Я уверен, буду беспокоиться о много шаблонов и ООП, но вы определенно на правильном пути
Поскольку я больше не могу комментировать, тогда я отвечу здесь;) Если ему нужен пользовательский заголовок, ему нужны дополнительные функции. Итак, как я сказал, это базовый подход. Но в конце концов, если у него действительно есть статический верхний / нижний колонтитул, и он действительно использует их везде, ну, да, это хороший способ.
Таким образом, вы могли бы беспокоиться о некоторых продвинутых заголовках с параметрами, которые вы могли бы подавать на каждой странице. Вы можете использовать весь материал MVC. В конце концов просто скажите ему использовать предварительно подготовленную основу и перестать беспокоиться. Как он мог узнать, не позволил ли он сделать проб и ошибок?
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-адрес был отправлен на http://www.domain.com/pagename, где страница, которую вы пытаетесь загрузить в index.php, является «pagename», используйте HTACCESS и переписывайте URL-адрес: http://corz.org/serv/ фокусы / htaccess2.php