我正在努力让用户能够生成发票和其他表格数据的PDF副本。为此,我将dompdf包装到一个可以与CI一起使用的库中,并创建了一个方法,该方法将根据CI output->get_output()
的返回值生成PDF。包装器类似于this one on Github。
问题是,我无法找到一种方法来将视图(以及PDF所需的HTML / CSS)放到CI的输出类中,而不是load->view()
,它将写入浏览器。
我唯一的另一个选择是使用curl来请求页面,但这似乎很愚蠢,因为我可以从输出缓冲区得到它。我只是不希望HTML发送到浏览器,因为我设置标题告诉浏览器期望PDF。
要清楚,这就是我想要完成的事情(按照我想要完成的顺序):
output->get_output()
的返回值传递给我的dompdf库我认为没有办法根据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()
进行对话以实现这一目标。
答案 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中,这就是为什么它没有找到你。