Могу ли я передавать данные в класс вывода 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, поэтому она ускользает от вас.