16

私は、ユーザーが請求書やその他の表形式のデータのPDFコピーを生成できるようにする方法に取り組んでいます。これを行うために、私はdompdfをCIで使用できるライブラリにラップし、CIの戻り値に基づいてPDFを生成するメソッドを作成しましたoutput->get_output()ラッパーはGithubのこれに似ています。

load->view()問題は、ビュー(およびPDFに必要なHTML / CSS)をブラウザに書き込む以外のCIの出力クラスに取り込む方法がわからないことです。

私の他の唯一の選択肢は、curlを使用してページを要求することですが、出力バッファーから正しく取得できるため、これを行うのは非常にばかげているようです。ブラウザにPDFを期待するように指示するヘッダーを設定しているので、HTMLをブラウザに送信したくないだけです。

明確にするために、これは私が達成したいことです(私がそれを達成したい順序で):

  1. ビューを表示する準備をするために通常行うすべてのことを行います
  2. ビューをCI出力クラスにロードしますが、表示はしません
  3. の戻り値output->get_output()を私のdompdfライブラリに渡します
  4. 適切なヘッダーを設定します
  5. PDFをブラウザに送信するdompdfメソッドを実行します

出力クラスのドキュメントに基づいてステップ2を実行する方法がわかりません。

ビューを表示せずに出力クラスに取り込むことは可能ですか?もしそうなら、どのように?CI2.0.3を使用しています。

編集

非常に役立つAnthonySterlingは、ビューをTRUEにレンダリングするのではなく、文字列を返すように指示する3番目の引数を設定することで、ローダークラスから必要なものを取得できると指摘しました。例えば:

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

そして、パーシャルをロードする必要がないので、それは私の特定のインスタンスではより良いでしょう。ただし、これはまだ有効で(私が思うに)興味深い質問です。おそらく、パーシャルがたくさんある場合は、OBから同じものを取得できるかどうかを知ることも便利です。それらは連結することができますが、うんざりです。

出力クラスが何もレンダリングしないようにすることができるはずです(そうでなければ、なぜget_output()存在するのですか?)ので、それが知っているすべてのもので何か他のことを行うことができます。私はそれを実現する方法を見つけることができません。

編集2

私が何をしたいのかを示し、次に私が実際に何をしたいのかを説明することによって、私が何をしたいのかを示すいくつかの疑似(しかし現実からそう遠くない)コード。

次の名前のモデルを使用してgenpdf($id)名前が付けられたコントローラーにパブリックメソッドがあるとします。invoiceinv

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ビューの結果を解析して文字列として提供するように依頼します。これを、ヘッダーを設定してPDFをブラウザーに送信するdompdfラッパーの関数に渡します。

これは、出力バッファー自体を取得するだけで簡単に実行できるように見えました(ヘッダーを正しく設定した後など)。

または、部分的にロードするたびに、出力クラスappend_output()を連続して呼び出す必要がありますか?

多数のモデルをロードする複数のメソッドが連携してこれらを生成する必要があるため(後から付け加えて使用します)、すべてを収集して出力クラスから直接取得したいと考えていました。それを実現するために、私は少しずつ話をしなければならないのかもしれませoutput->append_output()ん。

4

1 に答える 1

10

...つまり、正しく理解できますか?最終出力全体(ビューだけでなく)を文字列として取得し、ユーザーに表示したくないですか?なぜコントローラーの_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を実行する方法がわかりません。ビューを表示せずに出力クラスに取り込むことは可能ですか?もしそうなら、どのように?CI2.0.3を使用しています。

controller _output()のドキュメントは、実際にはCIコントローラーのドキュメントに含まれているため、わかりませんでした。

于 2012-09-08T11:32:45.797 に答える