2011-12-11 4 views
2

이것은 내 마음이 꼬인 것입니다. 분명히 PHP는 문제가 있음을 알기도 전에 미리 처리 할 수 ​​없습니다.문자열을 HTML 헤더에 에코하기

나는 문서의 머리글이있어 :

<? $site = new core(); 
register_shutdown_function(shutdown); 
echo $site->insert_to_header(); ?> 

을 그리고 더 아래, 의도적으로 넣어 :

echo $test; 

경고를 만들려면. 이것은 그 다음과 같습니다, shutdown();로 이동됩니다 :

class core { 
function shutdown() { 
$a = error_get_last(); 
if ($a == null) { 
    echo "No errors"; 
} else { 
    core::insert_to_header_cache('<link rel="stylesheet" href="core.css" type="text/css" />'); 
    core::insert_to_body_cache('<div class="error-handler"><h3>Error!</h3> 
    <br/>Error type: <strong>' . $a[type] . '</strong> 
    <br/>Error message: <strong>' . $a[message] . '</strong> 
    <br/>Located in: <strong>' . $a[file] . '</strong> 
    <br/>Line: <strong>' . $a[line] . '</strong> 
    </div>'); 
} 
} 
//TODO Teleport variables to here, without doing that beforehand, this whole thing is broken :(
function insert_to_header_cache($insertion ='') { 
    $headercache += $insertion . '/n'; 
    return true; 
} 

function insert_to_body_cache($insertion ='') { 
    $bodycache += $insertion . '/n'; 
    return true; 
}  
function insert_to_header() { 
    global $headercache; 
    echo $headercache; 
    return true; 
} 

function insert_to_body() { 
    global $bodycache; 
    return $bodycache; 
} 
} 

내 문제는 그 시점을지나 이미 때, 어떻게 헤더로 다시 출력으로 내 insert_to_header_cache 기능을 얻을 수있다?

글로벌 $bodycache$headercache이 작동하지 않는다는 점을 명심하십시오. 그러나 여기에는 문제가 없습니다. 사전에 아무 것도 울리지 않으면 작동하지 않습니다. 질서 때문에 나는 그 정도를 압니다. 사전에

감사합니다,

에반 해리슨은

+1

대신, 컨트롤러 내에서 echo's'peppering 당신의 처리가 완료되면, 오직 맨 끝에 출력에 각 블록을 당신의 모든 기능을 호출하지 시작할 수 있습니다. –

+0

나는 그들이 작업하는 동안 진행되고있는 일들을보기 위해 그 곳곳으로 피가 .다. –

+0

이것이 제가 말하고자하는 것입니다 : http://codepad.org/Ny3Zxk5L 참고로, 이것은 매우 단순한 예입니다. 그러나 전반적인 개념은 같습니다. –

답변

1

내 제안은 그렇지 않습니다. 모든 처리가 완료되고 스크립트, 스타일 시트 또는 기타 자원 주입이 Page 객체에서 수행 될 때까지 아무 것도 출력하지 않습니다. 보기가 완전히 준비 될 때까지 기다렸다가 출력을 컴파일하면 head 태그와 같이 스크립트 및 스타일 시트와 같은 것들을 훨씬 더 많이 제어 할 수 있습니다.

다음은 제가 말하고자하는 것을 보여주기위한 단순한 예입니다. 예를 들어 scriptstylesheet URL 목록을 반환하는 호출을 사용하여 뷰를 나타내는 PHP 파일을 가리키는 대신 메서드 대신 buildOutput() 메서드를 사용할 수 있습니다.

<?php 

class page { 

    private $head; 
    private $body; 

    public function __construct(){ 
     $this->head = array('scripts'=>array(),'styles'=>array()); 
     $this->body = ''; 
    } 

    public function addStylesheet($link) { 
     $this->head['styles'][] = $link; 
    } 

    public function addScript($link) { 
     $this->head['scripts'][] = $link; 
    } 

    public function setBody($content) { 
     $this->body = $content; 
    } 

    public function buildOutput() { 
     $c_styles = count($this->head['styles']); 
     $c_scripts = count($this->head['scripts']); 
     $styles = ''; 
     $scripts = ''; 

     for ($i = 0; $i < $c_styles; $i++) { 
      $styles .= '<link rel="stylesheet" type="text/css" href="'.$this->head['styles'][$i].'" />'."\n"; 
     } 

     for ($i = 0; $i < $c_scripts; $i++) { 
      $scripts .= '<script src="'.$this->head['scripts'][$i].'"></script>'."\n"; 
     } 

     $html = " 
<html> 
<head> 
$styles 
$scripts 
</head> 
<body> 
$this->body 
</body> 
</html> 
"; 
     return $html; 
    } 

} 

$page = new page; 

$page->addStylesheet('http://www.example.com/my.css'); 
$page->addStylesheet('http://www.example.com/their.css'); 
$page->addScript('http://www.example.com/my.js'); 
$page->addScript('http://www.example.com/their.js'); 
$page->setBody('<p>This is my body</p>'); 

echo $page->buildOutput(); 

?> 

http://codepad.org/Ny3Zxk5L

+0

축하해. 내가 마지막으로 대답했을 때 2am 이었어. 그래서 나는 자러 갔다. 그러나 결코 두려워하지 마라, 나는 이것을 올바른 것으로 표시했다! –

2

당신은 출력 버퍼링을 사용할 수 있습니다. 몇 마디로 말하자면, 문자열을 클라이언트로 보내기 전에 모든 출력을 수집 할 수 있으며, 마지막에는 출력을 조작하여 최종적으로 클라이언트에게 보낼 수 있습니다.

+0

기술적으로 출력 버퍼링은 머리글이 출력되지만 나중에 조정해야하기 때문에 문제가 해결되지 않습니다. 헤더의 모든 부분을 모으고, 스크립트가 끝나기 전에 마지막 부분에서 가장 가까운 순간에 헤더 (그리고 다른 모든 내용)를 생성하는'buildOutput()'함수/메소드를 호출하는 것이 해결책이다 . –

+0

이것은 모든 HTML 마크 업이 클래스 함수에 대한 절차 적 호출이 아니라 변수에 있어야한다는 것을 의미합니까? 메인 페이지를 구성 할 때도 할 수 있습니까? (객체 생성과는 다른 파일에 클래스가 있습니다.) –

+0

아니요,이 의미는 아닙니다. 당신은'ob_start' 함수를'ob_get_contents' 함수를 호출하고 그 문자열로 수정하고 클라이언트에게 출력해야하는 모든 출력의 끝에 스크립트 끝 부분에 추가하면됩니다. http://php.net/manual/en/book.outcontrol.php 여기에서 자세한 내용을 확인할 수 있습니다 – haynar

관련 문제