我正在努力讓用戶能夠生成發票和其他表格數據的PDF副本。爲此,我將dompdf包裝到一個庫中,我可以使用該庫創建一個方法,該方法將根據CI的output->get_output()
的返回值生成PDF。包裝類似於this one on Github。我可以將數據傳遞給Codeigniter輸出類而不顯示它嗎?
問題是,我找不到一種方法來將視圖(和PDF所需的HTML/CSS)轉換爲CI的輸出類,而不是load->view()
,它將寫入瀏覽器。
我唯一的其他選擇是使用curl來請求頁面,但這看起來很愚蠢,因爲我可以從輸出緩衝區中獲取它。我只是不希望HTML發送到瀏覽器,因爲我設置標題告訴瀏覽器期望PDF。
需要明確的是,這是我想要完成(順序,我要完成它)是什麼:
- 盡我通常會做準備視圖顯示
- 負載視圖到CI輸出類,但不顯示它
- 的
output->get_output()
返回值傳遞給我DOMPDF庫 - 設置適當的頭
- 執行我DOMPDF方法,將發送ŧ他PDF到瀏覽器
我不明白基於output class documentation做任何步驟2的方法。
是否可以在不顯示輸出類的情況下查看?如果是這樣,怎麼樣?我正在使用CI 2.0.3。
編輯
很有幫助Anthony Sterling指出I can just get what I want from the loader class通過設置第三個參數告訴它返回一個字符串,而不是渲染視圖爲TRUE。例如: -
$lotsaHtml = $this->load->view('fooview', $somearray, TRUE);
這將是我在特定情況下更好,因爲我並不需要加載的諧音。但是,這仍然是一個有效的(我認爲)有趣的問題,如果我可以從OB獲得相同的結果也很方便,或許我的確實有有一些偏差。這些可以連接,但是糟糕。
看來我應該可以讓輸出類不呈現任何東西(其他的爲什麼get_output()
存在?),所以我可以用它所知道的一切來做其他事情。我無法找到一種方法來實現這一點。
編輯2
一些僞(而不是從現實遠)代碼說明什麼,我希望做的,通過展示我做了什麼,然後解釋什麼,我其實想做。
比方說,我有一個公共的方法genpdf($id)
在使用名爲inv
型號命名爲invoice
控制器:
public function genpdf($invoiceId) {
$this->load->library('dompdflib');
$this->pagedata['invoice_data'] = $this->inv->getInvoice($invoiceId);
$html = $this->load->view('pdfgen', $this->pagedata, TRUE);
$this->dompdflib->sendPdf($html);
}
這幾乎等同於我有這個權利,現在運行的代碼。在那裏,我要求加載程序解析並以字符串的形式給我顯示pdfgen
視圖的結果,然後將其傳遞給我的dompdf包裝器中的函數,該函數設置標題並將PDF發送到瀏覽器。
它只是似乎這樣會很容易被剛開輸出緩衝區本身(正確設置頁眉/等)之後的事。
還是我只需要調用連續輸出類append_output()
與每一個部分我打開?
加載過多模型的多種方法需要一起工作才能生成這些模型(它們將作爲事後考慮),所以我希望只收集一切並直接從輸出類中檢索它。這可能是因爲我必須逐漸談到output->append_output()
才能實現這一目標。
如果網頁被緩存,也許你可以從那裏得到它? – Jurgo
@Jurgo不幸的是,頁面本身不能被緩存(當然,也許他們可以,但是很短的時間,這將無法可靠地工作)。 –
我無法弄清楚這是怎麼回事。不知怎的,輸出類「_display」在控制器方法的末尾被自動調用(我認爲)。如果'exit'作爲控制器方法的最後一步,函數將不會被調用,您可以按照預期的方式'echo $ this-> output-> get_output()',無需任何泄漏就可以「手動」處理輸出。但是,沒有任何使用輸出類設置的頭文件將被髮送(並且事件探查器不會運行),所以它不是一個解決方案。 –