2009-09-22 87 views
1

我需要創建許多不同文件格式的任意數量的報告。大多數格式我都可以使用Smarty來模擬輸出。但是,輸出到Excel和PDF會使事情複雜化並需要使用FPDF或TCPDF和PHPExcel。尋找一些OOAD報告的建議

我想弄清楚通過一個或多個設計模式(如果可能)組織我的課程的最佳方法。

輸出格式:

  • 文本 - Smarty的
  • 文本(W/PCL格式) - Smarty的
  • CSV - Smarty的
  • HTML - Smarty的
  • Excel中 - PHPExcel
  • PDF - FPDF/TCPDF

這些格式需要能夠在內存中傳輸或寫入文件供以後使用。

在所有報告中唯一一致的是,他們需要數據,直到添加PDF和Excel支持模板。目前我有一個Report類,它有一個名爲getData()的抽象方法。每個子類(例如SpecificReport)獲取它需要的數據並將其存儲在類屬性中以便綁定到模板等。

每個報告都需要以所有格式提供。

Report類目前處理輸出,但添加對Excel和PDF的支持使得這不可能。除了將數據綁定到像Smarty這樣的模板之外,還有很多。每份報告都需要特定的代碼我想我可以在每個報表子類中重載這些方法。

有沒有人遇到類似的任務?

回答

1

聽起來像你可以使用Two Step View pattern

基本上,您的報告會通過兩次渲染。第一遍對您的模型執行報告邏輯以生成一種原始報告對象。第一次通過的原始報告包含報告中的所有信息,並按報告的需要進行組織和分組。

完成此操作後,原始報告被輸入到一個模板中,該模板將其呈現爲特定格式(pdf,xls,csv,無論)。第二遍生成報告的字節,可以將其存儲到文件或通過線路發送出去。

+0

我認爲這是一個很好的模式/想法。最難的部分將是創建Excel和PDF格式的中間階段。如果我想創建一個將任何模板寫入Excel文件或流的ExcelWriter類型類,我基本上必須爲這些標籤創建標籤方案和解釋器。 我認爲這種模式是我最初想的,但被我剛剛提到的東西嚇住了。也許我只是想讓它變得更容易。 =) –

+0

不要使用標籤方案和解釋器。讓您的中間報告成爲對象圖。然後讓您的渲染器讀取該對象圖並將它們翻譯成報告。 PofEAA中的 –

+0

Fowler說,當屏幕之間幾乎沒有共同性時(如我們的報告),這種模式不能很好地工作。這是否適用於此?報告數據完全相同,但我無法想象中間狀態(對象圖),可以使用該中間狀態來創建完全獨立的輸出,而無需使用特定於該報告的代碼。原始報告對象似乎可能在PDF和Excel格式之間有足夠的差異。我真的很喜歡這個想法,我只是試圖圍繞它如何爲我工作。 –