Sto lavorando per consentire agli utenti di generare copie PDF di fatture e altri dati tabulari. Per fare questo, ho spostato dompdf in una libreria che posso utilizzare con CI e ho creato un metodo che genererà un PDF basato sul valore restituito da CI output->get_output()
. Il wrapper è simile a this one on Github.Posso passare i dati alla classe di uscita Codeigniter senza visualizzarlo?
Il problema è che non riesco a trovare un modo per ottenere la vista (e HTML/CSS necessari per il PDF) nella classe di output CI diversa da load->view()
, che sta per scrivere sul browser.
La mia unica altra scelta sarebbe quella di usare l'arricciatura per richiedere la pagina, ma mi sembra così sciocco da fare perché riesco ad ottenerlo direttamente dal buffer di output. Semplicemente non voglio che l'HTML sia inviato al browser, dal momento che ho impostato le intestazioni dicendo al browser di aspettarsi un PDF.
Per essere chiari, questo è quello che voglio realizzare (nell'ordine che voglio realizzarlo):
- fare tutto quello che avevo di solito faccio per preparare la vista per la visualizzazione
- carico la vista nella classe di uscita IC, ma non visualizzano
- passare il valore di ritorno di
output->get_output()
alla mia biblioteca dompdf - Impostare le intestazioni appropriate
- eseguire il mio metodo dompdf che invierà t PDF al browser
Non vedo alcun modo di eseguire il passaggio 2 in base allo output class documentation.
È possibile ottenere una vista nella classe di uscita senza visualizzarla? Se é cosi, come? Sto usando CI 2.0.3.
Modifica
Il molto utile Anthony Sterling osservare che I can just get what I want from the loader class impostando il terzo argomento dicendogli di restituire una stringa piuttosto che rendere la visualizzazione su TRUE. Es .:
$lotsaHtml = $this->load->view('fooview', $somearray, TRUE);
E sarebbe meglio nel mio caso particolare poiché non ho bisogno di caricare i partial. Tuttavia, questa è ancora una domanda valida e (penso) interessante, sarebbe anche utile sapere se potrei ottenere lo stesso dall'OB, forse se ho fatto avere un gruppo di partial. Quelli potrebbero essere concatenati, ma schifo.
Sembra che dovrei essere in grado di ottenere la classe di output per non eseguire il rendering (altrimenti, perché esiste get_output()
?) Così posso fare qualcos'altro con tutto ciò che sa. Non riesco a trovare un modo per farlo accadere.
Edit 2
Alcuni pseudo (ma non lontano dalla realtà) il codice che illustra quello che spero di fare, mostrando quello che ho fatto e poi spiegare quello che realmente volevo fare.
Diciamo che ho un metodo pubblico genpdf($id)
in un controller di nome invoice
utilizzando un modello di nome 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);
}
che è quasi identico al codice che ho che funziona in questo momento. Lì, chiedo al loader di analizzare e fornirmi i risultati della vista pdfgen
come stringa, che passo alla funzione nel mio wrapper dompdf che imposta le intestazioni e invia il PDF al browser.
Sembrava proprio che sarebbe stato facile farlo semplicemente recuperando il buffer di output (dopo aver impostato correttamente le intestazioni/etc).
Oppure devo solo chiamare la classe di uscita append_output()
in successione con ogni carico parziale?
Più metodi di caricamento di una pletora di modelli devono collaborare per generare questi (stanno entrando come un ripensamento), quindi speravo di raccogliere tutto e recuperarlo direttamente dalla classe di output. Potrebbe essere che devo solo parlare gradualmente a output->append_output()
per farlo accadere.
se le pagine sono memorizzate nella cache, forse puoi ottenerle da lì? – Jurgo
@Jurgo Purtroppo no, le pagine stesse non possono essere memorizzate nella cache (beh, forse potrebbero, ma per un tempo _ estremamente breve che non funzionerebbe in modo affidabile). –
Non riesco a capire cosa succede con questo. In qualche modo, la classe di output '_display' viene chiamata automaticamente alla fine di un metodo di controllo (penso). Se si esce come ultimo passaggio del metodo del controller, la funzione non viene richiamata e si può echo $ this-> output-> get_output() 'come previsto, gestendo l'output" manualmente "senza perdite. Tuttavia, non verranno inviate nemmeno le intestazioni impostate con la classe di output (e le cose come il profiler non verranno eseguite), quindi non è una soluzione solo un indizio. –