2012-08-31 7 views
15

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):

  1. fare tutto quello che avevo di solito faccio per preparare la vista per la visualizzazione
  2. carico la vista nella classe di uscita IC, ma non visualizzano
  3. passare il valore di ritorno di output->get_output() alla mia biblioteca dompdf
  4. Impostare le intestazioni appropriate
  5. 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.

+0

se le pagine sono memorizzate nella cache, forse puoi ottenerle da lì? – Jurgo

+0

@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). –

+1

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. –

risposta

10

... così - ho capito bene - vuoi ottenere l'intero output finale (non solo la vista) come una stringa E non visualizzarlo all'utente? Perché non sovraccarichi la funzione _output() dei controller?

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 
     } 
} 

Ciò significa che è possibile inviare tutto quello che vuoi per la classe di potenza - ma non viene visualizzato nulla, tranne ciò che si desidera.

Ci sono modi per migliorare questa idea (ad es. Ganci, variabili per attivare/disattivare l'uscita, ecc.) - ma il più semplice sarebbe avere questo controller specifico per il comando pdf_generation.

Non vedo alcun modo di eseguire il passaggio 2 in base alla documentazione della classe di output. È possibile ottenere una vista nella classe di output senza visualizzarla? Se é cosi, come? Sto usando CI 2.0.3.

Il _output regolatore() documentazione è in realtà nel CI controller documentation, ed è per questo che ti sfuggiva.

+0

Questo è _precisamente_ ciò che stavo cercando. Se l'avessi notato prima, non sarei andato giù nella tana del coniglio cercando di estendere la classe di output stessa. Posso capire perché l'hanno messo dove l'hanno fatto, ma alcuni documenti di navigazione che portavano ad esso nei documenti del controller di output avrebbero risparmiato un po 'di tempo :) –

+0

sì - lo sapevo solo da un altro progetto. BTW - il tuo involucro della libreria dompdf è qualcosa che potresti essere interessato a condividere? Sto letteralmente per usarlo in uno dei miei progetti di CI. Se è così, la mia email è nella mia biografia - se non è così - capisco - ho pensato di chiedere e tentare la fortuna;) – Laurence

+0

Ho dato un link a quello che ha ispirato quello che ho scritto. È su Github. Posso condividere l'attuale wrapper? No, non è un progetto aperto, ma ho passato letteralmente dieci minuti a scriverne uno in modo da avere lo stesso inizio che ho fatto. Inoltre, ho messo una taglia su questo che sta andando a modo tuo domani. –