我可以将数据传递给Codeigniter输出类而不显示它吗?

Tim*_*ost 15 php codeigniter dompdf codeigniter-2

我正在努力让用户能够生成发票和其他表格数据的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来从loader类中得到我想要的东西.例如:

$lotsaHtml = $this->load->view('fooview', $somearray, TRUE);
Run Code Online (Sandbox Code Playgroud)

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

看起来我应该能够让输出类不呈现任何东西(否则,为什么get_output()存在?)所以我可以用它知道的所有东西做其他事情.我找不到让这种情况发生的方法.

编辑2

一些伪(但不远离现实)的代码说明我希望做什么,通过展示我做了什么,然后解释我实际想做什么.

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

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);
}
Run Code Online (Sandbox Code Playgroud)

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

只是通过获取输出缓冲区本身(在正确设置标头/等之后),这似乎很容易做到.

或者我只需要append_output()在每次加载部分时连续调用输出类?

加载过多模型的多个方法需要一起工作才能生成这些(它们是作为事后的想法进行的),所以我希望只收集它并直接从输出类中检索它.可能是我必须逐渐谈谈output->append_output()以实现这一目标.

Lau*_*nce 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
       }
 }
Run Code Online (Sandbox Code Playgroud)

这意味着您可以将您喜欢的任何内容发送到输出类 - 但除了您想要的内容之外不会显示任何内容.

有一些方法可以改进这个想法(即钩子,变量来打开/关闭输出等) - 但最简单的方法是将这个控制器专门用于你的pdf_generation命令.

我没有看到基于输出类文档执行第2步的任何方法.是否可以在不显示输出类的情况下获取视图?如果是这样,怎么样?我正在使用CI 2.0.3.

控制器_output()文档实际上在CI控制器文档中,这就是为什么它没有找到你.