У меня проблемы с передачей строки при использовании функции include(). У меня есть index.php, который служит файлом шаблона и включает любые другие страницы.
Например, если я хочу перейти на домашнюю страницу, адрес будет http://somethingsomething.com/index.php?page=home, а подключаемый файл будет pages/home.php. Ниже вы можете узнать, как работает система шаблонов. Я хочу изменить страницу, на которой вы сейчас находитесь, но я не знаю, как лучше всего передать эту строку из заголовка страницы. Итак, если я нахожусь на странице каталога - http://somethingsomething.com/index.php?page=catalogue, он будет включать в себя файл pages/catalogue.php, и я пытался передать строку как SESSION, но это не сработало. Не могли бы вы мне помочь?
Исходный URL: http://somethingsomething.com/index.php?page=catalogue
файл index.php
<html>
<head>
<title><?php echo $title; ?></title>
</head>
<body>
<h1>Welcome, world!</h1>
<?php
if (isset($_GET['page'])) {
$page = $_GET['page'];
} else {
$page = 'home';
}
if (preg_match('/^[a-z0-9]+$/', $page)) {
$insert = include('pages/' . $page . '.php');
if (!$insert) {
$insert = include('pages/error.php');
}
} else if (empty($page)) {
$insert = include('pages/error.php');
} else {
$insert = include('pages/error.php');
}
?>
</body>
</html>
файл pages/catalogue.php
<?php
$title = "Catalogue";
?>
Чтобы уточнить, в настоящее время вы вызываете $ title в самом верху, но он не определяется до тех пор, пока не будет вызвана функция include().
Я знаю об этом, но как я могу включить его содержимое в раздел <body>?
Одним из способов было бы использовать выходной буфер там... php.net/manual/en/ref.outcontrol.php
Могу ли я загрузить его, прежде чем использовать $title, а затем просто повторить его в теле? Или есть лучшее решение?
Определите значение $page, прежде чем назначать/использовать $title. Затем используйте это значение, чтобы получить значение $title из некоторого сопоставления (статический массив, база данных и т. д.).
Таким образом, вы выгружаете любой вывод из включаемого файла в переменную и повторяете эту переменную позже в коде. Нужно, чтобы я конкретизировал это в ответе?
@Stevish Это было бы здорово, спасибо. Я никогда не работал с буфером.
Вам нужно реструктурировать свой код, чтобы он был более логически организован. Если у вас есть логика, определяющая содержимое страницы (например, заголовок и т. д.), сначала определите ее и включите соответствующий код.
@NigelRen Вы предлагаете что-то, как это сделать, пожалуйста?






Что-то вроде этого?
<?php
ob_start();
if (isset($_GET['page'])) {
$page = $_GET['page'];
} else {
$page = 'home';
}
if (preg_match('/^[a-z0-9]+$/', $page)) {
$insert = include('pages/' . $page . '.php');
if (!$insert) {
$insert = include('pages/error.php');
}
} else if (empty($page)) {
$insert = include('pages/error.php');
} else {
$insert = include('pages/error.php');
}
$output = ob_get_clean();
?>
<html>
<head>
<title><?php echo $title; ?></title>
</head>
<body>
<h1>Welcome, world!</h1>
<?php
echo $output;
?>
</body>
</html>
И все или надо как-то сбрасывать или заканчивать буферизацию в конце?
ob_get_clean() в основном отключает выходной буфер после возврата его содержимого, поэтому больше ничего делать не нужно
Вам нужно включить файл, который определяет $title, ДО того, как вы будете использовать $title. Я думаю, что это единственная проблема здесь.