[PHP] отдельные страницы или include?

gaalint

Предположим, есть некий портал, состоящий из 20 (для примера) разделов. В каждом их этих разделов:
- одно и то же верхнее меню
- одно и то же боковое меню
- подвал всегда один и тот же
- для каждого раздела проверяется, имеет ли пользователь право его просматривать (на портале предусмотрена система регистраций с разными "статусами", дающими разные права)
- верстка (самые ее основы, div-блоки, выравнивающие эти самые меню и подвал) для всех разделов одинакова.
Надо заметить, что окончательной верстки (и дизайна) нет, причем появятся они не раньше написания 30% серверной части (ну вот так сложилось).
По сути, отличается только контент, отображаемый где-то посередине страницы.
Теперь, собственно, вопрос:
Есть два варианта:
1. Каждый раздел - отдельной папкой на сервере, меню и прочее добро вставляются в нужные места через php include, html-верстка для каждой страницы существует отдельно и в случае чего переписывается. При этом в каждом разделе прописывается проверка прав только для него.
2. Существует единственная index.php, в которой созданы меню-хедеры-подвалы, а в зависимости от window.location в части контента делается include необходимого раздела. При это в начале этого самого index.php идет многокилометровая проверка прав, парсинг строки запроса и т.д. + к этому надо ещё настраивать mod_rewrite. Зато верстка-дизайн-логика прописываются один раз и навсегда :)
Собственно, вопросы:
1. Какой из этих двух вариантов правильный?
2. Как это вообще у людей делается? о_О

sutulin

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

<?
require_once("templating.php");
Templating::SetMasterPage("template.php");

$title="My title";

?>

SITE CONTENT

<?
Templating::Render($dblink,array_diff(get_defined_vars array(array;
?>


Пример файла-шаблона:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
<link href="css/style.css" rel="stylesheet" type="text/css" />
<title><? echo $title; ?></title>
</head>
<body>
<?=$PageContent?>
</body>
</html>

Ну и, наконец, файл с шаблонизатором

<?

class Templating
{

public static $masterpage;
public static $dblink;

public static function SetMasterPage($file)
{
ob_start;
self::$masterpage = $file;
}

// в переменной $vars передаются переменные из основного пространства имен
// dblink - ссылка на дескриптор базы данных
public static function Render($dblink, $vars)
{

$PageContent = ob_get_contents;
ob_end_clean;

$title = $vars['title'];

include(self::$masterpage);
}


}

?>

gaalint

Спасибо большое! Попробую применить этот метод.

alexkravchuk

Более принятый способ, наверное, когда в приложении есть одна основная точка входа, условно index.php, на которую перенаправляются запросы, с помощью .htaccess.
1-ый, этап, в точке входа обрабатывается ввод (url, cookie и т.п. система выясняет, какой был запрос, первичная проверка прав может быть. Это иногда называют "контроллерами".
2-ой этап, происходит основная работа, получение/обновление данный из БД или откуда-либо ещё, обработка данных и.п.
3-ий этап, из этих данных генерируются сами страницы. Соответствующие модули называют традиционно "представлениями" (views)
Простейшая реализация представления:
============================
function runView($view_name, $data)
{
foreach($data as $mkey => $val)
$$mkey = $val;

ob_start;
include("./views/".$view_name.".php");
return ob_get_clean;
}
============================
достаточно подать на вход массив с данными для вывода, а в каталоге views уже размещать шаблоны вывода.

LevaLeva

2. Существует единственная index.php,
Ессно это правильный путь. причем теже подвалы и хедеры в него надо инклудить - они в отдельных файлах должны быть
ну а собсно в центре там должно быть что то вроде include $page.".php";
и все ссылки внутри сайта должны быть вида index.php?page=blabla либо ссылки могут быть ввиде папок но тогда надо подмутить MOD REWRITE
Оставить комментарий
Имя или ник:
Комментарий: