У меня есть простая система рендеринга шаблонов, которая включает PHP-файл заголовка, шаблона и нижнего колонтитула. Заголовок имеет один вызов функции PHP для отображения панели навигации. Шаблон имеет вызов функции, который устанавливает заголовок (‘location …’); и нижний колонтитул это просто базовый HTML.
Когда я просматриваю страницу, я получаю сообщение об ошибке «заголовки уже отправлены», в котором указывается строка в заголовке, которая вызывает вызов на панели навигации. Если я изменю код, чтобы удалить дочерние элементы в навигации, я не получу ошибку «заголовки уже отправлены». Дочерние элементы — это не более чем элементы массива. Если я заменю их фиктивным текстом, то страница перенаправляется правильно.
Я представляю, что это что-то очень простое, но это поставило меня в тупик!
header.php (переданный int определяет глубину сканирования)
<ul class="nav navbar-nav"><?php echo getNavigation(1); ?></ul>
template.php
// Run from start
default:
$_SESSION['updateStart'] = microtime(true);
$_SESSION['updateErrors'] = array();
$_SESSION['updateLog'] = array();
header('location: /update-products?action=getDataFeeds');
exit();
break;
Функция getNavigation:
function getNavigation($depth) {
global $path, $misc;
$items = $misc->getNavigation(1,(int)$depth,true);
$nav = "";
if($items) {
foreach($items as $item) {
$class = ($item['ob_alias']==("/".$path[0])?' class="active"':'');
$nav .= '<li'.$class.'>';
if(isset($item['children'])) {
$nav .= '<a href="#" class="dropdown-toggle" data-toggle="dropdown">'.$item['ob_label'].' <span class="caret"></span></a>';
$nav .= '<ul class="dropdown-menu" role="menu">';
foreach($item['children'] as $child) {
$class = ((isset($path[1]) && $child['ob_alias']==("/".$path[1]))?' class="active"':'');
$nav .= '<li'.$class.'><a href="'.$child['ob_alias'].'">'.$child['ob_label'].'</a></li>';
}
$nav .= '</ul>';
} else {
$nav .= '<a href="'.$item['ob_alias'].'">'.$item['ob_label'].'</a>';
}
$nav .= '</li>';
}
}
return $nav;
}
Я пытался пройтись по своему коду и все, что я могу сделать, чтобы переключить ошибку Vs. запуск страницы, как ожидалось, должен заменить эту строку в моем вызове getNavigation ():
$nav .= '<li'.$class.'><a href="'.$child['ob_alias'].'">'.$child['ob_label'].'</a></li>';
с
$nav .= '<li>Some dummy text</li>';
Тогда все в порядке. Я не могу понять, почему включение двух строк элемента массива сломало бы «заголовки».
Любая помощь или указатели для того, чтобы проверить вещи, будет приветствоваться.
Просмотр порядка загрузки всего этого может помочь, но исходя из того, что у вас есть, я подозреваю, что вы что-то рендерите (например, nav) перед установкой заголовков в template.php. Вы можете захотеть ссылаться на этот ответ а также разместить более конкретный код, показывающий, в каком порядке загружаются файлы шаблонов.
Functions that send/modify HTTP headers must be invoked before any output is made.
Otherwise the call fails.
Output can be:
Unintentional:
Whitespace before <?php or after ?>
UTF-8 Byte Order Mark
Previous error messages or notices
Intentional:
print, echo and other functions producing output (like var_dump)
Raw <html> areas before <?php code.
Других решений пока нет …