Лучший способ передачи строки при включении файла

У меня проблемы с передачей строки при использовании функции 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, ДО того, как вы будете использовать $title. Я думаю, что это единственная проблема здесь.

Stevish 30.05.2019 19:50

Чтобы уточнить, в настоящее время вы вызываете $ title в самом верху, но он не определяется до тех пор, пока не будет вызвана функция include().

Stevish 30.05.2019 19:51

Я знаю об этом, но как я могу включить его содержимое в раздел <body>?

Jan Radosta 30.05.2019 19:51

Одним из способов было бы использовать выходной буфер там... php.net/manual/en/ref.outcontrol.php

Stevish 30.05.2019 19:52

Могу ли я загрузить его, прежде чем использовать $title, а затем просто повторить его в теле? Или есть лучшее решение?

Jan Radosta 30.05.2019 19:53

Определите значение $page, прежде чем назначать/использовать $title. Затем используйте это значение, чтобы получить значение $title из некоторого сопоставления (статический массив, база данных и т. д.).

Patrick Q 30.05.2019 19:53

Таким образом, вы выгружаете любой вывод из включаемого файла в переменную и повторяете эту переменную позже в коде. Нужно, чтобы я конкретизировал это в ответе?

Stevish 30.05.2019 19:53

@Stevish Это было бы здорово, спасибо. Я никогда не работал с буфером.

Jan Radosta 30.05.2019 19:54

Вам нужно реструктурировать свой код, чтобы он был более логически организован. Если у вас есть логика, определяющая содержимое страницы (например, заголовок и т. д.), сначала определите ее и включите соответствующий код.

Nigel Ren 30.05.2019 20:05

@NigelRen Вы предлагаете что-то, как это сделать, пожалуйста?

Jan Radosta 30.05.2019 20:09
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
10
28
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Что-то вроде этого?

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

И все или надо как-то сбрасывать или заканчивать буферизацию в конце?

Jan Radosta 30.05.2019 20:02
ob_get_clean() в основном отключает выходной буфер после возврата его содержимого, поэтому больше ничего делать не нужно
Stevish 30.05.2019 21:03

Другие вопросы по теме