16

我正在努力让用户能够生成发票和其他表格数据的 PDF 副本。为此,我将dompdf包装到一个可以与 CI 一起使用的库中,并创建了一个方法,该方法将根据 CI 的返回值生成 PDF output->get_output()。包装器类似于Github 上的这个

问题是,我想不出一种方法将视图(以及 PDF 所需的 HTML/CSS)放入 CI 的输出类中,而不是load->view(),它将写入浏览器。

我唯一的其他选择是使用 curl 来请求页面,但这似乎很愚蠢,因为我可以从输出缓冲区中得到它。我只是不希望将 HTML 发送到浏览器,因为我设置了标题告诉浏览器期待 PDF。

需要明确的是,这就是我想要完成的(按照我想要完成的顺序):

  1. 做我通常会做的一切来准备要显示的视图
  2. 将视图加载到 CI 输出类中,但不显示它
  3. 将返回值传递output->get_output()给我的 dompdf 库
  4. 设置适当的标题
  5. 执行我的 dompdf 方法,将 PDF 发送到浏览器

根据输出类文档,我看不到任何执行步骤 2 的方法。

是否可以在不显示的情况下查看输出类?如果是这样,怎么做?我正在使用 CI 2.0.3。

编辑

非常有帮助的Anthony Sterling指出,我可以通过设置第三个参数告诉加载器类返回一个字符串而不是将视图呈现为 TRUE,从而从加载器类中获取我想要的东西。例如:

$lotsaHtml = $this->load->view('fooview', $somearray, TRUE);

这在我的特定情况下会更好,因为我不需要加载部分。但是,这仍然是一个有效且(我认为)有趣的问题,如果我确实有一堆部分,那么知道我是否可以从 OB 得到相同的结果也会很方便。这些可以连接起来,但是很糟糕。

似乎我应该能够让输出类不渲染任何东西(否则,为什么get_output()存在?)所以我可以用它知道的一切做其他事情。我只是找不到实现这一目标的方法。

编辑 2

一些伪代码(但离现实不远)通过展示我所做的然后解释我真正想做的来说明我希望做什么。

假设我在使用名为的模型命名genpdf($id)的控制器中有一个公共方法:invoiceinv

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()才能实现这一目标。

4

1 回答 1

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 控制器文档中,这就是它躲避您的原因。

于 2012-09-08T11:32:45.797 回答