私は、ユーザーが請求書やその他の表データのPDFコピーを生成できるようにするために取り組んでいます。これを行うために、dompdfをCIで使用できるライブラリにラップし、CIの戻り値に基づいてPDFを生成するメソッドを作成しました。output->get_output()
ラッパーはthis one on Githubに似ています。データを表示せずにCodeigniter出力クラスに渡すことはできますか?
問題は、ブラウザに書き込む予定のload->view()
以外のCIの出力クラスに、ビュー(およびPDFに必要なHTML/CSS)を取得する方法がわかりません。
私の唯一の選択肢は、ページを要求するためにcurlを使用することですが、出力バッファからすぐに取得できるので、これは愚かなことです。 HTMLをブラウザに送信したくないのは、ブラウザにPDFを期待するようにヘッダを設定しているからです。
明確にすること、これは私が(私はそれを達成したいという順序で)達成したいものです。
- 私は正常に表示
- ロード用のビューを準備するために行うだろうと全力を尽くしますCIの出力クラスへのビューではなくは
- は、適切なヘッダ
- 設定し、私のDOMPDFライブラリ
- に
output->get_output()
の戻り値を渡しトンを送信する私のDOMPDFメソッドを実行し、それを表示します彼へのPDFファイル
output class documentationに基づいてステップ2を行う方法はありません。
出力クラスを表示せずに表示することはできますか?もしそうなら、どうですか?私はCI 2.0.3を使用しています。
編集
非常に参考Anthony Sterlingは、文字列を返すのではなくTRUEにビューをレンダリングするためにそれを伝える第三引数を設定することにより、そのI can just get what I want from the loader classを指摘しました。例:部分的な読み込みをする必要がないため、私の特定のインスタンスではこれより優れています。しかし、これはまだ有効な(私は)興味深い質問ですが、OBから同じものを得ることができるかどうかを知ることは、おそらく便利です。はには部分的な束があります。それらは連結することができますが、うんざりです。
出力クラスが何もレンダリングされないようにする必要があるようですが(他には、なぜget_output()
が存在するのですか)、私はそれが知っているすべてで何か他のことを行うことができます。私はそれを実現させる方法を見つけることができません。
編集2
いくつかの擬似(しかし、そう遠くない現実から)コード私がやったことを示すと、私は実際に行うにを望んでいたものを説明することで、私が行うことを望んでいることを示します。
はのは、私がinv
という名前のモデルを使用してinvoice
という名前のコントローラにパブリックメソッドgenpdf($id)
を持っているとしましょう:
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()
に話をしなければならないかもしれません。
ページがキャッシュされている場合、おそらくそこから取得できますか? – Jurgo
@Jurgo残念なことに、ページ自体はキャッシュできません(おそらく、おそらく可能ですが、時間が非常に短いため、確実に動作しません)。 –
私はこれで何が起きているのか理解できません。どうやら出力クラス '_display'はコントローラメソッドの最後で自動的に呼び出されます(私は思います)。あなたがコントローラメソッドの最後のステップとして 'exit'を実行した場合、関数は呼び出されず、' $ this-> output-> get_output() 'を期待通りにエコーすることができます。ただし、出力クラスで設定したヘッダーは送信されません(プロファイラーのようなものは実行されません)ので、解決策ではありません。 –