2012-08-31 85 views
15

我正在努力讓用戶能夠生成發票和其他表格數據的PDF副本。爲此,我將dompdf包裝到一個庫中,我可以使用該庫創建一個方法,該方法將根據CI的output->get_output()的返回值生成PDF。包裝類似於this one on Github我可以將數據傳遞給Codeigniter輸出類而不顯示它嗎?

問題是,我找不到一種方法來將視圖(和PDF所需的HTML/CSS)轉換爲CI的輸出類,而不是load->view(),它將寫入瀏覽器。

我唯一的其他選擇是使用curl來請求頁面,但這看起來很愚蠢,因爲我可以從輸出緩衝區中獲取它。我只是不希望HTML發送到瀏覽器,因爲我設置標題告訴瀏覽器期望PDF。

需要明確的是,這是我想要完成(順序,我要完成它)是什麼:

  1. 盡我通常會做準備視圖顯示
  2. 負載視圖到CI輸出類,但不顯示它
  3. output->get_output()返回值傳遞給我DOMPDF庫
  4. 設置適當的頭
  5. 執行我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()才能實現這一目標。

+0

如果網頁被緩存,也許你可以從那裏得到它? – Jurgo

+0

@Jurgo不幸的是,頁面本身不能被緩存(當然,也許他們可以,但是很短的時間,這將無法可靠地工作)。 –

+1

我無法弄清楚這是怎麼回事。不知怎的,輸出類「_display」在控制器方法的末尾被自動調用(我認爲)。如果'exit'作爲控制器方法的最後一步,函數將不會被調用,您可以按照預期的方式'echo $ this-> output-> get_output()',無需任何泄漏就可以「手動」處理輸出。但是,沒有任何使用輸出類設置的頭文件將被髮送(並且事件探查器不會運行),所以它不是一個解決方案。 –

回答

10

...所以 - 我理解正確的話 - 你想要得到的全部最後的輸出(不只是視圖)作爲一個字符串,它不顯示給用戶?爲什麼不只是重載控制器_output()函數?

class Your_controller extends CI_Controller 
{ 
     function stuff() 
     { 
      // do whatever - prep $data etc 
      $this->load->view('your_view', $data); 
     } 

     function _output($output) 
     { 
      // send $output to your library - get results blah blah 
      $result_pdf_file = $this->your_pdf_library_generator($output); 

      // Show something else to the user 
      echo "hi - I'm not what you expected - but here is your PDF"; 

      echo $result_pdf_file; // or something like that 
     } 
} 

這意味着你可以發送任何你喜歡的輸出類 - 但沒有什麼是除了你想要的東西顯示。

有辦法改善這種想法(即鉤子,變量打開輸出開啓/關閉等) - 但最簡單的將是專門有此控制器爲您pdf_generation命令。

我沒有看到根據輸出類文檔進行第2步的任何方法。是否可以在不顯示輸出類的情況下查看視圖?如果是這樣,怎麼樣?我正在使用CI 2.0.3。

控制器_output()文檔實際上在CI controller documentation中,這就是爲什麼它沒有你。

+0

這是_precisely_我在找什麼。如果我首先注意到它,我就不會一直試圖擴大輸出類本身。我可以看到他們爲什麼把它放在他們所在的位置,但在輸出控制器文檔中導致它的一些麪包屑會節省一些時間:) –

+0

是的 - 我只知道來自另一個項目。順便說一句 - 是你的dompdf庫包裝的東西,你可能有興趣分享?我真的要在我的一個CI項目中使用它。如果是這樣,我的電子郵件是在我的生物 - 如果不是 - 這很酷,我明白 - 想過我只是問,並嘗試我的運氣;) – Laurence

+0

我給了一個啓發我寫的那個鏈接。它在Github上。我可以分享實際的包裝?不,這不是一個開放的項目,但我花了十分鐘寫一個,所以你有同樣的開始我做了。另外,我對此表示讚賞,明天將會發生。 –

相關問題