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

时间:2012-08-31 06:43:13

标签: php codeigniter codeigniter-2 dompdf

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

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

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

要清楚,这就是我想要完成的事情(按照我想要完成的顺序):

  1. 做我通常做的所有事情来准备显示视图
  2. 将视图加载到CI输出类,但不显示
  3. output->get_output()的返回值传递给我的dompdf库
  4. 设置适当的标题
  5. 执行我的dompdf方法,将PDF发送到浏览器
  6. 我认为没有办法根据output class documentation执行第2步。

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

    修改

    非常有帮助的Anthony Sterling通过设置第三个参数来指示I can just get what I want from the loader class告诉它返回一个字符串而不是将视图渲染为TRUE。 E.g:

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

    这在我的特定实例中会更好,因为我不需要加载partials。然而,这仍然是一个有效的(我认为)有趣的问题,知道我是否可以从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);
    }
    

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

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

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

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

1 个答案:

答案 0 :(得分: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 controller documentation中,这就是为什么它没有找到你。