2014-10-19 3 views
0

У меня есть простая система рендеринга шаблонов, которая включает в себя файл PHP заголовка, шаблона и нижнего колонтитула. Заголовок имеет один вызов функции PHP для отображения панели навигации. Шаблон имеет вызов функции, который устанавливает заголовок ('location ...'); а нижний колонтитул - просто базовый HTML.Странные заголовки PHP уже отправлены

Когда я просматриваю страницу, я получаю сообщение «уже отправленные заголовки», указав строку в заголовке, которая заставляет вызов эха покинуть панель навигации. Если я модифицирую код для удаления дочерних элементов в навигации, я не получаю ошибку «отправленные заголовки». Элементы-дочерние элементы - это не что иное, как элементы массива. Если я заменю их фиктивным текстом, страница будет перенаправлена ​​правильно.

Я предполагаю, что это что-то очень простое, но это меня озадачило!

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>'; 

Тогда это нормально. Я не понимаю, почему включение двух строк элемента массива приведет к сломанию «заголовков».

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

ответ

1

Увидев заказ, который вы загружаете, все это может помочь, но на основе того, что у вас есть, я подозреваю, что вы что-то визуализируете (например, навигация) перед установкой заголовков в template.php. Вы можете указать reference this answer, а также отправить более конкретный код, который показывает, в каком порядке загружаются файлы шаблонов.

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. 
+0

Спасибо за ваш ответ. У меня сначала был поиск, и я нашел этот пост. У меня есть функция рендеринга, которая делает «include» для заголовка, файла, затем делает файл_get_contents & echo на шаблоне, и, наконец, еще один включает нижний колонтитул. Это странно, потому что я нахожусь, чтобы прокомментировать элементы дочернего навигатора, чтобы он работал. Я бы понял, если какой-либо вывод из заголовка вызвал ошибку, но это только те $ дочерние элементы. –

Смежные вопросы