[英]PHP output buffer control
我有一系列物品。 有兩種“類型”或項目:標題行和常規行。 我只想在標題下有任何“常規”行時打印標題(在下一個標題之前)。
(這是一種簡化-實際上,我將無法查看當前迭代中的下一項)。
為了解決這個問題,我使用了緩沖區控制。 我在每個標題行清除並啟動緩沖區,然后在每個常規行中刷新緩沖區。 因此,如果標題后面沒有標題,則不會打印該標題(緩沖區將被清除),如果有常規行可以將其刷新,則該標題將被刷新。
(偽代碼)
for i in array:
if i is heading:
ob_end_clean();
ob_start();
echo "header $i";
else:
ob_end_flush();
echo "regular $i"
這很好。
問題是,我可以選擇將頁面下載為PDF,這使它崩潰了。 它的工作方式是:打開pdf標志,在頁面頂部,啟動緩沖區,在代碼底部,將緩沖區轉儲到變量中並作為字符串發送到pdf api。 現在,緩沖區通過ob_end_flush()發送給用戶,當我嘗試下載pdf時會產生此錯誤:
cannot modify header information - headers already sent.
我喜歡我的解決方案,但是有辦法使它起作用嗎? 還是從一開始就是一個不好的解決方案? 謝謝
而不是輸出到緩沖區,而是輸出到文件緩沖區 。 然后,僅發送整個文件(這有點棘手,但是如果正確管理重定向,它應該可以正常工作):
偽代碼:
for i in array:
if i is heading:
// output to file buffer
echo "header $i";
else:
// stop output to file buffer
echo "regular $i"
我的建議是,即使您看不到下一項,我認為您也可以跟蹤上一項。 我認為無論您使用哪種輸出方法,這都應該有效。
$previous = '';
foreach ($rows as $row) {
if ($row == 'header') {
// Wait to print header rows depending on what the next row is.
$previous = $row;
} else {
// For regular rows, print the preceding header row (if there is one.)
echo $previous;
echo $row; // Print the regular row.
$previous = ''; // Then clear the saved header row.
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.