0

CakePHP 1.3を使用すると、メソッドsingle_invoice($ customer_id)を持つ既存のInvoicesControllerがあり、通常の使用ですべてうまく機能します。ただし、ケーキシェルを使用して同じことを行い、cronジョブとしてビルドしたいと思います。

シェルを作成しましたが、cronジョブとして実行されるので、問題はありません。問題は、cronjobからビューをレンダリングできないことです。基本的に、これが私がこれまでに持っているものです:

class InvoiceCreationShell extends Shell {

    var $uses = array('Institution');

    function main()
    {
        $institutions = $this->Institution->find('all');

        foreach ($institutions as $institution)
        {
            App::import('Core', 'Controller');
            App::import('Controller', 'Invoices');

            $Invoices = new InvoicesController;
            $Invoices->constructClasses();

            $invoice = $Invoices->single_invoice();

            $pdf = create_pdf($invoice);

            file_put_contents($pdf);
        }
    }
}

レンダリングされたビューのコンテンツが$invoiceパラメーターを介して返されるようにしたいと思います。

4

2 に答える 2

1

PHP環境がApacheやNginxなどのWebサーバーを介して呼び出される環境とは異なるCLIアプリケーションにシェルが使用されるため、これを行うことはできません。

ただし、既存のWebアプリケーション機能を引き続き使用でき、これには2つのオプションがあります。

  1. Controllerオブジェクトを初期化します

    次のコード例は、CakePHP>=2.xの場合です。

    申し訳ありませんが、最初は質問が1.3についてであることがわかりませんでした。その場合、ポイント2には良い提案があります。また、CakePHP1.3でControllerオブジェクトを初期化する方法もあります-これはたとえばです。

    この場合、それは実際に請求書の生成がどのように実装されているかに依存します。ビュー部分は「問題外」であることを覚えておいてください。したがって、変数にレンダリングしてから、その変数からpdf(たとえば)を作成しても、それを取得することができます。秘訣は、シェルでコントローラーオブジェクトを初期化する方法です。

    まず、必要なクラスを含めます。

    App :: import('Controller'、'Controller'); App :: import('Controller'、'initializedController');

    シェル/タスクに変数を設定します。

    プライベート$initializedController;

    それで:

    $ this-> initializeController = new initializeController(new CakeRequest('/')、new CakeResponse()); $ this-> initializeController->constructClasses(); $ this-> initializeController-> startupProcess();

これで、コントローラーのすべてのメソッドを呼び出すことができます。

2.既存のWebAppにHTTPリクエストを送信します

これは、CakePHP独自のHttpSocketクラスまたはGuzzleなどのリクエストライブラリを介して実現できます。

于 2012-11-22T09:50:21.387 に答える
0

IRCだけでなく、ここに投稿して、多くの人と話をした後、シェルからのビューを使用することは不可能であるという結論に達しました。だからここに私が私の問題を解決した方法があります:

ビューをシェルから出力しようとする代わりに、代わりにコントローラー内からビューをレンダリングしました。これを解決するためにコントローラーがどのように見えるかのサンプルを次に示します。

class InvoicesController extends AppController {

    function single_invoice($institution_id)
    {
        /* Do stuff */

        return $this->render('single_invoice', 'invoice_layout');
    }
}

これにより、シェルはレンダリングされたビューのコンテンツを$ invoiceパラメーターでキャプチャし、それをpdfジェネレーターに渡すことができました。

また、$ is_shellのsingle_invoiceアクションに、表示されていないパラメーターを追加しました。次に、戻り値$ this-> render...を"if($ is_shell){"チェックで囲み、シェルで使用されている場合にのみレンダリングします。

于 2012-11-22T02:22:20.830 に答える