Могу ли я передать данные в выходной класс Codeigniter без его отображения?
я работаю над тем, чтобы пользователи могли создавать PDF-копии счетов-фактур и других табличных данных. Для этого я завернул dompdf в библиотеку, которую я могу использовать с CI и создал метод, который будет генерировать PDF на основе возвращаемого значения CI output->get_output()
. Обертка похожа на этот на Github.
проблема в том, что я не могу понять, как получить представление (и HTML / CSS, необходимое для PDF) в выходной класс CI чем load->view()
, который собирается написать в браузер.
мой единственный другой выбор - использовать curl для запроса страницы, но это кажется настолько глупым, поскольку я могу получить его прямо из выходного буфера. Я просто не хочу, чтобы HTML отправлялся в браузер, так как я устанавливаю заголовки, сообщающие браузеру ожидать PDF.
чтобы быть ясным, это то, что я хочу сделать (что я хочу сделать это):
- делать все, что я обычно делаю, чтобы подготовьте представление для отображения
- загрузите представление в выходной класс CI, но не отобразите его
- передать возвращаемое значение
output->get_output()
в мою библиотеку dompdf - установить соответствующие заголовки
- выполните мой метод dompdf, который отправит PDF в браузер
я не вижу никакого способа сделать шаг 2 на основе выход класса документация.
можно ли получить представление в выходной класс не показывая его? Если да, то как? Я использую CI 2.0.3.
редактировать
очень полезным Энтони Стерлингового указал, что я могу просто получить то, что хочу от класса loader установив третий аргумент, указывающий ему возвращать строку, а не отображать представление в TRUE. Например:
$lotsaHtml = $this->load->view('fooview', $somearray, TRUE);
и это было бы лучше в моем конкретном случае, так как мне не нужно загружать частичные файлы. Тем не менее, это все еще действительный и (я думаю) интересный вопрос, было бы также удобно узнать, могу ли я получить то же самое от OB, возможно, если я сделал есть куча фрагментов. Они могут быть сцеплены, но фу.
кажется, что я должен быть в состоянии заставить выходной класс ничего не отображать (иначе, почему ? так что я могу сделать что-то еще со всем, что он знает. Я просто не могу найти способ сделать это.
изменить 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 в браузер.
казалось, что это будет легко сделать, просто получив сам выходной буфер (после правильной установки заголовков / etc).
или мне просто нужно вызвать выходной класс append_output()
последовательно с каждой частичной нагрузкой?
несколько методов загрузки множества моделей должны работать вместе, чтобы генерировать их (они собираются как afterthought), поэтому я надеялся просто собрать все это и получить его непосредственно из выходного класса. Может быть, мне просто нужно постепенно поговорить с output->append_output()
чтобы это произошло.
1 ответов
...Итак-правильно ли я понимаю - вы хотите получить весь конечный результат (а не только представление) в виде строки и не отображать его пользователю? Почему бы вам просто не перегрузить функцию controllers _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.
документация controller _output () фактически находится в документация по контроллеру CI, вот почему он ускользает от вас.