2012-08-31 6 views
15

私は、ユーザーが請求書やその他の表データのPDFコピーを生成できるようにするために取り組んでいます。これを行うために、dompdfをCIで使用できるライブラリにラップし、CIの戻り値に基づいてPDFを生成するメソッドを作成しました。output->get_output()ラッパーはthis one on Githubに似ています。データを表示せずにCodeigniter出力クラスに渡すことはできますか?

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

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

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

  1. 私は正常に表示
  2. ロード用のビューを準備するために行うだろうと全力を尽くしますCIの出力クラスへのビューではなくは
  3. は、適切なヘッダ
  4. 設定し、私のDOMPDFライブラリ
  5. 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()に話をしなければならないかもしれません。

+0

ページがキャッシュされている場合、おそらくそこから取得できますか? – Jurgo

+0

@Jurgo残念なことに、ページ自体はキャッシュできません(おそらく、おそらく可能ですが、時間が非常に短いため、確実に動作しません)。 –

+1

私はこれで何が起きているのか理解できません。どうやら出力クラス '_display'はコントローラメソッドの最後で自動的に呼び出されます(私は思います)。あなたがコントローラメソッドの最後のステップとして 'exit'を実行した場合、関数は呼び出されず、' $ this-> output-> get_output() 'を期待通りにエコーすることができます。ただし、出力クラスで設定したヘッダーは送信されません(プロファイラーのようなものは実行されません)ので、解決策ではありません。 –

答えて

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を実行する方法はありません。それを表示せずに出力クラスへのビューを取得することは可能ですか?もしそうなら、どうですか?私はCI 2.0.3を使用しています。

コントローラの_output()ドキュメントは、実際にはCI controller documentationにあります。そのため、あなたはそれを免れました。

+0

これは私が探していた_precisely_です。私が最初に気付いたのであれば、出力クラスそのものを拡張しようとしているウサギの穴には行っていないでしょう。なぜ彼らは彼らがどこに置いたのか見ることができますが、アウトプットコントローラのドキュメントでそれにつながるいくつかのブレッドクラムは時間を節約しました:) –

+0

ええ - 私は他のプロジェクトからそれを知っていました。 BTW - あなたのdompdfライブラリのラッパーで、共有に興味がありますか?私は文字通り、私のCIプロジェクトの1つでそれを使用しようとしています。もしそうなら、私の電子メールは私のバイオにあります - もしそうでなければ - 私は理解しています - 考えました。私は幸運を尋ねて試しました;) – Laurence

+0

私が書いたものにインスパイアされたものへのリンクを与えました。それはGithubにある。実際のラッパーを共有することはできますか?いいえ、それはオープンなプロジェクトではありませんが、文字通り10分かけて書くことができました。また、私は明日あなたの道を行くこれに恩恵をかけます。 –

関連する問題