寻找一些关于报告的 OOAD 建议

发布于 2024-08-05 16:07:44 字数 677 浏览 6 评论 0原文

我需要以多种不同的文件格式创建任意数量的报告。大多数格式我都可以使用 Smarty 来模板化输出。但是,输出到 Excel 和 PDF 会使事情变得复杂,并且需要使用 FPDF 或 TCPDF 和 PHPExcel。

我试图找出通过一种或多种设计模式(如果可能)来组织课程的最佳方式。

输出格式:

  • 文本 - Smarty
  • Text(带 PCL 格式) - Smarty
  • CSV - Smarty
  • HTML - Smarty
  • Excel - PHPExcel
  • PDF - FPDF / TCPDF

这些格式需要能够在内存中进行流式传输或写入文件以供以后使用。

所有报告中唯一一致的是它们需要数据,并且在添加 PDF 和 Excel 支持之前需要模板。目前我有一个 Report 类,它有一个名为 getData() 的抽象方法。每个子类(例如 SpecificReport)获取所需的数据并将其存储在类属性中以绑定到模板等。

每个报告都需要以所有格式提供。

Report 类目前处理输出,但添加对 Excel 和 PDF 的支持使得这变得不可能。不仅仅是像 Smarty 这样将数据绑定到模板。每个报告都需要特定的代码。我想我可以在每个报告子类中重载这些方法。

有人遇到过类似的任务吗?

I have the need to create an arbitrary amount of reports in many different file formats. Most of the formats I am able to use Smarty to template the output. However, outputting to Excel and PDF complicate things and require the use of FPDF or TCPDF and PHPExcel.

I am trying to figure out the best way to organize my classes via one or more design patterns (if possible).

Output formats:

  • Text - Smarty
  • Text (w/PCL formatting) - Smarty
  • CSV - Smarty
  • HTML - Smarty
  • Excel - PHPExcel
  • PDF - FPDF / TCPDF

These formats need to be able to be in memory for streaming or written to file for later use.

The only thing that is consistent across all reports is that they need data and up until the addition of PDF and Excel support, a template. Currently I have a Report class that has an abstract method called getData(). Each subclass (e.g. SpecificReport) gets the data it needs and stores it in a class property for binding to a template etc.

Each report needs to be available in all formats.

The Report class handles the output at the moment, but adding support for Excel and PDF is making that impossible. There is a lot more than just binding the data to a template like with Smarty. Each report requires specific code. I suppose I could just overload those methods in each report subclass.

Has anyone encountered a similar task?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

§对你不离不弃 2024-08-12 16:07:44

听起来您可以使用两步视图模式

本质上,您的报告分两次呈现。第一遍针对您的模型执行报告逻辑以生成某种原始报告对象。第一遍原始报告包含报告中的所有信息,并根据报告的需要进行组织和分组。

完成后,原始报告将被输入模板,将其呈现为特定格式(pdf、xls、csv 等)。第二遍生成报告的字节,可以将其存储到文件中或通过网络发送出去。

Sounds like you could use the Two Step View pattern.

Essentially, your reports get rendered in two passes. The first pass executes the report logic against your model to generate a sort of proto-report object. The first pass proto-report has all the information that goes on the report, organized and grouped as the report needs it.

Once this is complete, the proto-report is fed into a template that renders it to a particular format (pdf, xls, csv, whatever). This second pass generates the report's bytes, which can be stored to a file or sent out over the wire.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文