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

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

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

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

Чтобы быть ясным, это то, что я хочу выполнить (в том порядке, в котором я хочу его выполнить):

  • Сделайте все, что я обычно делаю, чтобы подготовить представление для отображения
  • Загрузите представление в класс вывода CI, но не отобразите его
  • Передайте возвращаемое значение output->get_output() в мою библиотеку dompdf
  • Установите соответствующие заголовки
  • Выполните мой метод dompdf, который отправит PDF в браузер

Я не вижу никакого способа сделать шаг 2 на основе документации по выходному классу.

Можно ли получить представление в класс вывода без его отображения? Если да, то как? Я использую CI 2.0.3.

Edit

Очень полезный Anthony Sterling указал, что Я могу просто получить то, что хочу от класс загрузчика, установив третий аргумент, говорящий ему, чтобы вернуть строку, а не отображать представление в TRUE. Например:.

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

И это будет лучше в моем конкретном случае, так как мне не нужно загружать частичные. Тем не менее, это по-прежнему актуальный и (я думаю) интересный вопрос, было бы также полезно знать, могу ли я получить то же самое от OB, возможно, если бы у меня была куча партикулов. Это могут быть конкатенированные, но yuck.

Кажется, я должен уметь заставить выходной класс ничего не отображать (иначе, почему существует 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 в браузер.

Казалось бы, это было бы легко сделать, просто получив сам буфер вывода (после правильной настройки заголовков /etc ).

Или мне просто нужно вызвать класс вывода append_output() последовательно с каждой частичной загрузкой?

Несколько методов, загружающих множество моделей, должны работать вместе, чтобы сгенерировать их (они идут как запоздалая мысль), поэтому я надеялся собрать все это и получить его непосредственно из выходного класса. Может быть, мне просто нужно постепенно поговорить с output->append_output(), чтобы это произошло.

Ответы

Ответ 1

... так что - правильно ли я понимаю - вы хотите получить весь конечный результат (а не только представление) в виде строки И не отображать его для пользователя? Почему вы просто не перегружаете функцию _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, поэтому она ускользает от вас.