#php #templates
#php #шаблоны
Вопрос:
Я пытаюсь найти самый чистый способ объединить несколько HTML-файлов в один HTML-файл. Таким образом, я могу легко изменять части html или показывать их только на определенных страницах. Список файлов выглядит следующим образом:
- page.tpl (верхний, нижний колонтитулы, информация о заголовке)
- sidebar.tpl (содержит боковую панель и блоки боковой панели)
- 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. к сожалению, я не могу вам здесь помочь. надеюсь, кто-нибудь еще придет на помощь.