Могу ли я передать данные в выходной класс Codeigniter без его отображения?

я работаю над тем, чтобы пользователи могли создавать PDF-копии счетов-фактур и других табличных данных. Для этого я завернул dompdf в библиотеку, которую я могу использовать с CI и создал метод, который будет генерировать PDF на основе возвращаемого значения CI output->get_output(). Обертка похожа на этот на Github.

проблема в том, что я не могу понять, как получить представление (и HTML / CSS, необходимое для PDF) в выходной класс CI чем load->view(), который собирается написать в браузер.

мой единственный другой выбор - использовать curl для запроса страницы, но это кажется настолько глупым, поскольку я могу получить его прямо из выходного буфера. Я просто не хочу, чтобы HTML отправлялся в браузер, так как я устанавливаю заголовки, сообщающие браузеру ожидать PDF.

чтобы быть ясным, это то, что я хочу сделать (что я хочу сделать это):

  1. делать все, что я обычно делаю, чтобы подготовьте представление для отображения
  2. загрузите представление в выходной класс CI, но не отобразите его
  3. передать возвращаемое значение output->get_output() в мою библиотеку dompdf
  4. установить соответствующие заголовки
  5. выполните мой метод 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, вот почему он ускользает от вас.