是否可以将数据传递到 Codeigniter 输出类而不显示它?

2022-08-31 01:19:36

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

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

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

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

  1. 执行我通常要执行的所有操作,以便为显示准备视图
  2. 将视图加载到 CI 输出类中,但不显示它
  3. 将 的返回值传递给我的 dompdf 库output->get_output()
  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);
}

这几乎与我现在使用的代码相同。在那里,我要求加载程序解析并将视图的结果作为字符串提供给我,我将其传递给我的dompdf包装器中的函数,该函数设置标头并将PDF发送到浏览器。pdfgen

这似乎很容易通过获取输出缓冲区本身(在正确设置标头后/等)来做到这一点。

还是我只需要在加载每个部分时连续调用输出类?append_output()

加载大量模型的多个方法需要协同工作才能生成这些模型(它们是事后才想到的),所以我希望只是收集所有模型并直接从输出类中检索它。可能我只需要逐渐交谈才能实现这一目标。output->append_output()


答案 1

...所以 - 我理解正确吗 - 你想把整个最终输出(不仅仅是视图)作为一个字符串,而不是向用户显示它?为什么不直接重载控制器_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 控制器文档中,这就是为什么它无法满足您的需求的原因。


答案 2

推荐