Объединение нескольких HTML-файлов в один и возврат выходных данных

#php #templates

#php #шаблоны

Вопрос:

Я пытаюсь найти самый чистый способ объединить несколько HTML-файлов в один HTML-файл. Таким образом, я могу легко изменять части html или показывать их только на определенных страницах. Список файлов выглядит следующим образом:

  1. page.tpl (верхний, нижний колонтитулы, информация о заголовке)
  2. sidebar.tpl (содержит боковую панель и блоки боковой панели)
  3. nav.tpl(содержит ссылки навигации во вложенном UL)

Файл page.tpl выглядит следующим образом:

 <!DOCTYPE html>
<html>
<head>
<title>Page Title</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta name="author" content="Brandon" />
    <meta name="robots" content="noindex,nofollow" />
    <meta name="keywords" content="" />
    <meta name="description" content="" />
    <?php print $stylesheets; ?>
    <?php print $scripts; ?>
</head>
<body>
<section id="wrapper">
<header>Header Title</header>
<nav><?print $nav; ?></nav>
<section><?php print $content; ?></section>
<aside> <?php print $sidebar; ?><aside>
<footer>amp;copy; 2011 Brandon License: GPLv2</footer>
</section>
</body>
</html>
  

Основная функция, которую я должен включить, это:

 function theme($tpl, $vars = array()) {
    extract($vars);
    ob_start();

    require($tpl);
    $template = ob_get_contents();

    ob_end_clean();

    return $template;
}
  

$tpl устанавливается в файл page.tpl.

Я попробовал $vars['nav'] = file_get_contents('nav.tpl'); выше функции темы, просто чтобы предоставить ей некоторые данные для работы. Если я удалю переменную $ tpl и require() функцию, я увижу список UL nav, но когда я добавляю обратно файл page.tpl, я получаю эту ошибку:

 Warning: extract() expects parameter 1 to be array, null given
  

Это работает (показывает список UL nav):

 $vars['nav'] = file_get_contents('nav.tpl');
function theme($vars = array()) {
    extract($vars);
    ob_start();

    $template = ob_get_contents();

    ob_end_clean();

    return $template;
}
  

Это не:

 $vars['nav'] = file_get_contents('nav.html');
theme('page.html', $vars) //page.html is set to correct directory.
function theme($tpl, $vars = array()) {
    extract($vars);
    ob_start();

    require($tpl);
    $template = ob_get_contents();

    ob_end_clean();

    return $template;
}
  

Любая помощь в правильной работе будет оценена.

ОБНОВЛЕНИЕ: это мой текущий index.php файл:

     <?php

    define('ROOT_DIR', getcwd());

    require_once(ROOT_DIR . '/core/includes/boot.inc');

    boot_start(BOOT_FULL); 

// Based off of Drupal's drupal_bootstrap(). Set's ini_set's, database 
//and starts sessions. This works just fine and I haven't coded any 
//theme/template code into it. The only thing boot_start() does for theme is 
//load the .inc file that has the theme() function. The .inc gets included
// otherwise I would have gotten a "call to unknown function" error.

    $vars['nav'] = file_get_contents(ROOT_DIR . '/core/templates/nav.tpl');
    theme('./core/templates/page.tpl', $vars);
  

Я не совсем понимаю, почему я получаю сообщение об ошибке extract() . Когда я добавляю $vars['nav'] без включения ‘include ($ tpl)’, извлечение работает просто отлично. Это происходит до тех пор, пока я не попытаюсь включить файл page.tpl.

Файл page.tpl должен загружаться при каждом запросе страницы, который выводит что-либо. Поэтому я думаю, что мне нужна только theme ($ vars) вместо theme ($ tpl, $ vars = array())

Есть ли способ, которым я могу включить page.tpl, не передавая его в theme(), передавая при этом $vars, чтобы $vars[‘nav’] переопределял <?php print $nav; ?> тег в page.tpl? Спасибо.

РЕШАЕМАЯ: Чувак, я не могу поверить, что мне потребовалось так много времени, чтобы исправить это. Поскольку theme() вернула, а не повторила данные, мне пришлось назначить $theme = theme('page.tpl', $vars); then echo $theme; Помимо нескольких уведомлений PHP, это работает.

Комментарии:

1. Брэндон, не могли бы вы принять некоторые из ваших предыдущих ответов на вопросы?

2. Моб, спасибо. Я принял несколько своих вопросов, на которые было несколько ответов.

Ответ №1:

Лично мне просто нравится создавать файл для отдельных частей. а затем включите их.

 <?php include('relative/link.php'); ?>
  

если вы хотите отредактировать содержимое раздела, я бы использовал переменные.
header.php

 echo $foo;
  

index.php

 $foo='bar';
include('header.php');
  

когда мы включаем файл, он захватывает содержимое и вставляет его в текущий файл, а затем обрабатывает его.

Комментарии:

1. ямико, я создаю скрипт, который полагается на внешний контроллер. Пока скрипт проходит процесс начальной загрузки, затем перенаправляется на нужную страницу через переменную GET (q = ‘страница / редактирование’). Я основываю большую часть своего кода на том, как работает Drupal. Мне также нравится, как Drupal обрабатывает тематизацию, поэтому я хочу подражать этому.

2. к сожалению, я не могу вам здесь помочь. надеюсь, кто-нибудь еще придет на помощь.